原理篇:
1. hadoop2.x的各个模块一句话简单介绍
1)hadoop common:为hadoop其它模块提供支持的公共工具包;
2)hdfs:hadoop分布式文件系统;
3)yarn:任务调度和集群资源管理框架;
4)mapreduce:用于处理大数据集的框架,可扩展和并行。
2. hdfs数据上传原理
1) client端发送一个加入文件到hdfs的请求给namenode。
2) namenode告诉client端怎样来分发数据块以及分发到哪里;
3) client端把数据分为块(block)然后把这些块分发到datanode中。
4) datanode在namenode的指导下复制这些块,保持冗余。
能够在解说的时候,拿仅仅笔和纸画下:
tips:
a. namenode之存储文件的元数据,而不存储详细的数据;
b. hdfs federation: 解决ha单点故障问题,支持namenode水平扩展,每一个namenode相应一个namespace。
3. mapreduce概述
1)map和reduce任务在nodemanager节点上各自有自己的jvm;
2)全部的mapper完毕后。实时的key/value对会经过一个shuffle和sort的阶段,在这个阶段中全部共同的key会被合并,发送到同样的reducer中;
3)mapper的个数依据输入的格式确定,reducer的个数依据job作业的配置决定;
4)partitioner分区器决定key/value相应该被送往哪个reducer中。
5)combiner合并器能够合并mapper的输出,这样能够提高性能;
4. map--》shuffle、sort--》reduce
map阶段:
1) inputformat确定输入数据应该被分为多少个分片。而且为每一个分片创建一个inputsplit实例;
2) 针对每一个inputsplit实例mr框架使用一个map任务来进行处理。在inputsplit中的每一个kv键值对被传送到mapper的map函数进行处理;
3) map函数产生新的序列化后的kv键值对到一个没有排序的内存缓冲区中;
4) 当缓冲区装满或者map任务完毕后。在该缓冲区的kv键值对就会被排序同一时候流入到磁盘中,形成spill文件,溢出文件;
5) 当有不止一个溢出文件产生后,这些文件会全部被排序,而且合并到一个文件里;
6) 文件里排序后的kv键值对等待被reducer取走;
同样的,能够简单画个图:
reduce阶段:
主要包含三个小阶段:
1) shuffle:或者称为fetch阶段(获取阶段),在这个阶段全部拥有同样键的记录都被合并而且发送到同一个reducer中;
2) sort: 和shuffle同一时候发生,在记录被合并和发送的过程中,记录会依照key进行排序。
3) reduce:针对每一个键会进行reduce函数调用;
reduce数据流:
1) 当mapper完毕map任务后,reducer開始获取记录,同一时候对他们进行排序并存入自己的jvm内存中的缓冲区;
2) 当一个缓冲区数据装满。则会流入到磁盘;
3) 当全部的mapper完毕而且reducer获取到全部和他相关的输入后,该reducer的全部记录会被合并和排序,包含还在缓冲区中的;
4) 合并、排序完毕后调用reduce方法;输出到hdfs或者依据作业配置到其它地方;
图片来自《hadoop权威指南》3rd edition
5. yarn相关
yarn包含的组件有:resourcemanager、nodemanager、applicationmaster,当中resourcemanager能够分为:scheduler、applicationsmanager
hadoop1.x中的jobtracker被分为两部分:resourcemanager和applicationmaster。前者提供集群资源给应用,后者为应用提供执行时环境。
yarn应用生命周期:
1) client提交一个应用请求到resourcemanager;
2) resourcemanager中的applicationsmanager在集群中寻找一个可用的、负载较小的nodemanager;
3) 被找到的nodemanager创建一个applicationmaster实例;
4) applicationmaster向resourcemanager发送一个资源请求。resourcemanager回复一个container的列表。包含这些container是在哪些nodemanager上启动的信息。
5) applicationmaster在resourcemanager的指导下在每一个nodemanager上启动一个container,container在applicationmaster的控制下执行一个任务;
简单绘图:
tips:
a. client能够从applicationmaster中获取任务信息;
b. 一个作业一个applicationmaster,一个application能够有多个container,一个nodemanager也能够有多个container;
性能篇:
性能涉及较多内容。这里參考前文中给出的链接。并依照作业执行、map阶段、reduce阶段的顺序来组织性能相关的点。
1. 命令行參数:
在自己定义集群的參数时。不改动集群的文件,而在命令行使用參数。这样能够针对不同的參数设置方便,从而不必改动集群中的配置文件,一般有以下两种方式:
1)hadoop jar examplejob-0.0.1.jar examplejob -conf my-conf.xml arg0 arg1
使用配置文件的方式,把须要改动的地方设置在配置文件里面,使用-conf指定配置文件(上面命令行来自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/);
2)hadoop jar examplejob-0.0.1.jar examplejob -dmapred.reduce.tasks=20 arg0
使用-d參数来这是相应的值也是能够的(上面的命令行来自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/);
2. map阶段
1) map的个数问题
map的个数是不能直接设置的。假设有非常多mapper的执行时间小于1分钟。那么建议设置mapred.min.split.size的大小。提高分片的大小,这样来减小mapper的个数,能够减小mapper初始化的时间;或者设置jvm重用(图片来自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/)
2) 设置mapred.child.java.opts參数
使用ganglia、nagios等监控工具检測slave节点的内存使用情况,设置合适的mapred.child.java.opts 參数。避免交换的发生;
3)map的输出使用压缩
当map的输出较多时,能够考虑使用压缩,这能提高非常大的性能(图片来自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/):
4)使用合适的writable作为key(键)和value(值)类型
这一点在mapper和reducer的编程中都能够使用,假设全部数据都使用text的话,那么数据的占有空间将会非常大,导致效率低下。假设有必要能够自己定义writable类型。
5)重用已有变量
在mapper或者reducer的编程中重用已经定义的变量,能够避免反复的生成新对象,而导致垃圾回收频繁的调用,例如以下代码1和2(代码參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/);
6) 设置mapreduce.reduce.shuffle.parallelcopies參数
设置此參数,能够使 reducer在一个mapper完毕后就開始获取数据,并行化数据获取;
7) 最小化mapper输出:
a. 在mapper端过滤,而不是在reducer端过滤;
b. 使用更小的数据来存储map输出的key和value(參考第4)点);
c. 设置mapper的输出进行压缩(參考第3)点)。
3. reduce阶段
reducer负载均衡:
1) reducer的个数。依据实际集群的数量来设置reducer的个数。使其负载均衡。
比方集群有100个节点。那么reducer的个数设置为101个则应该是不合理的。在第一次任务分配时分配了100个作业。这100个作业是并行的。可是最后一个作业并非并行的。
2)reducer中部分由于同样key的数据量大,导致个别reducer执行耗时相比其它reducer耗时长非常多。
能够考虑:
a. 实现一个更好的hash函数继承自partitioner类;
b. 假设知道有大量同样的key的数据。能够写一个预处理的作业把同样的key分到不同的输出中,然后再使用一个mr作业来处理这个特殊的key的数据;
4. 设置输入输出
假设有多个连续的mr作业,能够设置输入输出为序列文件,这样能够达到更好的性能。
个人整理,如有错误,敬请不吝赐教。
分享,成长,快乐
脚踏实地,专注