Hadoop大数据面试–Hadoop篇

Hadoop大数据面试–Hadoop篇

大家好,又见面了,我是全栈君。

本篇大部分内容參考网上,当中性能部分參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/、http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/

原理篇:

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的指导下复制这些块,保持冗余。

能够在解说的时候,拿仅仅笔和纸画下:

Hadoop大数据面试--Hadoop篇

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取走;

同样的,能够简单画个图:

Hadoop大数据面试--Hadoop篇

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大数据面试--Hadoop篇图片来自《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的控制下执行一个任务;

简单绘图:

Hadoop大数据面试--Hadoop篇

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/)

Hadoop大数据面试--Hadoop篇

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/):

Hadoop大数据面试--Hadoop篇

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/);

public void map(...) {
  ...
  for (String word : words) {
    output.collect(new Text(word), new IntWritable(1));
  }
}
class MyMapper ... {
  Text wordText = new Text();
  IntWritable one = new IntWritable(1);
  public void map(...) {
    ...
    for (String word : words) {
      wordText.set(word);
      output.collect(word, one);
    }
  }
}

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

个人整理,如有错误,敬请不吝赐教。

分享,成长,快乐

脚踏实地,专注

转载请注明blog地址:http://blog.csdn.net/fansy1990

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116420.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java程序员烂大街了吗?No or yes?

    Java程序员烂大街了吗?No or yes?Java程序员烂大街了吗?当下,越来越多的企业需要程序员,即使不是互联网公司,很普通的公司程序员也是标配。过去程序员属于稀缺岗位,而今随着技术的发展在二三线城市,甚至四线五线城市,小县城都有程序员的需求。作为一个发展越来越成熟的行业,Java程序员越来越多,自然会感觉程序员到处都是。小乐认为,虽然越来越多,也不必过分的担忧。虽然现在学Java做Java的人很多,但不难发现依旧有很多公司在招聘Java程序员。究其原因就是现在Java程序员虽然很多,但是精的很少。简单的增删该查估计一个门外汉网上找个开源

  • 12个Python程序员面试必备的问题与答案「建议收藏」

    本文列举了12个Python程序员面试必备的问题与答案,便于大家学习。例如:什么是pickling和unpickling、什么是Python的命名空间、*args,**kwargs?参数是什么、负索引是什么,等等。

  • Python面试必备的7大问题

    本文给大家总结了Python面试必备的7大问题。例如:交换变量值、is 和 == 的区别、可变对象和不可变对象、连接字符串用join还是+、__new__和__init__的区别,等等。

  • Java程序员,你一定需要了解的六款大数据采集平台

    Java程序员,你一定需要了解的六款大数据采集平台随着大数据越来越被重视,数据采集的挑战变的尤为突出。今天为大家介绍几款数据采集平台: ApacheFlume Fluentd Logstash Chukwa Scribe SplunkForwarder 大数据平台与数据采集任何完整的大数据平台,一般包括以下的几个过程: 数据采集 数据存储 数据处理 …

  • Java程序员,到底要不要转行大数据?

    Java程序员,到底要不要转行大数据?前几天有个朋友在群里提问:如何看待大数据的未来?有必要转大数据方向吗?关于这个问题,谈谈我的思考。伴随公有云厂商的兴起,大数据的应用进入了2.0时代。传统大数据那种需要大量购买机器以及Hadoop发行商版本的时代一去不复返了,企业可以非常便利的按照自己的需要,在云端弹性的分配资源,并按照使用量付费。这使得大数据技术不但进入到了传统意义上的大中型企业,更是深入到了各行各业的小企业和创…

  • 越来越多的Java程序员转行Java大数据…[通俗易懂]

    越来越多的Java程序员转行Java大数据…[通俗易懂]JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA。  但是,在未来肯定是大数据的天下,人工智能的爆发,将会有大量企业会进入大数据领域,从而产生大量的大数据人才需求。据最新发布的《大数据人才报告》显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万。领英报…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号