大数据面试-hadoop(1)

目录
请列出hadoop的进程名称
HDFS读写数据的过程
1.简单概述hdfs原理,以及各个模块的职责
2.mr的工作原理
yarn流程
3.fsimage和edit的区别
4.谈谈数据倾斜,如何发生的,并给出优化方案
5.简单概括安装hadoop的步骤
6.简单概述hadoop中的角色的分配以及功能
7.简单概述hadoop的join的方法
8.简单概述hadoop的combinet与partition的区别
9.hdfs 的数据压缩算法
10.datanode 在什么情况下不会备份?
11.hdfs 的体系结构?
12.三个 datanode,当有一个 datanode 出现错误会怎样?
13.mapReduce 的执行过程
14.文件大小默认为 64M,改为 128M 有啥影响
15.datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?
16.MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?
17.hadoop的shuffe的概念
18.Hadoop的优化
19.怎样决定mapreduce的中的map以及reduce的数量
20.两个文件合并的问题:给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url
21.hadoop的sequencefile的格式,并说明下什么是JAVA的序列化,如何实现JAVA的序列化
22.简单概述一下hadoop1与hadoop2的区别
23.hadoop join的原理
24.hadoop的二次排序
25.请描述mapreduce中shuffer阶段的工作流程,如何优化shuffer阶段的
26.mapreduce的combiner的作用是什么,什么时候不易使用??
如何用MR实现全局排序

请列出hadoop的进程名称
1 namenode:管理集群,并记录datanode文件信息。
2 Secondname:可以做冷备,对一定范围内的数据做快照性备份。
3 Datanode:存储数据。
4 Jobtracker:管理任务,并将任务分配给tasktracker。
5 Tasktracker:任务执行者
HDFS读写数据的过程
读:
1、跟namenode通信查询元数据,找到文件块所在的datanode服务器
2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流
3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)
4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件

写:
1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器
1.简单概述hdfs原理,以及各个模块的职责

(1)原理:

(1)客户端向 nameNode 发送要上传文件的请求

(2)nameNode 返回给用户是否能上传数据的状态

(3)加入用户端需要上传一个 1024M 的文件,客户端会通过 Rpc 请求 NameNode,并返回需要上传给那些DataNode(分配机器的距离以及空间的大小等),namonode会选择就近原则分配机器。

(4)客户端请求建立 block 传输管道 chnnel 上传数据

(5)在上传是 datanode 会与其他的机器建立连接并把数据块传送到其他的机器上

(6)dataNode 向 namenode 汇报自己的储存情况以及自己的信息

(7)当第一个快上传完后再去执行其他的复制的传送

(2)hdfs的体系架构:

hdfs有namenode、secondraynamenode、datanode组成。
为n+1模式
namenode负责管理datanode和记录元数据
secondraynamenode负责合并日志
datanode负责存储数据
2.mr的工作原理
(1)当执行mr程序是,会执行一个Job

(2)客户端的jobClick会请求namenode的jobTracker要执行任务

(3)jobClick会去HDFS端复制作业的资源文件

(4)客户端的jobClick会向namenode提交作业,让namenode做准备

(5)Namenode的jobTracker会去初始化创建的对象

(6)Namenode会获取hdfs的划分的分区

(7)Namenode去检查TaskTracker的心跳信息,查看存活的机器

(8)当执行的datenode执行任务时Datenode会去HDFS获取作业的资源的文件

(9TaskTracker会去执行代码,并登陆JVM的执行渠道

(10)JVM或执行MapTask或者ReduceTask

(11)执行终结
yarn流程
1) 用户向YARN 中提交应用程序, 其中包括ApplicationMaster 程序、启动ApplicationMaster 的命令、用户程序等。

2) ResourceManager 为该应用程序分配第一个Container, 并与对应的NodeManager 通信,要求它在这个Container 中启动应用程序的ApplicationMaster。

3) ApplicationMaster 首先向ResourceManager 注册, 这样用户可以直接通过ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。

4) ApplicationMaster 采用轮询的方式通过RPC 协议向ResourceManager 申请和领取资源。

5) 一旦ApplicationMaster 申请到资源后,便与对应的NodeManager 通信,要求它启动任务。

6) NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。

7) 各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。

8) 应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。
3.fsimage和edit的区别

大家都知道namenode与secondary namenode 的关系,当他们要进行数据同步时叫做checkpoint时就用到了fsimage与edit,fsimage是保存最新的元数据的信息,当fsimage数据到一定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是edit,edit会回滚最新的数据

4.谈谈数据倾斜,如何发生的,并给出优化方案

数据的倾斜主要是两个的数据相差的数量不在一个级别上,在只想任务时就造成了数据的倾斜,可以通过分区的方法减少reduce数据倾斜性能的方法,例如;抽样和范围的分区、自定义分区、数据大小倾斜的自定义侧咯

5.简单概括安装hadoop的步骤
(1).创建 hadoop 帐户

(2).setup.改 IP。

(3).安装 java,并修改/etc/profile 文件,配置 java 的环境变量。

(4).修改 Host 文件域名。

(5).安装 SSH,配置无密钥通信。

(6).解压 hadoop。

(7).配置 conf 文件下 hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。

(8).配置 hadoop 的环境变量。

(9).Hadoop namenode -format

(10).Start-all.sh
6.简单概述hadoop中的角色的分配以及功能
(1)Namenode:负责管理元数据的信息

(2)SecondName:做namenode冷备份,对于namenode的机器当掉后能快速切换到制定的Secondname上

(3)DateNode:主要做储存数据的。

(4)JobTracker:管理任务,并把任务分配到taskTasker

(5)TaskTracker:执行任务的
7.简单概述hadoop的join的方法

Hadoop 常用的jion有reduce side join , map side join , SemiJoin 不过reduce side join 与 map side join 比较常用,不过都是比较耗时的

8.简单概述hadoop的combinet与partition的区别

combine和partition都是函数,中间的步骤应该只有shuffle! combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的,partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类

combiner是reduce的实现,在map端运行计算任务,减少map端的输出数据。作用就是优化。
但是combiner的使用场景是mapreduce的map输出结果和reduce输入输出一样。

partition的默认实现是hashpartition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。
partition的作用是将数据分到不同的reduce进行计算,加快计算效果
9.hdfs 的数据压缩算法

Hadoop 的压缩算法有很多,其中比较常用的就是gzip算法与bzip2算法,都可以可通过CompressionCodec来实现

10.datanode 在什么情况下不会备份?

Hadoop保存的三个副本如果不算备份的话,那就是在正常运行的情况下不会备份,也是就是在设置副本为1的时候不会备份,说白了就是单台机器呗!!还有datanode 在强制关闭或者非正常断电不会备份

11.hdfs 的体系结构?

HDFS有 namenode、secondraynamenode、datanode 组成。

  • namenode 负责管理 datanode 和记录元数据
  • secondraynamenode 负责合并日志
  • datanode 负责存储数据
12.三个 datanode,当有一个 datanode 出现错误会怎样?

第一不会给储存带来影响,因为有其他的副本保存着,不过建议尽快修复,第二会影响运算的效率,机器少了,reduce在保存数据时选择就少了,一个数据的块就大了所以就会慢

13.mapReduce 的执行过程

首先map端会Text 接受到来自的数据,text可以把数据进行操作,最后通过context把key与value写入到下一步进行计算,一般的reduce接受的value是个集合可以运算,最后再通过context把数据持久化出来

14.文件大小默认为 64M,改为 128M 有啥影响?

这样减少了namenode的处理能力,数据的元数据保存在namenode上,如果在网络不好的情况下会增到datanode的储存速度。可以根据自己的网络来设置大小

15.datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?

这样处理是不合理的,因为那么 namenode 格式化操作,是对文件系统进行格式化,namenode 格式化时清空 dfs/name 下空两个目录下的所有文件,之后,会在目录 dfs.name.dir 下创建文件。

文本不兼容,有可能时 namenode 与 datanode 的 数据里的 namespaceID,clusterID 不一致,找到两个 ID 位置,修改为一样即可解决

16.MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce 框架本质就是一个 Distributed Sort。在 Map阶段,在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce()处理。很多人的误解在 Map 阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载)。由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的

17.hadoop的shuffe的概念

Shuffer是一个过程,实在map端到reduce在调reduce数据之前都叫shuffer,主要是分区与排序,也就是内部的缓存分分区以及分发(是reduce来拉数据的)和传输
(1)Map端的shuffle
    Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。
    在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个partition中的数据再按key来排序。partition的目是将记录划分到不同的Reducer上去,以期望能够达到负载均衡,以后的Reducer就会根据partition来读取自己对应的数据。接着运行combiner(如果设置了的话),combiner的本质也是一个Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生spill文件(spill文件保存在{mapred.local.dir}指定的目录中,Map任务结束后就会被删除)。
    最后,每个Map任务可能产生多个spill文件,在每个Map任务完成前,会通过多路归并算法将这些spill文件归并成一个文件。至此,Map的shuffle过程就结束了。
(2)Reduce端的shuffle
    Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。
    首先要将Map端产生的输出文件拷贝到Reduce端,但每个Reducer如何知道自己应该处理哪些数据呢?因为Map端进行partition的时候,实际上就相当于指定了每个Reducer要处理的数据(partition就对应了Reducer),所以Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据即可。每个Reducer会处理一个或者多个partition,但需要先将自己对应的partition中的数据从每个Map的输出结果中拷贝过来。
    接下来就是sort阶段,也成为merge阶段,因为这个阶段的主要工作是执行了归并排序。从Map端拷贝到Reduce端的数据都是有序的,所以很适合归并排序。最终在Reduce端生成一个较大的文件作为Reduce的输入。
    最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上。

18.Hadoop的优化
(1)优化的思路可以从配置文件和系统以及代码的设计思路来优化

(2)配置文件的优化:调节适当的参数,在调参数时要进行测试

(3)代码的优化:combiner的个数尽量与reduce的个数相同,数据的类型保持一致,可以减少拆包与封包的进度

(4)系统的优化:可以设置linux系统打开最大的文件数预计网络的带宽MTU的配置

(5)为 job 添加一个 Combiner,可以大大的减少shuffer阶段的maoTask拷贝过来给远程的   reduce task的数据量,一般而言combiner与reduce相同。

(6)在开发中尽量使用stringBuffer而不是string,string的模式是read-only的,如果对它进行修改,会产生临时的对象,二stringBuffer是可修改的,不会产生临时对象。

(7)修改一下配置:
19.怎样决定mapreduce的中的map以及reduce的数量

在mapreduce中map是有块的大小来决定的,reduce的数量可以按照用户的业务来配置

20. 两个文件合并的问题:给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

主要的思想是把文件分开进行计算,在对每个文件进行对比,得出相同的URL,因为以上说是含有相同的URL所以不用考虑数据倾斜的问题。详细的解题思路为:

可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中。这样处理后,所有可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1....a999 vs b999)当中,不对应的小文件(比如a0 vs b99)不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 比如对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到文件中即可。 如果分成的小文件不均匀,导致有些小文件太大(比如大于2G),可以考虑将这些太大的小文件再按类似的方法分成小小文件即可

21.hadoop的sequencefile的格式,并说明下什么是JAVA的序列化,如何实现JAVA的序列化

(1)hadoop的序列化(sequencefile)是一二进制的形式来保存的

(2)Java的序列化是讲对象的内容进行流化

(3)实现序列化需要实现Serializable接口便可以了

22.简单概述一下hadoop1与hadoop2的区别

Hadoop2与hadoop1最大的区别在于HDFS的架构与mapreduce的很大的区别,而且速度上有很大的提升,hadoop2最主要的两个变化是:namenode可以集群的部署了,hadoop2中的mapreduce中的jobTracker中的资源调度器与生命周期管理拆分成两个独立的组件,并命名为YARN

23.hadoop join的原理

实现两个表的join首先在map端需要把表标示一下,把其中的一个表打标签,到reduce端再进行笛卡尔积的运算,就是reduce进行的实际的链接操作

24.hadoop的二次排序

Hadoop默认的是HashPartitioner排序,当map端一个文件非常大另外一个文件非常小时就会产生资源的分配不均匀,既可以使用setPartitionerClass来设置分区,即形成了二次分区

25.请描述mapreduce中shuffer阶段的工作流程,如何优化shuffer阶段的?

Mapreduce的shuffer是出在map task到reduce task的这段过程中,首先会进入到copy过程,会通过http方式请求map task所在的task Tracker获取map task 的输出的文件,因此当map task结束,这些文件就会落到磁盘中,merge实在map端的动作,只是在map拷贝过来的数值,会放到内存缓冲区中,给shuffer使用,reduce阶段,不断的merge后最终会把文件放到磁盘中

26.mapreduce的combiner的作用是什么,什么时候不易使用??

Mapreduce中的Combiner就是为了避免map任务和reduce任务之间的数据传输而设置的,Hadoop允许用户针对map task的输出指定一个合并函数。即为了减少传输到Reduce中的数据量。它主要是为了削减Mapper的输出从而减少网络带宽和Reducer之上的负载。
在数据量较少时不宜使用

如何用MR实现全局排序

(1)方式一:reduce数量只设置为1个。缺点:没有用到集群的优势,速度慢。

(2)方式二:自定义分区类partition,按照key值进行分区。
例如:将排序key值为1-1000的数据,使用两个分区,将1-500的key发送到partition1,将501-1000的key发送到partition2。
缺点:1、当数据量大时会出现OOM。2、会出现数据倾斜。

(3)方式三(推荐):
利用TotalOrderPartitioner类。(hive的order by底层也是该方法)
补充:该方法基本原理和方法二类似,只是不再是手动粗糙的进行分区,而是先通过采样,分析数据的分布特征,根据数据的具体特征进行合理的分区(片)