Hadoop大数据面试--Hadoop篇

企业动态 Hadoop
本篇大部分内容参考网上,其中性能部分参考:http://blog.cloudera.com/blog/20 ... reduce-performance/、http://www.idryman.org/blog/2014 ... ing-best-practices/

[[179381]]

原理篇

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或者根据作业配置到其他地方;

5. YARN相关

YARN包括的组件有:ResourceManager、NodeManager、ApplicationMaster,其中ResourceManager可以分为:Scheduler、ApplicationsManager

Hadoop1.X中的JobTracker被分为两部分:ResourceManager和ApplicationMaster,前者提供集群资源给应用,后者为应用提供运行时环境;

YARN应用生命周期:

1) 客户端提交一个应用请求到ResourceManager;

2) ResourceManager中的ApplicationsManager在集群中寻找一个可用的、负载较小的NodeManager;

3) 被找到的NodeManager创建一个ApplicationMaster实例;

4) ApplicationMaster向ResourceManager发送一个资源请求,ResourceManager回复一个Container的列表,包括这些Container是在哪些NodeManager上启动的信息;

***pplicationMaster在ResourceManager的指导下在每个NodeManager上启动一个Container,Container在ApplicationMaster的控制下执行一个任务;

Tips:

a. 客户端可以从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 ... ing-best-practices/);

2)hadoop jar ExampleJob-0.0.1.jar ExampleJob -Dmapred.reduce.tasks=20 arg0

使用-D参数来这是相应的值也是可以的(上面的命令行来自:http://www.idryman.org/blog/2014 ... ing-best-practices/);

2. map阶段

1) map的个数问题

map的个数是不能直接设置的,如果有很多mapper的执行时间小于1分钟,那么建议设置mapred.min.split.size的大小,提高分片的大小,这样来减小Mapper的个数,可以减小Mapper初始化的时间;或者设置JVM重用(图片来自:http://www.idryman.org/blog/2014 ... ing-best-practices/)

2) 设置mapred.child.java.opts参数

使用Ganglia、Nagios等监控工具检测slave节点的内存使用情况,设置合适的mapred.child.java.opts 参数,避免交换的发生;

3)map的输出使用压缩

当map的输出较多时,可以考虑使用压缩,这能提高很大的性能(图片来自:http://www.idryman.org/blog/2014 ... ing-best-practices/):

4)使用合适的Writable作为key(键)和value(值)类型

这一点在mapper和reducer的编程中都可以使用,如果全部数据都使用Text的话,那么数据的占有空间将会很大,导致效率低下。如果有必要可以自定义Writable类型。

5)重用已有变量

在mapper或者reducer的编程中重用已经定义的变量,可以避免重复的生成新对象,而导致垃圾回收频繁的调用,如下代码1和2(代码参考:http://blog.cloudera.com/blog/20 ... reduce-performance/); 

  1. public void map(...) {  
  2.     ...  
  3.     for (String word : words) {  
  4.         output.collect(new Text(word), new IntWritable(1));  
  5.     }  
  6.  
  1. class MyMapper ... {  
  2.     Text wordText = new Text();  
  3.     IntWritable one = new IntWritable(1);  
  4.     public void map(...) {  
  5.         ...  
  6.         for (String word : words) {  
  7.             wordText.set(word);  
  8.             output.collect(word, one);  
  9.         }  
  10.     }  
  11.  

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作业,可以设置输入输出为序列文件,这样可以达到更好的性能。

个人整理,如有错误,敬请指教。

分享,成长,快乐

脚踏实地,专注

【本文为51CTO专栏作者“王森丰”的原创稿件,转载请注明出处】

责任编辑:庞桂玉 来源: 神算子
相关推荐

2010-06-04 10:01:26

Hadoop安装

2016-10-26 08:57:13

HadoopScrapy大数据

2015-04-01 15:09:30

Hadoop大数据

2021-05-16 07:44:01

Hadoop大数据HDFS

2013-04-12 10:56:31

大数据

2017-01-15 14:18:35

大数据HadoopScrapy

2015-09-25 10:44:02

大数据Hadoop

2014-11-11 10:47:19

hadoop数据流

2018-07-11 13:33:43

大数据人工智能Hadoop

2013-08-20 09:26:03

大数据时代hadoop

2012-06-29 09:19:39

大数据

2012-05-31 14:54:59

Hadoop大数据

2013-09-23 09:27:43

Hadoop大数据

2012-03-12 10:09:50

Hadoop微软大数据

2013-09-23 13:54:05

2015-04-24 11:20:15

Hadoop大数据架构大数据

2017-07-03 13:11:39

大数据Hadoop模块介绍

2022-10-14 15:44:03

大数据Hadoop

2013-05-06 10:22:28

大数据Hadoop

2017-05-01 22:54:01

Hadoop大数据开源
点赞
收藏

51CTO技术栈公众号