公司领导让部门内部结成小组,研究一下Hadoop,并说哪个组做得最好,年终奖有加成。无论奖励与否,多学一点总是好的。
分组那天,阎总作为组长第一个选人,没想到选了我,算是对这将近一年工作态度的一种肯定吧,毕竟能力比我强的人有很多。
上周五演示各个小组的ppt,我们组被评为最优,领导肯定了我们的努力,同事们也肯定了我们的努力,十分开心,将ppt整理了一下,算是对hadoop的一个小结吧,据说年后新的项目可能会用上。
谷歌技术三宝分别是:GFS、MapReduce和BigTable。谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年SOSP的GFS,04年OSDI的MapReduce,和06年OSDI的BigTable。SOSP和OSDI都是操作系统领域的顶级会议,在计算机学会推荐会议里属于A类。SOSP在单数年举办,而OSDI在双数年举办。
Hadoop实际上就是谷歌三宝的开源实现,Hadoop MapReduce对应Google MapReduce,HBase对应Big Table,HDFS对应GFS。区别是谷歌底层是c++,而hadoop底层是用java。
Hadoop是Apache基金会下的一款开源软件,它实现了包括分布式文件系统HDFS和MapReduce框架在内的云计算软件平台的基础架构,并且在其上整合了包括数据库、云计算管理、数据仓储等一系列平台,其已成为工业界和学术界进行云计算应用和研究的标准平台。
现代社会的信息量增长速度极快,这些信息里又积累着大量的数据。预计到2020年,每年产生的数字信息将会有超过1/3的内容驻留在云平台中或借助云平台处理。如何高效地存储和管理这些数据,如何分析这些数据呢?这时候就需要使用Hadoop来处理海量数据。
Hadoop主要用途如下:
1、最简单的,做个数据备份/文件归档地方这利用了Hadoop海量数据的存储能力;
2、数据仓库/数据挖掘:分析web日志,分析用户的行为(如:用使用搜索时,在搜索结果中点击第2页的概率有多大);
3、搜索引擎:设计hadoop的初衷,就是为了快速建立索引;
4、云计算:据说中国移动的大云,就是基于Hadoop的;
5、研究:Hadoop的本质就是分布式计算,又是开源的,有很多思想值得借鉴。
Hadoop的核心组成:一个存储系统(HDFS) + 一个计算系统(MapReduce)。
HDFS
HDFS(Hadoop Distributed File System)分布式文件系统,提供高吞吐量的应用程序数据访问,对外部客户机而言,HDFS 就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件。HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。
图-1是HDFS组成图,其中:ResourceManager负责作业与资源的调度, NodeManager负责container状态的维护,并向RM保持心跳,NameNode是名称节点主要做任务与资源的分配,DataNode是数据节点主要用于数据存储, SecondaryNameNode做镜像的备份与合并。
图-1 HDFS组成
旧版hadoop缺点:
从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce 的 JobTracker/TaskTracker 机制需要大规模的调整来,修复它在可扩展性,内存消耗,线程模型,可靠性和性能上的缺陷。
重构思想:
将JobTracker 两个主要的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控。新的资源管理器全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协调。
从 0.23.0 版本开始,Hadoop 的 MapReduce 框架完全重构。新的 Hadoop MapReduce 框架命名为 MapReduceV2 或者叫 Yarn。
分布式存储如何进行配置?
分布式节点配置路径:/usr/local/hadoop/etc/hadoop/slaves,将机器名写到在slaves中进行分布式节点配置。
图-2为两个节点的配置:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-2 两个节点
通过以下链接可以查看配置好的活跃节点:
http://172.16.3.206:23001/dfsnodelist.jsp?whatNodes=LIVE(局域网IP)
图-3为两个节点的web监控页面截图:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-3 web监控页面
下面设计一个实例来测试HDFS分布式的效率。
设计思路:
1、使用randomwriter利用Map/Reduce把数据随机的写到dfs中,大小1G
2、分别使用1个DataNode和2个DataNode来对随机文件进行排序,比较执行上和时间消耗上的差异
随机写入1G文件:
指令:hadoop jar hadoop-mapreduce-examples-2.2.0.jar randomwriter hdfs://172.16.3.206:9000/sunyf/random
执行如图-4所示:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-4 写入文件
对写入数据进行排序,1个从节点:
指令:hadoop jar hadoop-mapreduce-examples-2.2.0.jar sort hdfs://172.16.3.206:9000/sunyf/random hdfs://172.16.3.206:9000/sunyf/randomoutput1
执行如图-5所示:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-5 1个节点排序
对写入数据进行排序,2个从节点:
指令:hadoop jar hadoop-mapreduce-examples-2.2.0.jar sort hdfs://172.16.3.206:9000/sunyf/random hdfs://172.16.3.206:9000/sunyf/randomoutput2
执行如图-6所示:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-6 2个节点排序
效率分析:
1个从节点耗时:29s GC time elapsed(ms) = 4243
2个从节点耗时:33s GC time elapsed(ms) = 1129
GC time elapsed(ms)表示: 通过JMX获取到执行map与reduce的子JVM总共的GC时间消耗。
效率:分析分布式比单个节点耗时长是因为数据量太小,分布式计算还需要在数据合并处理上花费一定时间,数据越大,分布式计算效率越高。
本来我们打算将randomwriter方法改写10G的文件大小,以便测试,但发现修改之后没有效果,网上也没有给出具体的结论,这里是一个疑点。
举个例子:假如一个人可以在10天内做完做完的项目,交给一个10人的团队去做,那么这个团队可以在少于1天内做完吗?大多数情况下是不可能的,因为一个项目从最初的市场调研、需求分析、系统设计、数据库设计、软件开发、系统测试到最后的上线,一个团队去做的话,中间是需要沟通的、会产生内耗的。但是,假如一个人需要一年才可以完成的项目,你交给一个10人的团队去做,那么很可能会在一个月之内完成,因为只要分工明确,即便有内耗,也会提高很多的效率。
MapReduce
MapReduce 框架的核心步骤主要分两部分:Map 和Reduce。当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。
网上有人用最简短的语言解释MapReduce:
We want to count all the books in the library. You count up shelf #1, I count up shelf #2. That's map. The more people we get, the faster it goes.
我们要数图书馆中的所有书。你数1号书架,我数2号书架,这就是“Map”。我们人越多,数书的速度就更快。
Now we get together and add our individual counts. That's reduce.
现在我们到一起,把所有人的统计数加在一起,这就是“Reduce”。
MapReduce两种流程:
1、Map-Reduce,如图-7所示:
2、Map-Combine-Reduce,如图-8所示:
初识hadoop - 在路上的小海贼 - 笑傲江湖
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-7 MapReduce流程图1 图-8 MapReduce流程图2
combine作用:
1、combine最基本是实现本地key的聚合,对map输出的key进行排序,value进行迭代
2、combine还具有类似本地的reduce功能
3、如果不用combine,那么,所有的结果都是reduce完成,效率会相对低下。使用combine,先完成的map会在本地聚合,提升速度。
举例说明:
Hello World Bye World
Hello Hadoop GoodBye Hadoop
Map和Reduce的执行见图-9至图-13的说明:
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-9 流程一Map
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-10 流程一Reduce
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-11 流程二Map
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-12 流程二Combine
初识hadoop - 在路上的小海贼 - 笑傲江湖
图-13 流程二Reduce
Hadoop测试环境搭建,服务器等条件如表-1所示:
表-1 搭建条件
|
服务器
|
JDK
|
Hadoop版本
|
|
Linux服务器3台
(Ubuntu 12.04.3)
|
OpenJDK 1.7
|
Hadoop 2.2.0
|
我们所使用的Hadoop测试环境,如表-2所示:
表-2 测试环境
|
机器名
|
IP地址
|
作用
|
|
hadoop01
|
172.16.3.206
|
NameNode、
ResourceManager、
SecondaryNameNode
|
|
hadoop02
|
172.16.3.207
|
DataNode、
NodeManager
|
|
hadoop03
|
172.16.3.52
|
DataNode、
NodeManager
|
常用命令:
停止运行
hadoop@hadoop01:/usr/local/hadoop/sbin start-dfs.sh
(JPS会出现NameNode,DataNode,SecondaryNameNode)
启动yarn
hadoop@hadoop01:/usr/local/hadoop/sbin$ start-yarn.sh
(JPS会出现ResourceManager,NodeManager)
HDFS上创建目录
hadoop fs -mkdir hdfs://172.16.3.206:9000/sunyf
将测试文件上传到HDFS
hadoop fs -put 1.txt /sunyf/input
将测试结果下载到本机路径
hadoop fs -get /sunyf/ouput234/part-r-00000 /home/hadoop/sunyf/output/part-r-00000
运行wordcount方法
hadoop jar hadoop-mapreduce-examples-2.2.0.jar wordcount hdfs://172.16.3.206:9000/sunyf/input hdfs://172.16.3.206:9000/sunyf/output
查看运行结果
hadoop fs -cat hdfs://172.16.3.206:9000/sunyf/ouput/part-r-00000
实例设计思路:
1、选择一部长篇小说《哈利波特》英文版
2、写程序过滤掉标点符号
3、使用wordCount程序统计词频
4、筛出人名做统计分析
执行结果如图-14所示:
图-14 人名出现频率统计图
部分参考资料:
http://hadoop.apache.org
http://www.oschina.net/p/hadoop
http://my.oschina.net/chainlong/blog/182944
http://my.oschina.net/leejun2005/blog/82587
http://blog.csdn.net/opennaive/article/details/7514146
http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/
http://blog.csdn.net/heyutao007/article/details/5890103
网友评论