《大数据工程师 面试题 转行为人民服务 给有需要的有缘人》
- 面试题一:简述一下MapReduce
- 面试题二、Zookeeper的角色以及相应的Zookepper工作原理?
- 面试题三、Hadoop框架知识点
-
- 第一小问、hadoop中读取数据类TextInputFormat和KeyValueInputFormat类不同之处在于哪里?
- 第二小问、Hadoop中InputSplit是什么?
- 第三小问、Hadoop怎么分片
- 第四小问、有三个文件64K,65MB,127MB,那么有hadoop框架会将输入如何划分?
- 第五小问、什么时候使用combiner?什么时候不用?
- 第六小问、什么是Jobtracker、tasktracker?
- 第七小问、Hadoop作业提交后执行流程(***)
- 第八小问、假设hadoop-job产生了100个task,并且其中的一个task失败了,hadoop会如何处理?
- 第九小问、hadoop提供了什么机制防止对少数慢节点可能会限制剩下其他程序的速率?
- 第十小问、你们的数据是用什么导入到数据库的?导入到什么数据库?
- 第十一小问、简答说一下hadoop的map-reduce编程模型(***)
- 第十三小问、map-reduce程序运行的时候会有什么比较常见的问题
- 第十四小问、介绍一下Hadoop (**)
- 第十五小问、HDFS中块(block)的大小为什么设置为128M?
- 第十六小问、HDFS读写流程(***)
- 第十七小问、DataNode 工作机制
- 第十八小问、介绍一下MapReduce框架(必考题)(****)
- 第十九大问、MapReduce的Shuffle阶段(***)
- 第二十小问、Shuffle性能调优
- 第二十小问的补充:MapReduce的调优
- 第二十一小问、如何解决多个小文档存储?
- 第二十二小问、HDFS HA高可用
- 第二十三小问、 NameNode在启动的时候会做哪些操作
- 第二十四小问、Hbase中的HMaster的作用
- 第二十五小问、hadoop的调度策略的实现,你们使用的是那种策略,为什么???
- 面试题4、Spark知识点
-
- 第一小问、Spark如何处理非结构化数据?
- 第二小问、简要描述Spark分布式集群搭建的步骤
- 第三小问、hadoop和spark的都是并行计算,那么他们有什么相同和区别?(***)
- 第四小问、如何理解RDD机制
- 第五小问、spark有哪些组件?
- 第六小问、Spark的Shuffle原理及调优
- 第七小问、hadoop和spark使用场景?
- 第八小问、spark如何保证宕机迅速恢复?
- 第九小问、hadoop和spark的相同点和不同点?
- 第十小问、RDD持久化原理?
- 第十一小问、checkpoint检查点机制?
- 第十二小问、checkpoint和持久化机制的区别?
- 第十三小问、Spark Streaming和Storm有何区别?
- 第十四小问、RDD机制?
- 第十五小问、Spark streaming以及基本工作原理?
- 第十六小问、DStream以及基本工作原理?
- 第十七小问、spark有哪些组件?
- 第十八小问、Spark工作的一个流程?
- 第十九小问、spark核心编程原理?
- 第二十小问、spark性能优化有哪些?(***)
- 第二十一小问、宽依赖和窄依赖
- 第二十二小问、spark streaming中有状态转化操作?
- 第二十三小问、spark常用的计算框架?
- 第二十四小问、Spark的特点是什么?
- 第二十五小问、Spark的三种提交模式是什么?
- 第 二十六小问、spark内核架构原理
- 第二十七小问、Spark yarn-cluster架构?
- 第二十八小问、Spark yarn-client架构?
- 第二十九小问、Spark主备切换机制原理剖析?
- 第三十小问、spark解决了hadoop的哪些问题?
- 第三十一小问、数据倾斜的产生和解决办法?
- 面试题5、HBase方面问题
-
- 第一小问、HBase的操作数据的步骤
- 第二小问、HDFS和HBase各自使用场景
- 第三小问、热点现象及解决办法(***)
- 第四小问、RowKey的设计原则?
- 第五小问、hbase.hregion.max.filesize应该设置多少合适
- 第六小问、autoflush=false的影响
- 第七小问、对于传统关系型数据库中的一张table,在业务转换到hbase上建模时,从性能的角度应该 如何设置family和qualifier呢?
- 第八小问、Hbase行健列族的概念,物理模型,表的设计原则?
- 第九小问、介绍一下HBase物理模型?
- 第十小问、HBase二级索引?
- 第十一小问、HBase的客户端Client?
- 第十二小问、HBase存储单元Cell?
- 第十三小问、HBase的查询语句?
- 第十四小问、Hbase中行 、列长度如何确定?
- 第十四小问、为什么Hbase不建议在Hbase中使用过多列族?
- 面试题七、Flume工作机制是什么?
- 面试题八、kafka收集数据的原理?
面试题一:简述一下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介绍:
- NameNode:存储文件的元数据,如文件名,文件日录结构,文件属性,以及每个文件的块列表和块所在的DataNode
- DataNode:在本地文件系统存储文件块数据
- Secondary NameNode:用来监控HDFS状态的辅助后台程序
HDFS 优点:高容错性,数据自动保存多个副本。它通过增加副本的形式,提高容错性;某一个副本丢失以后,它可以自动恢复。适合大数据处理数据规模,能够处理数据规模达到Pb级别的数据
HDFS 缺点:不适合低延时数据访问和存储大量的小文件,比如毫秒级的存储数据,是做不到的。存储大量小文件的话,它会占用NameNode大量的内存来存储文件、目录和块信息。小文件存储的寻址时间会超过读取时间。一个文件不支持并发修改。
Hadoop Yarn介绍:
- Resouce Manager:处理客户端请求、启动/监控ApplicationMaster,监控NodeMananer,资源分配与调度
- NodeManager:单个结点资源管理,处理来自 Resouce Manager、ApplicationMaster的命令
- ApplicationMaster:数据切分、为应用程序申请资源、并分配给内部任务、任务监控与容错
- Container:对任务运行环境的抽象,封装了CPU、内存以及环境变虽、启动命令等任务运行相关的信息
MapReduce将计算过程分为两个阶段:Map和Reduce
- Map阶段并行处理输入数据
- 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值进行升序排列(默认),其流程大致如下:
Partition:对于map输出的每一个键值对,系统都会给定一个partition,partition值默认是通过计算key的hash值后对Reduce task的数量取模获得。如果一个键值对的partition值为1,意味着这个键值对会交给第一个Reducer处理。
KvBuffer环形数据缓存区:
每个Map任务不断地将键值对输出到在内存中构造的一个环形数据结构KvBuffer中,其实就是个字节数组,KvBuffer不仅用户缓存键值对,还放置了一些索引数据,给放置索引数据的区域起了一个Kvmeta的别名。当KvBuffer被占用了百分之80左右,就会把数据从内存刷到磁盘上再接着往内存写数据,把Kvbuffer中的数据刷到磁盘上的过程就叫Spill,多么明了的叫法,内存中的数据满了就自动地spill到具有更大空间的磁盘。
Sort:当Spill触发后,SortAndSpill先把Kvbuffer中的数据按照partition值和key两个关键字升序排序,移动的只是索引数据,排序结果是Kvmeta中数据按照partition为单位聚集在一起,同一partition内的按照key有序。
Merge:Map任务如果输出数据量很大,可能会进行好几次Spill,out文件和Index文件会产生很多ÿ