hadoop期末复习

参考:尚硅谷-B站-hadoop3.x教程

尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放_哔哩哔哩_bilibili

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

  • core-site.xml: 主要配置Hadoop核心参数,如文件系统相关的配置。
  • hdfs-site.xml: 配置HDFS参数,包括块大小、副本数量等。
  • mapred-site.xml: 配置MapReduce参数,包括作业跟踪器、任务跟踪器等。
  • yarn-site.xml: 配置YARN参数,包括资源管理器、节点管理器等。

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用户和Hadoop(自己设置的账户)两个用户启动集群不统一

6)配置文件修改不细心

7)不识别主机名称

 4.集群的启动

(1)各个模块分开启动(配置ssh是前提)

确保在hadoop的安装路径下

格式化NameNode(首次启动):hdfs namenode -format

启动HDFS:sbin/start-dfs.sh

启动YARN:sbin/start-yarn.sh

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

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

(3) 用脚本启动

myhadoop.sh start/stop

5.HDFS的优缺点有哪些?

优点:

1)高容错性

数据自动保存多个副本。他通过增加副本的形式,提高容错性。

某个副本丢失以后,他可以自动恢复。

2)适合处理大数据

数据规模:你能处理数据规模达到GB、TB、甚至PB级别的数据。

文件规模:能够处理百万规模以上的文件规模,数量相当之大。

3)构建在廉价机器上,通过多副本机制,提高可靠性

缺点:

1)不适合低延时数据访问

比如不能毫秒级的存储数据。

2)无法高效的对大量小文件进行存储

存储大量小文件,会占用NameNode大量的内存来存储文件目录和块信息。由于NameNode的内存是有限的,这样是不可取的。

小文件存储的寻址时间会超过读取时间,违反HDFS的设计目标。

3)不支持并发写入、文件随机修改

一个文件只能有一个写,不允许多个线程同时写。

只支持数据append(追加),不支持文件的随机修改。

6.HDFS组成架构

NameNode (nn)就是Master,个主管、管理者:

(1)管理HDFS的名称空间;

(2)配置副本策略;

(3)管理数据块 (Block) 映射信息.;

(4)处理客户端读写请求。

DataNode:就是slave, NameNode下达命令,DataNode执行实际的操作:

(1)存储实际的数据块;

(2)执行数据块的读/写操作。

Client: 就是客户端:

(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block, 然后进行上传;

(2)与NameNode交互,获取文件的位置信息;

(3)与DataNode 交互,读取或者写入数据;

(4)client提供一些命令来管理HDFS,比如 NameNode格式化;

(5)Client可以通过一些命令来访问HDFS,比如对HDFS 增删查改操作。

Secondary NameNode: 并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务

(1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送 给NameNode;

(2)在紧急情况下,可辅助恢复NameNode。

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

取决与磁盘传输速率

通常默认块大小为128MB(2.x/3.x)或64MB(1.x),可以在hdfs-site.xml中的dfs.blocksize参数中进行配置

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

命令作用

hadoop fs -ls

显示目录信息
hadoop fs -lsr递归列出该目录及其子目录下的所有文件和目录的详细信息

hadoop fs -mkdir

创建文件夹
hadoop fs -moveFromLocal [本地路径] [剪切路径]从本地剪切粘贴到HDFS

hadoop fs -copyFormLocal [本地路径] [拷贝路径]

hadoop fs -put [] []

从本地拷贝到HDFS

-put与-copyFromLocal等同

hadoop fs -appendToFile [文件路径] [追加文件路径]追加一个文件到已经存在的文件末尾

hadoop fs - copyToLocal

hadoop fs -get [HDFS文件路径] [本地路径] 

从HDFS拷贝到本地
hadoop fs -cat显示文件内容
hadoop fs -tail显示文件末尾1KB数据
hadoop fs -cp从HDFS一个路径拷贝到HDFS另一个路径
hadoop fs -mv在HDFS中移动文件
hadoop fs -rm [-r]删除文件或文件夹(文件夹不为空,要+r), r 是递归删除
hadoop fs -setrep [数字] [HDFS中文件路径]设置HDFS中文件的副本数量

hadop fs -du 

显示相应目录下所有文件和目录的磁盘使用情况

-s 仅显示指定路径从磁盘使用情况

-h 是以人类可读的方式显示,单位不在仅仅是字节,也有KB,MB等

 9.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.网络拓扑-节点距离计算

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

同一机架上的节点共同祖先就是机架

同一集群不同机架上的节点的共同祖先就是集群

不同集群之间的节点共同祖先网络

(如下图,只要经过机架、集群、网络都要 +1)

11.副本存储节点选择

12.HDFS的读流程

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

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

内存

14.Fsimage和Edits解析

Fsimage文件:

HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。

Edits文件:

存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。

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节点掉线时限

DataNode节点掉线时限(Dead Node Detection)是指系统检测到DataNode不再响应的时间阈值。

TimeOut假定为超长时间(默认为10分钟+30秒):

TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval

默认dfs.namenode.heartbeat.recheck-interval为5分钟,dfs.heartbeat.interval默认为3秒

【注意】hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为。 

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
</property>

<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
</property>

17.MapReduce是什么?

MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。

MapReduce核心功能是将用户编写的业务逻辑代码自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。

18.MapReduce优缺点

优点:

(1)MapReduce易于编程

(2)良好的扩展性

(3)高容错性

(4)适合PB级以上海量数据的离线处理

缺点:

1)不擅长实时计算

2)不擅长流式计算

3)不擅长DAG(有向无环图)计算

19.MapReduce核心思想 

(1)分布式的运算程序往往需要分成至少2个阶段。

(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。

(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。

(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。​​​​​​​

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

(1)MrAppMaster:负责整个程序的过程调度及状态协调。

(2)MapTask:负责Map阶段的整个数据处理流程。

(3)ReduceTask:负责Reduce阶段的整个数据处理流程。

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

Mapper

Reducer

Driver 

【注】22~23具体可以参考此图: 

 22.wordcount案例Mapper类代码解析

Mapper阶段

(1)用户自定义的Mapper要继承自己的父类

(2)Mapper的输入数据是KV对的形式(KV类型可自定义)

(3)Mapper中的业务逻辑写在map()方法中

(4)Mapper的输出数据是KV对的形式(KV类型可自定义)

(5)map()方法(MapTask进程)对每一个<K,V>调用一次

 23.wordcount案例Reducer类代码解析

Reduer阶段:

(1)用户自定义的Reduer要继承自己的父类

(2)Reduer的输入数据类型对应Mapper的输出数据类型,也是KV

(3)Reduer的业务逻辑写在reduce()方法中

(4)ReduceTask进程对每一组相同的k的<K,V>组调用依次reduce()方法

 24.Driver驱动类代码解析

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的开启个数由谁决定? 

Maptask的开启个数有提交job时的切片数决定,每一个切片都会交给一个MapTask。

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

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

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

TextInputFormat切片机制

按行读取信息

30.FileInputFormat切片流程是什么

31.FileInputFormat切片机制是什么?

(1)简单地按照文件的内容长度进行切片

(2)切片大小,默认等于Block大小

(3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

32.输入数据有两个文件:

 

如何进行切片?

 

33.源码中计算切片大小的公式理解? 

maxsize(切片最大值):参数如果调得比blockSize小,则会让切片变小,而且切片大小就等于配置的这个参数的值

minsize(切片最小值):参数调得比blockSize大,则可以让切片变得比blockSize大

【注】maxsize和minsize一般只改变一个

34. CombineTextInputFormat切片机制是什么

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

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m

注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。

切片机制:

1)虚拟存储过程

将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较:

(a)如果不大于设置的最大值,逻辑上划分一个块(直接切块);

(b)如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。(先按最大值凑满,剩下的不足凑成两块的时候均分

2)切片过程

(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片。

(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。

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

36.MapReduce的工作流程?

 

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

Map方法之后,Reduce方法之前

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。

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

3次排序

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

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

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

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

100MB

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

80%

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

<k,v>数据和对应的数据索引头

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

对key(键)进行排序,字典顺序排序,排序方法是快速排序

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

程序会正常运行,会产生空结果

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

会报错

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

会正常运行,但只会生成一个文件

分区文件相当于就是预设的结果,reduce task 就是要运行任务,要么任务数大于结果数,要么任务数等于一

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

mapper输出<k,v>类型相同

在 MapReduce 中,Partitioner 用于将 Mapper 输出的键值对按照键(Key)进行分区,以便后续的 Shuffle 和 Reduce 操作。Partitioner 的泛型类型 <K, V> 分别表示键和值的类型,而 Mapper 的输出键值对类型也是 <K, V>。

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

Shuffle阶段

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

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

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

在Driver的job类的job.setNumReduceTasks(Num)

分区的数量决定了ReduceTask的数量

会有一部分数据无处安放,会Exception

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

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

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

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

MapTask和ReduceTask会对数据按照key进行排序

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

环形缓冲区

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

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

Map环形缓冲区溢写之前

内存

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

溢写完毕后,它会对磁盘上所有文件进行归并排序

当所有数据拷贝完毕后,Reduce Task统一对内存和磁盘上的所有数据进行一次归并排序

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

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

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

bean对象做为key传输,需要实现WritableComparable接口重写compareTo方法,就可以实现排序。

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

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基础架构的由那几个模块组成,功能是什么?

ResourceManager、NodeManager、ApplicationMaster和Container

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

(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)MRAppmasterRM 申请运行MapTask资源。

(11)RM运行MapTask任务分配给另外两个NodeManager另两个NodeManager分别领取任务创建容器。

(12)MR向两个接收到任务的NodeManager发送程序启动脚本这两个NodeManager分别启动MapTaskMapTask数据分区排序。

(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask

(14)ReduceTask向MapTask获取相应分区的数据。

(15)程序运行完毕后,MR会向RM申请注销自己。

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

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会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。

yarn: 

HDFS and MapReduce: 

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生产环境核心参数如何配置

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配置参数如下:

<!-- 选择调度器,默认容量 -->
<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)重启集群(确保在安装hadoop的路径下)

$ sbin/stop-yarn.sh
$ sbin/start-yarn.sh

6)执行WordCount程序

$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

7)观察Yarn任务执行页面

http://hadoopXXX:8088/cluster/apps

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

生产环境下怎么创建队列

(1)调度器默认就1个default队列,不能满足生产要求。

(2)按照框架:hive /spark/ flink 每个框架的任务放入指定的队列(企业用的不是特别多)

(3)按照业务模块:登录注册、购物车、下单、业务部门1、业务部门2

配置多队列的容量调度器

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

    向Hive队列提交任务
        [hadoop@hadoop101 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)测试提交任务:

    提交任务时指定队列
        [hadoop@hadoop101 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

    提交任务时不指定队列
        [hadoop@hadoop101 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值