一.Hadoop
目录
9.Hadoop中combiner和partition的作用
12.MapReduce的map数量和reduce数量是由什么决定的,怎么配置
14.分别举例什么情况要使用combiner,什么情况不使用?
17.在通过客户端向hdfs中写数据的时候,如果某一台机器宕机了,会怎么处理?
19.大量数据求TOPN(写出MapReduce的实现思路)
20.列出正常工作的Hadoop集群中Hadoop都分别启动哪些进程以及他们的作用
1.hdfs写流程
2.hdfs读流程
3.hdfs体系结构
hdfs有namenode、secondraynamenode、datanode组成。为n+1模式
-
NameNode负责管理和记录整个文件系统的元数据
-
DataNode 负责管理用户的文件数据块,文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上,每一个文件块可以有多个副本,并存放在不同的datanode上,Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
-
HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
-
secondraynamenode负责合并日志
4.一个DataNode宕机,怎么一个流程恢复。
Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,那么datanode上的数据应该已经被备份到其他机器了,那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动。
5.Hadoop的namenode宕机怎么解决?
先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
6.namenode对元数据的管理
namenode对数据的管理采用了三种存储形式:
-
内存元数据(NameSystem)
-
磁盘元数据镜像文件(fsimage镜像)
-
数据操作日志文件(可通过日志运算出元数据)(edit日志文件)
7.元数据的checkpoint
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
1.secondary namenode请求主Namenode停止使用edits文件,暂时将新的写操作记录到一个新文件中,如edits.new。
2.secondary namenode节点从主Namenode节点获取fsimage和edits文件(采用HTTP GET)
3.secondary namenode将fsimage文件载入到内存,逐一执行edits文件中的操作,创建新的fsimage文件
4.secondary namenode将新的fsimage文件发送回主Namenode(使用HTTP POST)
5.主Namenode节点将从secondary namenode节点接收的fsimage文件替换旧的fsimage文件,用步骤1产生的edits.new文件替换旧的edits文件(即改名)。同时更新fstime文件来记录检查点执行的时间
namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据
8.yarn资源调度流程
`ResourceManager`:负责任务资源的统一调度,管理NodeManager资源,启动MRAppMaster
`NodeManager`:用于管理本机上的计算资源,默认会将本机的计算资源拆分为8个等份,每个等份抽象成Container
`MRAppMaster`:任何一个执行的任务都会有一个MRAppMaster负责YarnChild任务的执行和监测。
`YarnChild`:是具体执行的MapTask或者是ReduceTask的统称。
任务执行期间系统会启动MRAppmaster和YarnChild负责任务的执行,一旦任务执行结束MRAppMaster和YarnChild会自动退出。
-
用户向YARN 中提交应用程序, 其中包括ApplicationMaster 程序、启动ApplicationMaster 的命令、用户程序等。
-
ResourceManager 为该应用程序分配第一个Container, 并与对应的NodeManager 通信,要求它在这个Container 中启动应用程序的ApplicationMaster。
-
ApplicationMaster 首先向ResourceManager 注册, 这样用户可以直接通过ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
-
ApplicationMaster 采用轮询的方式通过RPC 协议向ResourceManager 申请和领取资源。
-
一旦ApplicationMaster 申请到资源后,便与对应的NodeManager 通信,要求它启动任务。
-
NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
-
各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
-
应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。
9.Hadoop中combiner和partition的作用
-
combiner是发生在map的最后一个阶段,父类就是Reducer,意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量,缓解网络传输瓶颈,提高reducer的执行效率。
-
partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理,可以将reduce阶段的处理负载进行分摊
10.用MapReduce怎么处理数据倾斜问题?
数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
(1)局部聚合加全局聚合。
第一次在 map 阶段对那些导致了数据倾斜的 key 加上 1 到 n 的随机前缀,这样本来相同的 key 也会被分到多个 Reducer 中进行局部聚合,数量就会大大降低。
第二次 mapreduce,去掉 key 的随机前缀,进行全局聚合。
思想:二次 mr,第一次将 key 随机散列到不同 reducer 进行处理达到负载均衡目的。第二次再根据去掉 key 的随机前缀,按原 key 进行 reduce 处理。
这个方法进行两次 mapreduce,性能稍差。
(2)增加 Reducer,提升并行度
JobConf.setNumReduceTasks(int)
(3)实现自定义分区
根据数据分布情况,自定义散列函数,将 key 均匀分配到不同 Reducer
11.shuffle阶段,你怎么理解的
MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle。总体来说shuffle核心流程主要包括以下几个方面:数据分区、缓冲区、排序、溢写、局部聚合/Combiner、抓取/Fetch、归并排序等。
-
maptask收集我们的map()方法输出的kv对,先进入分区方法,把数据标记好分区,然后把数据发送到内存缓冲区(默认100M)中
-
当环形缓冲区达到80%时,进行溢写,从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 (溢写前对数据进行快速排序,排序按照key的索引进行字典顺序排序)
-
多个溢出文件会被合并成大的溢出文件(归并排序算法),对溢写的文件也可以进行combiner操作,前提是汇总操作,求平均值不行。
-
在溢出过程中,及合并的过程中,都要调用partitoner进行分组和针对key进行排序
-
reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据,拉取的数据先存储在内存中,内存不够了,再存储到磁盘。
-
reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)
-
合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)
Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快
缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M
12.MapReduce的map数量和reduce数量是由什么决定的,怎么配置
map的数量由输入切片的数量决定,128M切分一个切片,只要是文件也分为一个切片,有多少个切片就有多少个map Task。
reduce数量自己配置。
13.MapReduce优化经验
-
设置合理的map和reduce的个数。合理设置blocksize
-
避免出现数据倾斜
-
combine函数
-
对数据进行压缩
-
小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:文件名,value:文件内容)
-
参数优化
14.分别举例什么情况要使用combiner,什么情况不使用?
求平均数的时候就不需要用combiner,因为不会减少reduce执行数量。在其他的时候,可以依据情况,使用combiner,来减少map的输出数量,减少拷贝到reduce的文件,从而减轻reduce的压力,节省网络开销,提升执行效率
15.MapReduce运行流程解析
1.一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动相应数量的maptask进程
2.maptask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:
-
利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对
-
将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存
-
将缓存中的KV对按照K分区排序后不断溢写到磁盘文件
3.MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
4.Reducetask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果数据输出到外部存储
16.简单描述下HDFS的系统架构,怎么保证数据安全?
-
存储在HDFS系统上的文件,会分割成128M大小的block存储在不同的节点上,block的副本数默认3份,也可配置成更多份;
-
第一个副本一般放置在与client(客户端)所在的同一节点上(若客户端无datanode,则随机放),第二个副本放置到与第一个副本同一机架的不同节点,第三个副本放到不同机架的datanode节点,当取用时遵循就近原则;
-
datanode以block为单位,每3s报告心跳状态,当10min内不报告心跳状态则namenode认为block已死掉,namonode会把其上面的数据备份到其他一个datanode节点上,保证数据的副本数量;
-
datanode会默认每小时把自己节点上的所有块状态信息报告给namenode;
-
采用safemode模式:datanode会周期性的报告block信息。Namenode会计算block的损坏率,当阀值<0.999f时系统会进入安全模式,HDFS只读不写。HDFS元数据采用secondaryname备份或者HA备份
17.在通过客户端向hdfs中写数据的时候,如果某一台机器宕机了,会怎么处理?
在写入的时候不会重新重新分配datanode。如果写入时,一个datanode挂掉,会将已经写入的数据放置到queue的顶部,并将挂掉的datanode移出pipline,将数据写入到剩余的datanode,在写入结束后, namenode会收集datanode的信息,发现此文件的replication没有达到配置的要求(default=3),然后寻找一个datanode保存副本。
18.Hadoop优化有哪些方面?
0)HDFS 小文件影响
(1)影响 NameNode 的寿命,因为文件元数据存储在 NameNode 的内存中
(2)影响计算引擎的任务数量,比如每个小的文件都会生成一个 Map 任务
1)数据输入小文件处理:
(1)合并小文件:对小文件进行归档(Har)、自定义 Inputformat 将小文件存储成SequenceFile 文件。
(2)采用 ConbinFileInputFormat 来作为输入,解决输入端大量小文件场景。
(3)对于大量小文件 Job,可以开启 JVM 重用。
2)Map 阶段
(1)增大环形缓冲区大小。由 100m 扩大到 200m
(2)增大环形缓冲区溢写的比例。由 80%扩大到 90%
(3)减少对溢写文件的 merge 次数。(10 个文件,一次 20 个 merge)
(4)不影响实际业务的前提下,采用 Combiner 提前合并,减少 I/O。
3)Reduce 阶段
(1)合理设置 Map 和 Reduce 数:两个都不能设置太少,也不能设置太多。太少,会导致 Task 等待,延长处理时间;太多,会导致 Map、Reduce 任务间竞争资源,造成处理超时等错误。
(2)设置 Map、Reduce 共存:调整 slowstart.completedmaps 参数,使 Map 运行到一定程度后,Reduce 也开始运行,减少 Reduce 的等待时间。
(3)规避使用 Reduce,因为 Reduce 在用于连接数据集的时候将会产生大量的网络消耗。
(4)增加每个 Reduce 去 Map 中拿数据的并行数
(5)集群性能可以的前提下,增大 Reduce 端存储数据内存的大小。
4)IO 传输
(1)采用数据压缩的方式,减少网络 IO 的的时间。安装 Snappy 和 LZOP 压缩编码器。
(2)使用 SequenceFile 二进制文件
5)整体
(1)MapTask 默认内存大小为 1G,可以增加 MapTask 内存大小为 4-5g
(2)ReduceTask 默认内存大小为 1G,可以增加 ReduceTask 内存大小为 4-5g
(3)可以增加 MapTask 的 cpu 核数,增加 ReduceTask 的 CPU 核数
(4)增加每个 Container 的 CPU 核数和内存大小
(5)调整每个 Map Task 和 Reduce Task 最大重试次数
19.大量数据求TOPN(写出MapReduce的实现思路)
要找出 top N, 核心是能够想到 the number of reduce tasks is one。因为一个 map task 就是一个进程,有几个 map task 就有几个中间文件,有几个 reduce task 就有几个最终输出文件。我们要找的 top N 是指的全局的前 N 条数据,那么不管中间有几个 map, reduce 最终只能有一个 reduce 来汇总数据,输出 top N。
-
Mapper 过程
- 使用默认的 mapper 数据,一个 input split(输入分片)由一个 mapper 来处理。
- 在每一个 map task 中,我们找到这个 input split 的前 n 个记录。这里我们用 TreeMap 这个数据结构来保存 top n 的数据, TreeMap 默认按键的自然顺序升序进行排序。下一步,我们来加入新记录到 TreeMap 中去。在 map 中,我们对每一条记录都尝试去更新 TreeMap,最后我们得到的就是这个分片中的 local top n 的 n 个值。
- 以往的 mapper 中,我们都是处理一条数据之后就 context.write 一次。而在这里是把所有这个 input split 的数据处理完之后再进行写入。所以,我们可以把这个 context.write 放在 cleanup 里执行。 cleanup 就是整个 mapper task 执行完之后会执行的一个函数。
-
Reducer 过程
- 只有一个 reducer,就是对 mapper 输出的数据进行再一次汇总,选出其中的 top n,即可达到我们的目的。 注意的是, Treemap 默认是正序排列数据,要想满足求取 top n 倒序最大的 n 个,需要实现自己的 Comparator() 方法。
20.列出正常工作的Hadoop集群中Hadoop都分别启动哪些进程以及他们的作用
1.NameNode它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。
2.SecondaryNameNode替namenode合并fsimage和edits文件,减少NN启动时间。
3.DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。
4.ResourceManager 管理hadoop集群的运算资源和存储资源,为大数据运算提供统一的资源调度、管理服务;
5.NodeManager收集本机cpu、磁盘等设备的使用情况,作为心跳发送给resourcemanager。
6.DFSZKFailoverController高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。
21.Hadoop总job和Tasks之间的区别是什么
Job是我们对一个完整的mapreduce程序的抽象封装
Task是job运行时,每一个处理阶段的具体实例,如map task,reduce task,maptask和reduce task都会有多个并发运行的实例
22.Hadoop高可用HA模式
HDFS高可用原理:
Hadoop HA(High Available)通过同时配置两个处于Active/Passive模式的Namenode来解决上述问题,状态分别是Active和Standby. Standby Namenode作为热备份,从而允许在机器发生故障时能够快速进行故障转移,同时在日常维护的时候使用优雅的方式进行Namenode切换。Namenode只能配置一主一备,不能多于两个Namenode。
主Namenode处理所有的操作请求(读写),而Standby只是作为slave,维护尽可能同步的状态,使得故障时能够快速切换到Standby。为了使Standby Namenode与Active Namenode数据保持同步,两个Namenode都与一组Journal Node进行通信。当主Namenode进行任务的namespace操作时,都会确保持久会修改日志到Journal Node节点中。Standby Namenode持续监控这些edit,当监测到变化时,将这些修改同步到自己的namespace。
当进行故障转移时,Standby在成为Active Namenode之前,会确保自己已经读取了Journal Node中的所有edit日志,从而保持数据状态与故障发生前一致。
为了确保故障转移能够快速完成,Standby Namenode需要维护最新的Block位置信息,即每个Block副本存放在集群中的哪些节点上。为了达到这一点,Datanode同时配置主备两个Namenode,并同时发送Block报告和心跳到两台Namenode。
确保任何时刻只有一个Namenode处于Active状态非常重要,否则可能出现数据丢失或者数据损坏。当两台Namenode都认为自己的Active Namenode时,会同时尝试写入数据(不会再去检测和同步数据)。为了防止这种脑裂现象,Journal Nodes只允许一个Namenode写入数据,内部通过维护epoch数来控制,从而安全地进行故障转移。
23.简单描述安装配置一个Hadoop集群的步骤
-
使用root账户登录。
-
修改IP。
-
修改Host主机名。
-
配置SSH免密码登录。
-
关闭防火墙。
-
安装JDK。
-
上传解压Hadoop安装包。
-
配置Hadoop的核心配置文件hadoop-evn.sh,core-site.xml,mapred-site.xml,hdfs-site.xml,yarn-site.xml
-
配置hadoop环境变量
-
格式化hdfs # bin/hadoop namenode -format
-
启动节点start-all.sh
24.fsimage和edit的区别
fsimage:filesystem image 的简写,文件镜像。
客户端修改文件时候,先更新内存中的metadata信息,只有当对文件操作成功的时候,才会写到editlog。
fsimage是文件meta信息的持久化的检查点。secondary namenode会定期的将fsimage和editlog合并dump成新的fsimage
25.yarn的三大调度策略
FIFO Scheduler
把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。
Capacity Scheduler
容量调度,维持多个队列,为每个队列提前分配固定比例的资源,允许多个任务同时运行,但使用的资源只有该队列拥有的资源量;如果其它队列空闲,允许借用小部分资源,但其它队列有任务时借用的资源马上被还回。
这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
Fair Scheduler
我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
26.Hadoop的常用shell命令
1、Hadoop fs -ls:显示目录下的文件;
2、hadoop fs -cat:显示文件的数据;
3、hadoop fs -mkdir:创建目录,-p可以强制创建原来没有的上级目录;
4、hadoop fs -rm [-r]:删除文件;如果加上-r则递归删除,主要用于目录,谨慎使用,尤其是对/目录;
5、hadoop fs -chown:改变文件所属人;
6、hadoop fs -put:将本地文件系统的文件上传到hdfs上;
7、hadoop fs -get:将hdfs上的文件下载到本地文件系统中。
27.用MapReduce实现用户pv的top10
map输入数据,将数据转换成(用户,访问次数)的键值对,然后reduce端实现聚合,并且将结果写入用户、访问次数的实体类,并且实现排序,最后的结果做一个top10的筛选
28.一个文件只有一行,但是这行有100G大小,MapReduce会不会切分,我们应该怎么解决
由于分片时是按照长度进行分片的,那就有很大可能会把一行数据分在两个片里面,所以分片的时候确实会断行。如果读取并处理断行的数据,就会导致结果不正确,那是肯定不行的。所以LineRecordReader类就充当了读取记录的角色,保证读取不断行;其中nextKeyValue()方法里是真正给Mapper中的key赋值的地方,并且调用了父类LineReader类中的readLine()方法来给value赋值。