对于大数据,串行的处理方式难以满足人们的要求,现在主要采用并行计算方式。现有的并行计算可以分为两种:
- 细粒度的并行计算。这里细粒度主要是指指令或进程级别,由于GPU比CPU拥有更强的并行处理能力,人们将一些任务交给GPU并行处理,一些GPU制造商也推出了方便程序员使用的编程模型,如NVIDIA推出的CUDA等。
- 粗粒度的并行计算。这里粗粒度指的是任务级别,人们将工作分布到不同机器中执行,最近流行的网格计算、分布式计算都属于粗粒度级别。
由于现有GPU编程模型还未完善,开发人员需要考虑大量的并行细节且任务较重,因此未得到流行。而一些新推出的分布式编程模型以其简单、方便等特点受到开发人员的欢迎并变得炙手可热,这里我们主要讨论粗粒度的并行计算。
由于大数据都分布在集群中,因此对数据的处理和分析需要在集群中进行,但是在多台机器上对分布式数据进行分析会产生巨大的性能开销,即使采用千兆比特或万兆比特带宽的网络,随机读取速度和连续读取速度都会比内存慢几个数量级。但是,现在高速局域网技术使得网络读取速度比硬盘读取要快很多。因此,将数据存储在其他节点上比存储在硬盘上的性能要好,而且还可以在多个节点上并行处理数据集。
对大数据分布处理会带来一些问题,首先就是节点间通信对并行处理的代价,一些操作如搜索、计数、部分聚集、联合等可以在每个节点上独立执行。单个节点处理后的结果需要合并,因此节点间的通信是不可避免的,但是并不是所有的聚集操作都能分散成可以独立操作的子操作,如求得所有数据的中位数。不过,大部分重要的操作都有分布式算法来减少节点间的通信。
节点间负载不平衡也是出现的主要问题。理想情况下,每个节点的计算量是相同的,否则工作量最大的节点将决定整个任务的完成时间,这个时间往往比负载平衡情况下的时间要长。最坏的情况下,所有的工作都集中在某个机器上,无法体现出并行的优势。数据在节点间如何分布对负载平衡产生影响,例如,一个包含1000个传感器10年内的观测值的数据集,传感器每15秒收集一次数据,这样一个传感器10年内将产生两千多万个观测值。我们将数据根据传感器并按时间顺序分布到10个节点上,每个节点包含100个传感器的观测值,如果对某个传感器收集的数据进行操作,那么大部分节点将处于闲置状态。如果先按时间顺序对数据进行分布,那么根据时间的操作也会造成负载不平衡。
分布式系统的另一个问题就是可靠性。就像拥有四个引擎的飞机比拥有两个引擎的飞机更容易出现引擎故障一样,一个拥有10个节点的集群很容易出现节点故障。这可以通过在节点间复制数据来解决,对数据进行复制,既可以提高数据分析的效率,也可以通过冗余来应对节点故障。当然,数据集越大,对数据副本的管理和维护也越困难。
目前对大数据处理和分析的应用更多的是集中在数据仓库技术、预测分析、实时分析、商业智能、数据统计等方面。这些需求对企业有巨大的帮助。
将PB级的数据存储起来并不是一件困难的事情,但是如何进行高效的存储并不简单。首先要考虑的是,如何组织数据的结构使其能够更多地支持上层的软件,而不需要对数据进行转储和重新组织。当数据需要发生转换的时候避免因转储、抽取、整合等而带来的延迟。
有效的预测分析技术,尤其是实时分析对企业的决策有很大的帮助。例如,超市可以根据庞大的用户历史消费记录来预测某一用户下次购买商品的倾向,从而在结账的时候可以专门针对某一用户打印其关心的优惠券。足球队管理层可以根据用户的购票记录为其推荐更人性化的月票、季票等套票。
目前,像SAS、SPSS等传统数据分析软件因其数据处理能力受限于单机的计算能力,对大数据的处理显得力不从心。IBM Netezza等新兴的数据分析软件往往需要支付昂贵的许可费用,因此Hadoop,MapReduce,R等开源的大数据分析工具受到越来越多的关注和青睐。
相比于商业软件,开源软件完全免费且不需要支付昂贵的许可费用,另外在其背后还拥有庞大的开源团队的支持。但是能否完全跟得上市场的需求和发展速度是关键性的问题,毕竟这些软件不像商业软件那样有巨大的利益驱动推动它们的发展。