建议电脑端阅读

这是手机阅读教程 公告

1、集群部署规划主要修改那几个配置文件?

core-site.xml:指定NameNode的地址、指定Hadoop的存储目录、配置HDFS网页登录的静态用户名
hdfs-site.xml: nn Web访问地址、2nn Web访问地址
yarn-site.xml: 指定shuffle、指定ResourceManager的地址、继承环境变量
mapred-site.xml: 指定MapReduce程序运行在Yarn上、历史服务器端地址、历史服务器web端地址

2、集群部署规划有哪些注意事项?

NameNode和SecondaryNameNode不要安装在同一台服务器
ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。

3、集群配置常见错误及解决方案有哪些?

1)防火墙没关闭、或者没有启动YARN
INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
2)主机名称配置错误
3)IP地址配置错误
4)ssh没有配置好
5)root用户和atguigu两个用户启动集群不统一
6)配置文件修改不细心
7)不识别主机名称(解决办法:解决办法:(1)在/etc/hosts文件中添加192.168.10.102 hadoop102(2)主机名称不要起hadoop  hadoop000等特殊名称)
8)DataNode和NameNode进程同时只能工作一个。
9)执行命令不生效,粘贴Word中命令时,遇到-和长–没区分开。导致命令失效
解决办法:尽量不要粘贴Word中代码。
10)jps发现进程已经没有,但是重新启动集群,提示进程已经开启。
原因是在Linux的根目录下/tmp目录中存在启动的进程临时文件,将集群相关进程删除掉,再重新启动集群。
11)jps不生效
原因:全局变量hadoop java没有生效。解决办法:需要source /etc/profile文件。
12)8088端口连接不上

4、集群的启动

(1)各个模块分开启动/停止(配置ssh是前提)常用

整体HDFS:start-dfs.sh/stop-dfs.sh
整体YARN:start-yarn.sh/stop-yarn.sh

(2)各个服务组件逐一启动/停止

分别启动/停止HDFS组件:hdfs --daemon start/stop namenode/datanode/secondarynamenode
启动/停止YARN:yarn --daemon start/stop  resourcemanager/nodemanager

(3)Hadoop集群启停脚本(包含HDFS,Yarn,Historyserver)

myhadoop.sh

5、HDFS的优缺点有哪些

HDFS是分布式文件管理系统,适合一次写入,多次读出的场景。

优点:(1)高容错性、
     (2)适合处理大数据、
     (3)可构建在廉价机器上,通过多副本机制,提高可行性

缺点:(1)不适合低延时数据访问、
     (2)无法高效对大量小文件进行存储、
     (3)不支持并发写入、文件随机修改

6、HDFS组成架构

NameNode(存储文件的元数据(文件名、文件目录结构、文件属性),以及每个文件的快列表和块所在的DataNode等):
    (1)管理HDFS的名称空间;
    (2)配置副本策略;
    (3)管理数据块(Block)映射信息;
    (4)处理客户端读写请求。
DataNode(在本地文件系统存储文件块数据,以及数据块的校验和):
    (1)存储实际的数据块;
    (2)执行数据块的读/写操作。
Client:
    (1)文件切分。文件上传HDFS的时候,client将文件切分成一个一个的Block,然后进行上传;
    (2)与NameNode交互,获取文件的位置信息;
    (3)与DataNode交互,读取或者写入数据;
    (4)Client提供一些命令来管理HDFS,比如NameNode格式化;
    (5)Client可以通过一些命今来访问HDFS,比如对HDFS增删查改操作;
SecondaryNameNode(每隔一段时间对NameNode元数据备份):
    (1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode;
    (2)在紧急情况下,可辅助恢复NameNode。

7、HDFS文件块大小怎么确定的?

128MB:HDFS中的文件在物理上是分块存储 (Block),块的大小可以通过配置参数dfs.blocksize)来规定.
计算公式:传输时间(寻址时间10ms/传输时间1%)*磁盘传输速率100MB/s

为什么HDFS的块大小不能设置太大和太小:
    ——设置太小,会增加寻址时间
    ——设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需时间,导致程序处理这块数据时,非常慢。

8、HDFS的Shell操作常用命令有哪些?

-ls
-cat
-chgrp、-chmod、-chown 文件系统中的用法一样,修改文件所属权限
-mkdir
-cp
-mv 在HDFS目录中移动文件
-tail 显示一个文件的末尾1kb的数据
-rm 删除文件目录
-du 统计文件夹的大小信息
-setrep 设置HDFS中文件的副本数量

9、HDFS的写流程

hdfs

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

10、网络拓扑-节点距离计算

节点距离:两个节点到达最近的共同祖先的距离总和。

11、副本存储节点选择

hadoop2

12、HDFS的读流程

hadoop-3

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

13、NameNode中的元数据是存储在哪里的?

内存+磁盘

元数据的备份:FsImage和Edits
1)第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对元数据进行增删改。
2)第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。

14、Fsimage和Edits解析

hadoop-4
hadoop-5

15、如何保证DataNode节点数据完整性

(1)当DataNode读取Block的时候,它会计算CheckSum。
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
(3)Client读取其他DataNode上的Block。
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum

16、DataNode节点掉线时限

hadoop-6

17、MapReduce是什么?

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

18、MapReduce优缺点

优点:

(1)MapReduce易于编程
(2)良好的扩展性
(3)高容错性
(4)适合PB级以上海量数据的离线处理

缺点:

(1)不擅长实时计算
(2)不擅长流式计算
(3)不擅长DAG(有向无环图)计算

19、MapReduce核心思想

hadoop-7

(1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。

20、一个完整的MapReduce程序在分布式运行时的进程

一个完整的MapReduce程序在分布式运行时有三类实例进程:
(1)MrAppMaster:负责整个程序的过程调度及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据处理流程。

21、用户编写的程序分成那几个部分

Mapper
Reducer
Driver

22、wordcount案例Mapper类代码解析

(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5) map()方法(MapTask进程) 对每一个<K,V>调用一次

23、wordcount案例Reducer类代码解析

(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4) ReduceTask进程对每一组相同k的<kv>组调用一次reduce()方法

24、Driver驱动类代码解析

相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象

25、序列化注意问题

(1)必须实现Writable接口
(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造
(3)重写序列化方法
(4)重写反序列化方法
(5)注意反序列化的顺序和序列化的顺序完全一致
(6)要想把结果显示在文件中,需要重写toString(),可用"\t"分开,方便后续用。
(7)如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序。

26、Job的提交流程

(1)源码connect()函数功能是什么?

(1)创建提交Job的代理
(2)判断是本地运行环境还是yarn集群运行环境

(2)集群模式或者本地模式分别要提交那些内容?

集群

Jar包、job.xml文件、job路径、.split切片信息

本地

job.xml文件、job路径、.split切片信息

27、Maptask的开启个数由谁决定?

Map任务的开启个数由输入数据的切片数决定。每个输入切片会启动一个Map任务。
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m

hadoop-6

(1)虚拟存储过程:

将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。

(2)切片过程:

(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
(c)测试举例:有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件,则虚拟存储之后形成6个文件块,大小分别为:
1.7M,(2.55M、2.55M),3.4M以及(3.4M、3.4M)
最终会形成3个切片,大小分别为:
(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M

28、在运行MapReduce程序时,输入的文件格式包括那些?

基于行的日志文件、二进制格式文件、数据库表等。

29、默认是按什么样的模式进行切片的?是如何读取信息的?

TextInputFormat切片机制
按行读取

30、FileInputFormat切片流程是什么?

hadoop-9

31、FileInputFormat切片机制是什么?

(1)简单地按照文件的内容长度进行切片
(2)切片大小,默认等于Block大小
(3)切片时不考虑数据集整体,而是逐个针对每个文件进行单独切片

32、切片划分

hadoop-10

33、切片参数

hadoop-11

34、CombineTextInputFormat切片机制是什么?

CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。

生成切片过程包括:虚拟存储过程和切片过程二部分。
(1)虚拟存储过程:
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。
(2)切片过程:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。

35、如下几个文件如何切片?

hadoop-12

(c)测试举例:有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件,则虚拟存储之后形成6个文件块,大小分别为:
1.7M,(2.55M、2.55M),3.4M以及(3.4M、3.4M)
最终会形成3个切片,大小分别为:
(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M

36、MapReduce的工作流程?

hadoop-13
hadoop-14

上面的流程是整个MapReduce最全工作流程,但是Shuffle过程只是从第7步开始到第16步结束,具体Shuffle过程详解,如下:
(1)MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
(3)多个溢出文件会被合并成大的溢出文件
(4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
(5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
(6)ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
(7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)
注意:
(1)Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。
(2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb默认100M。

37、Shuffle位于MapReduce流程中的哪个阶段?

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。

38、MapReduce的工作流程中出现了几次排序,分别在哪个阶段,采用的是什么类型的排序方法,并说明原因?

3次排序

第一次:Map阶段环形缓冲区溢写前先按照分区编号Partition进行快速排序,然后按照key进行快速排序(升序)。
数据是乱序,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序,方便后续的排序

第二次:Map的Merge阶段对溢写的文件(key)进行归并排序(升序)
对第一次排序后的部分有序的数据进行高效排序与合并,最终得到一个大文件

第三次:Reduce的Sort阶段对key进行归并排序
由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可

39、Shuffle阶段缓冲区的大小默认是多少?

100MB

40、Shuffle阶段缓冲区的使用率一般达到多少比例后进行反向溢写?

80%

41、缓冲区主要存储哪些数据?

索引(index,partition,keystart,valstart)与数据(key,value)

42、在溢写之前,需要进行排序,对什么进行排序,按照什么顺序进行排序?

对缓冲区的中间键值对进行排序
按照升序

43、ReduceTask的数量大于分区数量,会出现什么样的结果?

产生出几个空的输出文件

44、ReduceTask的数量大于1,但小于分区数量,会出现什么样的结果?

会产生IO异常

45、当ReduceTask的数量等于1时,分区文件不小于1时,会出现什么样的结果?

所有数据都输出到1个文件中

46、Partitioner<k,v>的类型与mapper的输入<k,v>还是输出<k,v>的类型相同?

mapper的输出

47、分区是在MapReduce框架中哪一个阶段进行的?

shuffle阶段

48、默认分区是如何分配的?

hadoop-15

49、自定义分区步骤是什么?

hadoop-16

50、ReduceTasks的数量在哪里设置,与分区的关系是什么?ReduceTaste的数量小于分区数量且大于1会产生什么样的后果?

在Driver的job类的job.setNumReduceTasks(Num)中设置

默认情况下,分区的数量与Reduce任务的数量相同。每个Reduce任务对应一个分区。Hadoop框架使用默认的HashPartitioner来根据键的哈希值将数据分发到这些分区。

hadoop17

51、以自定义分区为案例,解释面向对象编程中的多态

Partitioner 是一个抽象类,定义了在MapReduce中用于数据分区的方法。ProvincePartitioner
类覆写了这个方法,提供了根据手机号前三位进行分区的具体逻辑。这体现了多态,
因为ProvincePartitioner 类被当做 Partitioner 类型使用,而它的具体实现取决于它的子类。

Partitioner<Text, FlowBean> 中的泛型 <Text, FlowBean> 指定了 Partitioner 
类的类型参数。这使得 Partitioner 类能够处理键类型为 Text、值类型为 FlowBean 的数据,体现了多态.

52、MapTask和ReduceTask的数据排序是以什么标准来排的?

基于key的字典序,按照升序来排的。

53、对于MapTask,它会将处理的结果暂时放到哪里的?

处理的结果暂时放到环形缓冲区中,当环形缓冲区使⽤率达到⼀定阈值后,再对缓冲区中的数据进行⼀次快速排序,并将这些有序数据溢写到磁盘上。

54、MapReduce框架中的快速排序最先在那个时候进行排序?排序是在哪里进行的?

Map阶段环形缓冲区溢写前的时候

在内存中的环形缓冲区中进行

55、什么时候进行归并排序?

Map的Merge阶段对溢写的文件(key)进行归并排序

Reduce的Sort阶段统一对key进行归并排序

56、默认排序是按照什么标准进行排序的?

默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。

57、如何实现自定义排序?

使‘键’实现WritableComparable接口重写compareTo方法,并实现序列化和反序列化。

58、排序的类型有哪些,分别对应什么样的应用场景?

(1)部分排序
MapRechice根据输入记录的键对数据集排序。保证输出的每个文件内部有序。

(2)全排序
最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTas。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。

(3)辅助排序: (GroupingComparator分组)
在Reduce端对key进行分组。应用于: 在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key#入到同一个recce方法时,可以采用分组排序。

(4)二次排序
在自定义排序过程中,如果commpareTo中的判断条件为两个即为二次排序。

59、Combiner的应用场景是什么?在那个阶段可以Combiner?如何进行自定义的Combiner?

应用场景:
    Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减小网络传输量,Combiner能够应用的前提是不能影响最终的业务逻辑,而且,Combiner的输出kv应该跟Reducer的输入kv类型要对应起来。

阶段:
    shuffle阶段中的溢出和和溢出后归并排序后可以Combiner

如何自定义:
    (a)自定义一个Combiner继承Reducer,重写reduce方法
    (b)在Job驱动类中设置:  
        job.setCombinerClass(XXXCombiner.class);

60、OutputFormat什么时候进行?有哪些应用场景?如何自定义OutputFormat数据输出?

在Reduce环节的最后末尾,写出数据之前。

应用场景:
    输出数据到MySQL/HBase/Elasticseach等存储框架中。

如何:
    自定义一个类继承FileOutputFormat
    改写RecordWriter,具体改写输出数据的方法write().
    设置job:
        job.setOutputFormatClass(XXXOutputFormat.class);

61、Yarn基础架构的由那几个模块组成,功能是什么?

YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

hadoop-18

62、Yarn的工作机制是什么?

hadoop-19

(1)MR程序提交到客户端所在的节点。
(2)YarnRunner向ResourceManager申请一个Application。
(3)RM将该应用程序的资源路径返回给YarnRunner。
(4)该程序将运行所需资源提交到HDFS上。
(5)程序资源提交完毕后,申请运行mrAppMaster。
(6)RM将用户的请求初始化成一个Task。
(7)其中一个NodeManager领取到Task任务。
(8)该NodeManager创建容器Container,并产生MRAppmaster。
(9)Container从HDFS上拷贝资源到本地。
(10)MRAppmaster向RM 申请运行MapTask资源。
(11)RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(12)MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
(14)ReduceTask向MapTask获取相应分区的数据。
(15)程序运行完毕后,MR会向RM申请注销自己。

63、对作业提交全过程详细解释?

hadoop-20
hadoop-21

(1)作业提交
第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:Client向RM申请一个作业id。
第3步:RM给Client返回该job资源的提交路径和作业id。
第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步:Client提交完资源后,向RM申请运行MrAppMaster。
(2)作业初始化
第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
第7步:某一个空闲的NM领取到该Job。
第8步:该NM创建Container,并产生MRAppmaster。
第9步:下载Client提交的资源到本地。
(3)任务分配
第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
(4)任务运行
第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
第14步:ReduceTask向MapTask获取相应分区的数据。
第15步:程序运行完毕后,MR会向RM申请注销自己。
(5)进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
(6)作业完成
除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。

64、Yarn调度器有哪些?对应的调度算法是什么?

FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
    

容量调度器(Capacity Scheduler):
    多级队列,将集群的资源划分为多个队列,每个队列可以设置一定的容量。每个队列内使用FIFO调度算法。

公平调度器(Fair Scheduler): 
    公平分享资源,允许多个作业共享集群资源,尽量保证每个作业获得相等的资源份额。

65、Apache Hadoop3.1.3和CDH默认的资源调度器是什么?

Apache Hadoop3.1.3默认的资源调度器是容量调度器Capacity Scheduler
CDH框架默认调度器是公平调度器Fair Scheduler。

66、公平调度器和容量调度器之间的相同点和不同点?

相同点:

(1) 多队列: 支持多队列多作业
(2)容量保证:管理员可为每个队列设置资源最低保证和资源使用上线(3)灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(4)多租户:支持多用户共享集群和多应用程序同时运行,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

不同点:

(1)核心调度策略不同
容量调度器:优先选择资源利用率低的队列
公平调度器:优先选择对资源的缺额比例大的

(2)每个队列可以单独设置资源分配方式
    容量调度器: FIFO、DRF
    公平调度器: FIFO、FAIR、DRF

67、Yarn的常用命令有哪些?

列出所有
    Application: yarn application -list

根据Application状态过滤:
    yarn application -list -appStates 

Kill掉Application:
    yarn application -kill application_1612577921195_0001

查询Application日志:
    yarn logs -applicationId <ApplicationId>

查询Container日志:
    yarn logs -applicationId <ApplicationId> -containerId <ContainerId>

列出所有Application尝试的列表:
    yarn applicationattempt -list <ApplicationId>

打印ApplicationAttemp状态:
    yarn applicationattempt -status <ApplicationAttemptId>

列出所有Container:
    yarn container -list <ApplicationAttemptId>

打印Container状态:
	yarn container -status <ContainerId>

列出所有节点:
    yarn node -list -all

加载队列配置:
    yarn rmadmin -refreshQueues

打印队列信息:
    yarn queue -status <QueueName>

68、Yarn生产环境核心参数如何配置?

hadoop-22

69、Yarn核心参数配置案例实操:

(1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。

(2)需求分析:
1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster
平均每个节点运行10个 / 3台 ≈ 3个任务(4,3,3)

(3)修改yarn-site.xml配置参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<!-- 选择调度器,默认容量 -->
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

<!-- ResourceManager处理调度器请求的线程数量,默认50;如果提交的任务数大于50,可以增加该值,但是不能超过3台 * 4线程 = 12线程(去除其他应用程序实际不能超过8) -->
<property>
<description>Number of threads to handle scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>8</value>
</property>

<!-- 是否让yarn自动检测硬件进行配置,默认是false,如果该节点有很多其他应用程序,建议手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
<description>Enable auto-detection of node capabilities such as
memory and CPU.
</description>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>false</value>
</property>

<!-- 是否将虚拟核数当作CPU核数,默认是false,采用物理CPU核数 -->
<property>
<description>Flag to determine if logical processors(such as
hyperthreads) should be counted as cores. Only applicable on Linux
when yarn.nodemanager.resource.cpu-vcores is set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true.
</description>
<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
<value>false</value>
</property>

<!-- 虚拟核数和物理核数乘数,默认是1.0 -->
<property>
<description>Multiplier to determine how to convert phyiscal cores to
vcores. This value is used if yarn.nodemanager.resource.cpu-vcores
is set to -1(which implies auto-calculate vcores) and
yarn.nodemanager.resource.detect-hardware-capabilities is set to true. The number of vcores will be calculated as number of CPUs * multiplier.
</description>
<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
<value>1.0</value>
</property>

<!-- NodeManager使用内存数,默认8G,修改为4G内存 -->
<property>
<description>Amount of physical memory, in MB, that can be allocated
for containers. If set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically calculated(in case of Windows and Linux).
In other cases, the default is 8192MB.
</description>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>

<!-- nodemanager的CPU核数,不按照硬件环境自动设定时默认是8个,修改为4个 -->
<property>
<description>Number of vcores that can be allocated
for containers. This is used by the RM scheduler when allocating
resources for containers. This is not used to limit the number of
CPUs used by YARN containers. If it is set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically determined from the hardware in case of Windows and Linux.
In other cases, number of vcores is 8 by default.</description>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>

<!-- 容器最小内存,默认1G -->
<property>
<description>The minimum allocation for every container request at the RM in MBs. Memory requests lower than this will be set to the value of this property. Additionally, a node manager that is configured to have less memory than this value will be shut down by the resource manager.
</description>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>

<!-- 容器最大内存,默认8G,修改为2G -->
<property>
<description>The maximum allocation for every container request at the RM in MBs. Memory requests higher than this will throw an InvalidResourceRequestException.
</description>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>

<!-- 容器最小CPU核数,默认1个 -->
<property>
<description>The minimum allocation for every container request at the RM in terms of virtual CPU cores. Requests lower than this will be set to the value of this property. Additionally, a node manager that is configured to have fewer virtual cores than this value will be shut down by the resource manager.
</description>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>

<!-- 容器最大CPU核数,默认4个,修改为2个 -->
<property>
<description>The maximum allocation for every container request at the RM in terms of virtual CPU cores. Requests higher than this will throw an
InvalidResourceRequestException.</description>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>

<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
<description>Whether virtual memory limits will be enforced for
containers.</description>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

<!-- 虚拟内存和物理内存设置比例,默认2.1 -->
<property>
<description>Ratio between virtual memory to physical memory when setting memory limits for containers. Container allocations are expressed in terms of physical memory, and virtual memory usage is allowed to exceed this allocation by this ratio.
</description>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>

(4)分发配置。

(5)重启集群

[atguigu@hadoop102 hadoop-3.1.3]$ sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

(6)执行WordCount程序

(7)观察Yarn任务执行页面

http://hadoop103:8088/cluster/apps

70、在生产环境怎么容量调度器如何创建队列?公平调度器如何创建队列?

配置多队列的容量调度器

(1)配置capacity-scheduler.xml
(2)分发配置文件
(3)重启Yarn或者执行yarn rmadmin -refreshQueues刷新队列,就可以看到两条队列
(4)提交任务方式:

    向Hive队列提交任务
        [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output
    注: -D表示运行时改变参数值

    Driver中声明:
        conf.set("mapreduce.job.queuename","hive");

配置多队列的公平调度器

(1)配置yarn-site.xml
(2)配置fair-scheduler.xml
(3)分发配置并重启Yarn
(4)测试提交任务:

    提交任务时指定队列
        [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=root.test 1 1

    提交任务时不指定队列
        [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

71、如何实现Tool接口,进而实现命令行动态传参?

(1)新建Maven项目YarnDemo.pom
(2)新建com.atguigu.yarn包名
(3)创建类WordCount并实现Tool接口
(4)新建WordCountDriver
(5)在HDFS上准备输入文件,假设为/input目录,向集群提交该Jar包
    yarn jar YarnDemo.jar com.atguigu.yarn.WordCountDriver wordcount /input /output