《大数据工程师 面经 自己整理 面试题1--》

《大数据工程师 面试题 转行为人民服务 给有需要的有缘人》

面试题一:简述一下MapReduce

  首先我先介绍一下MapReduce的程序提交后执行流程,客户端向JobTracker申请可用的Job,JobTracker会返回一个JobID,客户端得到JobID后会将需要的资源拷贝至HDFS中,资源准备完后,向JobTracker提交Job。JobTracker接收到Job后会初始化Job,在初始化Job的同时,TaskTracker不断地向JobTracker汇报心跳信息。TaskTracker得到JobTracker分配(尽量满足数据本地化)的任务后,向HDFS获取Job资源(若数据是本地的,不需拷贝数据)。获取资源后,TaskTracker会开启JVM子进程运行任务
  MapReduce在Map端:主要是完成从HDFS中读取数据,然后根据业务逻辑需要进行映射。读取数据时每个输入分片会让一个map任务来处理,map输出的结果会暂且放在一个环形内存缓冲区中,当该缓冲区快要溢出时,会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件。在将内存数据写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,其实分区就是对数据进行hash分配的过程。然后对每个分区中的数据进行排序,这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据。当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combiner操作,目的在于:尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。
  Reduce端:完成对Map端输出结果的合并,Reduce任务通过HTTP向各个Map任务拖取它所需要的数据,如果内存缓冲区中能放得下这次数据的话就直接把数据在内存中合并,即内存到内存merge。当内存缓存区中存储的Map数据占用空间达到一定程度的时候,把内存中的数据merge输出到磁盘上一个文件中,即内存到磁盘merge。当属于该reducer的map输出全部拷贝完成,则会在reducer上生成多个文件(如果拖取的所有map数据总量都没有内存缓冲区,则数据就只存在于内存中),这时开始执行合并操作,即磁盘到磁盘merge

面试题二、Zookeeper的角色以及相应的Zookepper工作原理?

  Zookeeper的角色大概有如下四种:leader、learner(follower)、observer、client。其中leader主要用来决策和调度,follower和observer都有将client请求提交给leader的职能,而observer的出现是为了应对当投票压力过大这种情形的,client就是用来发起请求的。而Zookeeper所用的分布式一致性算法包括leader的选举其实和原始部落的获得神器为酋长,或者得玉玺者为皇帝类似,会根据你所配置的相应的文件在相应的节点机下生成id,谁id最小,谁为leader,然后相应的节点会通过getchildren()这个函数获取之前设置的节点下生成的id,谁最小,谁是leader。并且如果万一这个leader挂掉了或者堕落了,则由次小的顶上。

面试题三、Hadoop框架知识点

第一小问、hadoop中读取数据类TextInputFormat和KeyValueInputFormat类不同之处在于哪里?

答:TextlnputFormat读取文本文件中的所有行,提供了行的偏移作为Mapper的键,实际的行作为mapper的值
KeyValuelnputFormat读取文本文件,解析所有行,首个空格前的字符是mapper的key,行的其余部分则是mapper的值

第二小问、Hadoop中InputSplit是什么?

   答:InputSplit是一个分片的概念,在MapReduce作业中,作为map task最小输入单位。分片是基于文件基础上出来的概念,通俗的理解一个文件可以切分为多少个片段,每个片段包括了<文件名,开始位置,长度,位于哪些主机>等信息。在MapTask拿到这些分片后,会知道从哪开始读取数据。

第三小问、Hadoop怎么分片

   HDFS存储系统中,引入了文件系统的分块概念(block),块是存储的最小单位,Hadoop1.x中,HDFS定义其大小为64MB。与单磁盘文件系统相似,存储在 HDFS上的文件均存储为多个块,不同的是,如果某文件大小没有到达64MB,该文件也不会占据整个块空间。在分布式的HDFS集群上,Hadoop系统 保证一个块存储在一个datanode上
   HDFS的namenode只存储整个文件系统的元数据镜像,这个镜像由配置dfs.name.dir指定,datanode则存有文件的metainfo和具体的分块,存储路径由dfs.data.dir指定。
   分析完毕分块,下面讨论一下分片:
   hadoop的作业在提交过程中,需要把具体的输入进行分片。具体的分片细节由InputSplitFormat指定。分片的规则为 FileInputFormat.class中的getSplits()方法指定:
   long splitSize = computeSplitSize(goalSize, minSize, blockSize);
   computeSplitSize:
   Math.max(minSize, Math.min(goalSize, blockSize));
   其中goalSize为“InputFile大小”/“我们在配置文件中定义的mapred.map.tasks”值,minsize为mapred.min.split.size,blockSize为64,所以,这个算式为取分片大小不大于block,并且不小于在mapred.min.split.size配置中定义的最小Size。
当某个分块分成均等的若干分片时,会有最后一个分片大小小于定义的分片大小,则该分片独立成为一个分片。

第四小问、有三个文件64K,65MB,127MB,那么有hadoop框架会将输入如何划分?

   考虑一种情况:Map/Reduce系统中,HDFS块大小是64MB,输入格式FileInputFormat,有三个文件64K,65MB,127MB,那么有hadoop框架会将输入如何划分?
   hadoop将会做5个拆分,64K文件拆分1个,65MB文件拆分2个,127MB文件拆分2个。

第五小问、什么时候使用combiner?什么时候不用?

答:当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使用Combiner, Combiner号称本地的Reduce. Reduce最终的输入,是Combiner的输出Combiner的作用是把一个map产生的多个<KEY,VALUE>合并成一个新的<KEY,VALUE>,然后再将新<KEY,VALUE>的作为reduce的输入;
  在map函数与reduce函数之间多了一个combine函数,目的是为了减少map输出的中间结果,这样减少了reduce复制map输出的数据,减少网络传输负载。

  并不是所有情况下都能使用Combiner. Combiner适用于对记录汇总的场景(如求和),但是,求平均数的场景就不能使用Combiner了。如果可以使用Combiner,一般情况下,和我们的reduce函数是一致的。

第六小问、什么是Jobtracker、tasktracker?

  JobTracker是整个MapReduce计算框架中的主服务,相当于集群的、’管理者“,负责整个集群的作业控制和资源管理
  TaskTracker是JobTracker和Task之间的桥梁:一方面,从JobTracker接收并执行各种命令:运行任务、提交任务、杀死任务等:另一方面,将本地节点上各个任务的状态通过心跳周期性汇报给JobTracker ,TaskTracker与JobTracker和Task之间采用了RPC协议进行通信。

第七小问、Hadoop作业提交后执行流程(***)

  Spark使用了Hadoop的MapReduce作为并行化编程模型,MapReduce作业运行流程如图xx所示。

  • 1、用户编写好MapReduce程序后打包,提交至Client。

  • 2、JobClient向JobTracker申请可用Job,JobTracker返回JobClient一个可用Job ID。

  • 3、JobClient得到Job ID后,将运行Job所需要的资源拷贝到共享文件系统HDFS中,其中包括MapReduce程序打包的jar文件、配置文件和客户端计算所得的输入划分信息。

  • 4、资源准备完备后,JobClient向JobTracker提交Job。

  • 5、JobTracker收到提交的Job后,会将Map任务分配给含有该Map处理的数据块的TaskTracker上,初始化Job。

  • 6、初始化完成后,JobTracker从HDFS中获取输入splits。

  • 7、与此同时,TaskTracker不断地向JobTracker汇报心跳信息,心跳中还携带者当前Map任务完成的进度。

  • 8、TaskTracker得到JobTracker分配(尽量满足数据本地化)的任务后,向HDFS获取Job资源。

  • 9、获取资源后,TaskTracker会开启JVM子进程运行任务。
            在这里插入图片描述

第八小问、假设hadoop-job产生了100个task,并且其中的一个task失败了,hadoop会如何处理?

  hadoop本身的一个设计理念就是在普通的pc硬件上构建高可靠性的系统,任何failed task都不会引起整个job的失败,因为所有失败的任务都会被重新执行(reschedule execution),只有当重新执行的次数超过4次,才会把这任务标记为失败,导致整个job的失败

第九小问、hadoop提供了什么机制防止对少数慢节点可能会限制剩下其他程序的速率?

  为了减少拖尾的任务对job运行时间的影响,jobtracker会重新启动一个一模一样的duplicate task和原有的task并行的执行,这样有一个task执行成功,整个map过程就会结束。

第十小问、你们的数据是用什么导入到数据库的?导入到什么数据库?

  处理之前的导入:通过hadoop命令导入到hdfs文件系统

第十一小问、简答说一下hadoop的map-reduce编程模型(***)

  首先,map task会从HDFS文件系统中按照分片读取数据,然后数据转换成Key-value形式的键值对集合,然后每个分片数据由一个map任务进行业务处理,将其转换成我们的key-value输出,map端输出时,如果我们我们输出结果在环形内存缓存区中存放不下,超过了80%,那么会向本地磁盘中写入,在将内存数据写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,其实分区就是对数据进行hash分配的过程。然后对每个分区中的数据进行排序,这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据。在map任务结束之后,可能会有很多的磁盘文件,此时map端会进行磁盘文件的合并combiner操作和排序。这样做的目的是为了减少网络传输的数据量。reduce端会通过网络从各个map任务拉取数据,进行三种merge操作,最后将结果保存,结束整个job。

第十三小问、map-reduce程序运行的时候会有什么比较常见的问题

  比如说作业中大部分都完成了,可能总有几个reduce一直在运行。这是因为这几个reduce中的处理的数据要远远大于其他的reduce, 可能是因为对键值对任务划分的不均匀造成的数据倾斜。解决的方法可以在分区的时候重新定义分区规则对于value数据很多的key可以进行拆分、均匀打散等处理,或者是在map端的combiner进行数据预处理的操作。

第十四小问、介绍一下Hadoop (**)

  Hadoop是Apaceh开源的顶级项目,Hadoop包括Hadoop HDFS、Hadoop Yarn、Hadoop Common、Hadoop Mapreduce。1) Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统。2 ) Hadoop YARN:作业调度与集群资源管理的框架。3 ) Hadoop MapReduce:一个分布式的离线并行计算框架。 4 ) Hadoop Common:支持其他模块的工具模块(Configuration. RPC.序列化机制、日志操作)。Hadoop有高可靠性、高扩展性、高效性、高容错性特点,高可靠性体现在Hdoop 文件系统HDFS底层维护多个数据副本、高扩展性体现在在集群间分配任务数据,可方便的扩展数以千计的节点。高容错性体现在能够自动将失败的任务重新分配。
  在Hadoop 1. x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性比较高。Hadoop2.x,增加了Yarn ,Yarn只负责资源的调度,MapReduce负责运算
  Hadoop HDFS介绍

  1. NameNode:存储文件的元数据,如文件名,文件日录结构,文件属性,以及每个文件的块列表和块所在的DataNode
  2. DataNode:在本地文件系统存储文件块数据
  3. Secondary NameNode:用来监控HDFS状态的辅助后台程序

HDFS 优点:高容错性,数据自动保存多个副本。它通过增加副本的形式,提高容错性;某一个副本丢失以后,它可以自动恢复。适合大数据处理数据规模,能够处理数据规模达到Pb级别的数据
HDFS 缺点:不适合低延时数据访问和存储大量的小文件,比如毫秒级的存储数据,是做不到的。存储大量小文件的话,它会占用NameNode大量的内存来存储文件、目录和块信息。小文件存储的寻址时间会超过读取时间。一个文件不支持并发修改。

  Hadoop Yarn介绍

  1. Resouce Manager:处理客户端请求、启动/监控ApplicationMaster,监控NodeMananer,资源分配与调度
  2. NodeManager:单个结点资源管理,处理来自 Resouce Manager、ApplicationMaster的命令
  3. ApplicationMaster:数据切分、为应用程序申请资源、并分配给内部任务、任务监控与容错
  4. Container:对任务运行环境的抽象,封装了CPU、内存以及环境变虽、启动命令等任务运行相关的信息

MapReduce将计算过程分为两个阶段:Map和Reduce

  1. Map阶段并行处理输入数据
  2. Reduce阶段对Map结果进行汇总

第十五小问、HDFS中块(block)的大小为什么设置为128M?

  HDFS中块(block)不能设置太大,也不能设置太小,如果块设置过大, 一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。
  HDFS中块(block)的大小为什么设置为128M?

  • HDFS中平均寻址时间大概为10ms

  • 经过前人的大量测试发现,寻址时间为传输时间的1%时,为最佳状态

    所以最佳传输时间为10ms/0.01=1000ms=1s

  • 目前磁盘的传输速率普遍为100MB/s

    计算出最佳block大小:100MB/s x 1s = 100MB, 所以我们设定block大小为128MB。

第十六小问、HDFS读写流程(***)

在这里插入图片描述
文件写入:
在这里插入图片描述
文件读取:
在这里插入图片描述
读取过程:
在这里插入图片描述

第十七小问、DataNode 工作机制

  
在这里插入图片描述
在这里插入图片描述

第十八小问、介绍一下MapReduce框架(必考题)(****)

  Hadoop的MapReduce不擅长做实时计算、流式计算、DAG(有向图)计算。

  • 实时计算。MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。

  • 流式计算。流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。

  • DAG(有向图)计算。多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,hadoop的每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO操作,导致性能非常的低下

MapReduce程序作业执行流程:
(1) 开发人员编写好MapReduce program,将程序打包运行。
(2) JobClient向JobTracker申请可用Job,JobTracker返回JobClient一个可用Job ID
(3) JobClient得到Job ID后,将运行Job所需要的资源拷贝到共享文件系统HDFS中
(4) 资源准备完备后,JobClient向JobTracker提交Job
(5) JobTracker收到提交的Job后,初始化Job
(6) 初始化完成后,JobTracker从HDFS中获取输入splits(作业可以该启动多少Mapper任务)。
(7)与此同时,TaskTracker不断地向JobTracker汇报心跳信息
(8) TaskTracker得到JobTracker分配(尽量满足数据本地化)的任务后,向HDFS获取Job资源(若数据是本地的,不需拷贝数据)。
(9) 获取资源后,TaskTracker会开启JVM子进程运行任务
在这里插入图片描述

Map阶段:
1、每个输入分片会让一个map任务来处理,默认情况下,以HDFS的一个块的大小(默认128M)为一个分片,当然我们也可以设置块的大小。map输出的结果会暂且放在一个环形内存缓冲区中(该缓冲区的大小默认为100M,由io.sort.mb属性控制),当该缓冲区快要溢出时(默认为缓冲区大小的80%,由io.sort.spill.percent属性控制),会在本地文件系统中创建一个溢出文件,将该缓冲区中的数据写入这个文件

2、在写入磁盘之前,线程首先根据reduce任务的数目将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样做是为了避免有些reduce任务分配到大量数据,而有些reduce任务却分到很少数据,甚至没有分到数据的尴尬局面。其实分区就是对数据进行hash的过程。然后对每个分区中的数据进行排序,如果此时设置了Combiner,将排序后的结果进行Combianer操作,这样做的目的是让尽可能少的数据写入到磁盘。

3、当map任务输出最后一个记录时,可能会有很多的溢出文件,这时需要将这些文件合并。合并的过程中会不断地进行排序和combiner操作,目的有两个:1、尽量减少每次写入磁盘的数据量;2、尽量减少下一复制阶段网络传输的数据量。最后合并成了一个已分区且已排序的文件。为了减少网络传输的数据量,这里可以将数据压缩,只要将mapred.compress.map.out设置为true就可以。

数据压缩:Gzip、Lzo、snappy。

4、将分区中的数据拷贝给相对应的reduce任务。有人可能会问:分区中的数据怎么知道它对应的reduce是哪个呢?其实map任务一直和其父TaskTracker保持联系,而TaskTracker又一直和obTracker保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务向JobTracker获取对应的map输出位置就OK了。
在这里插入图片描述

第十九大问、MapReduce的Shuffle阶段(***)

为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,而这个将Map输出进行进一步整理并交给Reduce的过程就是Shuffle。整个MR的大致过程如下:Map和Reduce操作需要我们自己定义相应Map类和Reduce类,以完成我们所需要的化简、合并操作,而shuffle则是系统自动帮我们实现的,了解shuffle的具体流程能帮助我们编写出更加高效的Mapreduce程序。
在这里插入图片描述
Map端的Shuffle:
  在Map端的shuffle过程是对Map的结果进行分区、排序、分割,然后将属于同一划分(分区)的输出合并在一起并写在磁盘上,最终得到一个分区有序的文件,分区有序的含义是map输出的键值对按分区进行排列,具有相同partition值的键值对存储在一起,每个分区里面的键值对又按key值进行升序排列(默认),其流程大致如下&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值