1.3 大数据应用及编程模型
大数据应用一般是指为满足业务需求,运行在大数据处理框架之上,对大数据进行分布处理的应用,如Hadoop MapReduce应用和Spark应用。大数据应用在工业界和学术界广泛存在,如网页索引的构建、日志挖掘、大数据SQL查询、机器学习、社交网络图分析等。
针对不同的大数据应用,需要解决的问题是如何将其转化为可以运行在特定大数据处理框架之上的程序。为了解决这一问题,大数据处理框架为用户提供了简单且具有扩展性的编程模型。没有任何并行和分布式应用开发经验的用户也可以通过简单的编程模型来开发数据密集型应用。目前通用的大数据处理框架,如Hadoop、Dryad和Spark,都是以MapReduce编程模型为基础的。MapReduce编程模型可以被简单地表示为
map阶段:map<;K1,V1>;⇒list<;K2,V2>;
reduce阶段:reduce<;K2,list(V2)>;⇒list<;K3,V3>;
在图1.1中,WordCount应用使用MapReduce框架来统计一篇英文文章中每个单词出现的次数。我们首先将文章(Page)按行拆分为多个分块(input split),图1.1中的Page被拆分为4个分块,每个分块有两行,每行包含行号(lineNo)和该行的内容(line)。在map阶段,我们对每一行执行map(K=lineNo,V=line)函数。该函数对line进行分词,并统计line中每个word(w)出现的次数。例如,line 1中包含5个w1和2个w2,就输出两个键值对(record),即<;w1,5>;和<;w2,2>;。在reduce阶段,我们将包含相同词的record聚合在一起,形成<;word,list(count)>;。例如,将多个<;w1,count>;record聚合为<;w1,list(5,1,9,6)>;,之后对list中的值(Value)进行累加,得到并输出<;w1,21>;。
从计算框架来说,Hadoop支持标准的MapReduce编程模型,并得到了广泛使用。然而,MapReduce编程模型也存在一些局限性。例如,该模型不能直接对多张表格数据进行join()。为了提高MapReduce编程模型的通用型,Dryad和Spark设计了一些更一般的、对用户更友好的操作符(operator),如flatMap()、groupByKey()、reduceByKey()、cogroup()和join()等。这些操作基于map()和reduce()的函数式编程思想构建,可以表达更复杂的数据处理流程。
图1.1 WordCount应用的MapReduce执行流程
除了基于如上所述的编程模型开发大数据应用,用户也可以借助构建于框架之上的高层语言或者高层库来开发大数据应用。例如,在Hadoop MapReduce之上,Yahoo!开发了SQL-like的Pig Latin语言[12],可以将SQL-like脚本转化成Hadoop MapReduce 作业;Facebook开发的分布式数据仓库Hive[13]构建在Hadoop MapReduce之上,也可以将类SQL查询分析语言转化成Hadoop MapReduce作业;Apache Mahout[14]提供了基于Hadoop MapReduce 的机器学习库;在Spark之上,GraphX[15]提供了面向大规模图处理的库,MLlib[16]提供了面向大规模机器学习的库,Spark SQL[17]提供了基于Spark的SQL查询框架及语言。