谈大数据就必须谈Hadoop,这就是Hadoop在大数据领域的地位。Hadoop自身及生态发展都很快,目前已经到3.x。本文先谈一些基础的东西,“键值对的思考”小节是本文比较有意思和值得阅读的内容。

(一)Hadoop起源

Hadoop起源于Google在2003年和2004年发表的两篇论文,GFS和MapReduce。Hadoop的项目发起者Doug Cutting当时正在研究开源的网页搜索引擎Nutch,论文引起了Doug的强烈共鸣,不久Hadoop就以Lucence子项目的形式出现了。

Hadoop无论是论文发表者,还是项目建设者,都是“网页搜索引擎”为背景,也是它的重要应用领域的。现在Hadoop由一系列子项目构成,使用范围早已不限于网页搜索引擎。但如果注意到这一点,有助于理解Hadoop的许多设计选择。

(二)Hadoop基础

l  前提

单机的存储能力和计算能力有限,无法支撑问题域的数据量和计算量。单机的可靠性有限,达不到目标应用对可靠性的要求。通过网络连接大量计算机,协同完成任务。

l  理念

通过分片(split)解决存储容量问题。通过复制解决存储可靠性问题。移动代码而不是移动数据。在Hadoop之前主流计算模型全部是“移送数据”。Hadoop如此选择原因(1)代码体积远小于数据,(2)面向一次存储多种类型任务计算的场景。

l  定义

Hadoop是一种为大量数据(BigData) 和 大量计算(Big Computation-笔者起的名字) 而建设的信息技术基础设施。Hadoop负责处理分布式存储和分布式计算的结构性问题,如数据分配与复制、任务调度与配合、结果归并、例外处理与监控管理等,开发者就可以专注于思考和解决业务问题。

l  构成

Hadoop的核心是HDFS和MapReduce。HDFS是一个以向外扩展的方式,存储海量数据的文件系统。它通过副本冗余提升可靠性、以时延为代价优化吞吐量。MapReduce是一个起源于函数编程的数据处理范式,主要包括两个阶段,映射阶段(Map)和化简阶段(Reduce)。MapReduce采用了与HDFS相同的体系结构,可以叫做主-从节点(Master-Slave),或者管理-工作节点(Manager-Worker),HDFS叫作NameNode-DataNode,MapReduce叫做JobTracker-TaskTracker,并且数据和计算节点通常共用物理计算机而非分开。

l  用途

Hadoop适合海量数据的批量处理任务。由于在作业分派、管理、协作需要的内务管理如Shuffle等需要一定的时间开销,它并不适合要求低延时任务如OLTP、网站查询等。注:Google通过网络爬虫获取到网页数据,用MapReduce对大数据进行处理,生成网页索引,然后索引被一组MySQL服务器用于为用户提供即时搜索服务。

(三)键值对的思考

MapReduce采用Key-Value(KV)作为通用的数据模型,这种模型是经过深入思考、仔细权衡的结果,可以说KV在Hadoop计算模型中巧妙地占据着核心地位。

hadoop开发应用 hadoop应用开发基础_数据

l  事物的标识

Key可作为一个事物的通用“符号”、“标识”、“引用”,对应的Value是事物本身、特征、内容,是一种广泛适用的通用数据模型。例如我们聊天提到“张三”是指代张三这个人,计算机存贮符号“张三”可能是张三信息的引用或张三的符号。

在计算机软件领域,变量及其存储的内容、对象引用及其对象自身、数据库表主关键字及其数据记录,以及许多的Key-Value数据库系统,“KEY”的叫法不同、实现不同但概念层面是一致的。

l 问题的维度

Key可作为业务目标的分析维度。例如基于人员记录表计算不同性别的人数,KEYIN/VALUEIN对应人员标识和人员信息,KEYOUT/VALUEOUT对应性别标识和性别对应人员数量。

Map负责把数据源维度映射到目标维度,Hadoop负责把目标维度数据汇集到一起(Shuffle),Reduce按照目标维度计算出最终结果。

l  分布的依据

Key可作为数据或计算分布的依据。Key标识的一个事物只能归属于一个计算机节点(事物原子性),同一个Key下多个事物等也只能归属于同一个计算机节点(分布原子性)。不同的Key通过某种方法计算后,基于计算结果(新的Key)归属到相应的计算机节点,计算方法具有简单高效、非集中管理、分布平衡的特点。

Key作为数据分布和计算分布的维度,能很好地用于分布式系统单节点独立性-整体协同性的平衡。分布式系统核心目标是让大量计算机作为一个整体协同工作,方式是计算机节点在完成自己的任务时要尽可能地独立工作。毕竟网络通讯具有带宽小、延迟高、可靠性低、费用高等缺点,应减少使用。个体完全独立工作是不可能的,独立性与协同性是矛盾统一的,类似于标准化与定制化、国际化与本地化之间的关系。独立性差就分工复杂,复杂的分工就会有复杂的协同,导致低效和低可靠的系统。这就是WEB设计中“不共享任何内容”的原则的背后原因。

KV是广泛适用的通用数据模型,在Hadoop分布式计算中,Key会被用作标识、任务计算的维度和数据分布的依据。用关系数据库举例,事物的标识是PrimaryKey,问题的维度是Group By (Key),分布的依据是Partition By (Key)。

(四)连接计算(Join)

尽量让数据处理在节点独立完成,减少为完成任务需要的跨节点数据流动是必要的。分布式系统无法完全避免协同,且数据之间的连接(Join)始终是分布式计算的难点, Hadoop平台中主要使用以下方法进行数据连接。

l  分布式缓存

把需要连接的数据缓存到各个计算节点(通常是本地文件),如果数据量不大(例如主数据),这种方式是OK的,但要缓存数据超过单节点容量就不可行了。

l  Reducer连接

多个Mapper任务把需要连接的数据按照指定维度(KEYOUT)组织好(携带数据标签或Mapper标签),统一输出给Reducer节点。Hadoop按照Key组织把它们都组织在一起,这样Reducer拥有要连接的全部数据。

l  预处理和转换

通过各种数据预处理和转换,为MapReduce任务做好各种前序工作,这算不上什么好方法,但许多时候不得已需要这么做。

 (五)Hadoop生态

Hadoop出现以来,生态发展很快,出现了大量关联项目和应用。2.x新设计的新的资源协调器YARN,Hadoop演进成多种处理模型的通用任务处理平台,如流模型、消息模型等。

hadoop开发应用 hadoop应用开发基础_数据_02

l  Hadoop Pipes

为Hadoop提供原生C++的MapReduce接口。

l  Hadoop Streaming

允许任何使用标准输入和标准输出的程序都可以用于Map和reduce任务,如编译的二进制文件、LinuxShell脚本、像Ruby或Python这样的动态语言编写的脚本。Streaming编写的map任务每次从标准输入读取KV对,并将结果输出到标准输出。reduce执行与map同样的操作,这一点与基础Map/Reduce逻辑不同。Streaming不再强调Map/Reduce概念,而是一个流的概念,a->b->c->d多个任务依次进行,每个任务的输入是以key分组的KV对,输出新的KV对。相同的Key会被同一个TaskTracker,以连续的方式接收,但并不会MapReduce那样直接汇集到集合传入Reducer。

l  Hive

Hive由Facebook捐赠,它是建立在Hadoop之上的数据仓库,用HiveQL(非常接近SQL)对存贮在HDFS上的数据进行分析。其基本原理是为数据定义类似于表结构的元数据,把用户写的HiveQL语句转换MapReduce任务在Hadoop集群执行,返回数据给用户。其核心职责类似于SQL语言的查询规划器,也提供了许多扩展增强功能,例如分区等。借助Hive,许多数据分析工作就可以不用写Map/Reduce代码,直接用HiveQL就可完成。

l  Pig

Pig在Hive生态中所处位置与Hive类似,也是简化用户写MapReduce代码。Pig使用的是Pig Latin语言定义数据流形式的流水线,执行与Hive类似的代码生成过程,不如HiveQL受众广泛,但有更细的控制粒度。

l  Sqoop

Sqoop由Cloudera公司捐赠,它是Hadoop/Hive与关系数据库的集成工具,用于关系数据向Hadoop/Hive迁移数据(反向也支持)。

l  Flume

分布式的日志收集系统,把不同类别的数据源导入Hadoop。

l  Hbase

建立在HDFS之上的列数据库,原理来自于Google的BigTable,与MapReduce不同,HBase力求低延时响应。

l  其它

Oozie是工作流调度工具,为MapReduce作业提供调度机制(基于时间或 数据可用性进行调度)

Whir工具并非专为Hadoop设计,简化Hadoop的云部署。

Mahout是基于Hadoop的机器学习算法库。

MRUnit是MapReduce单元测试工具。

Protocol Buffers、Shrift、Avro分别来自Google、Facebook、Doug Cutting跨平台的数据串行化,解决MapReduce跨语言跨平台数据存储格式问题,否则除了文本和二进制,别的语言存储的数据格式用Java写的MapReduce就识别不了。

 ...

(本文完)