说明:
该章节主要针对Hive和Hadoop做面试的常用问题做了汇总和解答
1.hadoop常用端口号:
hadoop2.x
hadoop3.x
hdfs端口500709870MR执行情况端口80888088JOBHistory1988819888集群端口90008020
2.Hdfs的读写流程
HDFS数据的写入
第一步 客户端发送写入请求给namenode
第二步 namenode 接受到请求校验权限,文件,存储路径,无误后通知客户端文件可以写入
第三步 客户端收到确认将文件切成许多个默认大小为128m的block,再把block切成64kb的包
**第四步 **客户端将处理好的块信息再次返回给namenode,获取能够储存block的datanode列表
第五步 namenode查看位置较近且不忙的datanode,放入列表中返回给客户端
第六步 客户端连接namenode,并发送packet数据包,第一个datanode接受完以后给客户端ack应答,同时datanode开始复制刚才收到的数据包给node2.node2复制给node3(流式传输)
第七步 其他packet重复第五步的步骤
第八步 其他block重复4-7步
第九步 客户端和namenode互相确认文件数据已经保存完成
HDFS数据的读取
1.客户端发送读取文件请求给namenode
2.namdnode接收到请求,然后进行一系列校验(路径是否存在,文件是否存在,是否有权限等),如果没有问题,就告知可以读取
3.客户端需要再次和namenode确认当前文件在哪些datanode中存储
4.namenode查看当前距离下载位置较近且不忙的datanode,放入列表中返回给客户端
5.客户端找到最近的datanode开始读取文件对应的block块信息(每次传输是以64kb的packet数据包),放到内存缓冲区中
6.接着读取其他block块信息,循环上述3-5步,直到所有block块读取完毕(根据块编号拼接成完整数据)
7.最后从内存缓冲区把数据通过流写入到目标文件中
3.HDFS的常用命令
hdfs dfs -help
hdfs dfs -cat <hdfsfile> # 查看文件内容
hdfs dfs -mkdir <path> # 新建目录
hdfs dfs -put# 上传本地文件到
hdfs dfs -rm# 删除文件或目录
hdfs dfs -get < hdfs path> < localpath> # 将hdfs文件下载到本地
**4.HDFS ****小文件处理 **
小文件的概念:小文件通常指的是那些大小明显小于HDFS默认数据块大小的文件
小文件的影响:(1)极大的占用了NameNode的内存
(2)每个小文件都会起到一个 MapTask,占用了大量计算资源
解決方案:
(1)CombineFileInputFormat:这是一种InputFormat,可以将多个小文件合并成一个单独的split切片,减少map任务的数量
(2)合并小文件:在上传到HDFS之前,可以在本地将多个小文件合并成一个大文件,或者使用HDFS的
appendToFile
命令将多个小文件合并
(3)**Hadoop Archive (HAR)**:使用HAR可以将多个小文件打包成一个HAR文件,减少NameNode的内存使用,同时允许对文件进行透明访问
5.MapReduce的执行流程
- 作业提交(Job Submission): 用户将作业(Job)提交给MapReduce系统。作业包含了一系列的Map和Reduce任务,以及处理数据所需的其他配置信息。
- 作业初始化(Job Initialization): MapReduce框架接收到作业后,会进行初始化操作,包括解析作业配置、计算输入数据的分割点等。
- 任务分割(Splitting): 输入数据被分割成多个小块,称为splits。这些splits将分别由不同的Map任务处理。
- Map阶段(Map Phase): Map任务开始执行,每个Map任务处理一个split,并生成一系列的键值对(key-value pairs)。Map阶段通常用于数据的过滤、转换和聚合。
- 分区(Partitioning): Map阶段输出的键值对会根据键(key)进行分区,以便将具有相同键的所有数据传给同一个Reduce任务。
- 归并(Shuffling): 不同Map任务生成的数据可能会分布在不同的节点上。Shuffling阶段负责将数据按照分区传输到对应的Reduce任务所在的节点上,并在传输过程中进行必要的排序和合并操作。
- Reduce阶段(Reduce Phase): Reduce任务开始执行,它接收来自Map任务的输出,并将具有相同键的所有数据进行汇总和归并,最终生成最终的键值对结果。
- 输出(Output): Reduce阶段的输出会被写入到磁盘或其它存储系统中,这标志着数据处理的完成。
- 作业完成(Job Completion): 所有任务完成后,MapReduce框架会进行清理工作,并通知用户作业已经完成。
注:精简版本
- 作业提交:用户提交作业到MapReduce系统。
- Map阶段:输入数据被分割,每个片段由Map任务处理并生成键值对。
- Shuffle阶段:Map生成的键值对按键分区并传输到对应的Reduce任务。
- Reduce阶段:Reduce任务对同一键的值进行汇总,生成最终结果。
*6.MapReduce***的优化 **
map阶段
(1)增大环形缓冲区的面积大小,由原来的100m扩大到200m
(2)增大环形缓冲区的溢写比例,由80%扩大到90%
(3)减少对溢写文件的merge次数。(10个文件,一次20个merge)
注:
MapReduce中的环形缓冲区
指Map任务的输出缓存区,也称为环形缓冲或环形队列(Circular Buffer)。这个缓冲区用于存储Map任务处理过程中生成的中间键值对(K-V pairs),在Map任务完成后,这些键值对会被排序并发送到相应的Reduce任务
溢写合并
当Map任务的输出数据量超过环形缓冲区时,部分数据会被溢写到磁盘。在Map任务结束后,这些溢写到磁盘的数据会被重新读取并与环形缓冲区中的数据合并。
(4)在不影响业务的情况下,采用Combiner提前合并,减少I/O
注:
Combiner是一个可选组件,它的作用是在Map阶段结束后,对Map输出的数据进行局部聚合。这种局部聚合可以显著减少网络传输的数据量,因为只有聚合后的结果才会被发送到Reduce任务。
特点
- 减少数据传输:Combiner通过在Map任务完成后对输出数据进行局部聚合,减少了发送到Reduce任务的数据量。
- 与Reducer功能相似:Combiner的逻辑通常与Reducer的逻辑相同或相似,但仅在Map端进行聚合。
- 优化性能:通过减少需要跨网络传输的数据量,Combiner可以显著提高MapReduce作业的性能。
- 使用场景:Combiner适用于那些Reducer可以接收聚合后数据的场景,例如求和、计数等操作。
- Combiner的执行时机:Combiner在Map任务完成后,但在数据被发送到Reduce任务之前执行。
- 与环形缓冲区的交互:Combiner的输出可能会被存储在环形缓冲区中,与Map任务的输出一起,等待进一步的合并和排序
combiner和reduce聚合的差异:
Combiner:对单个Map任务的输出进行局部聚合,作用范围限于单个Map的输出。
Reducer:对所有Map任务输出中具有相同键的全局数据进行聚合,作用范围是整个MapReduce作业的输出。
reduce阶段
(1)合理设置Map和Reduce的数量:不宜太多或者太少。太少会导致Task等待,延长处理时间,太多会导致Map和Reduce竞争资源,造成超时处理等策略。
(2)设置Map和Reduce共存:调整slowstart.completemaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间
(3)规避使用Reduce,因为Reduce连接数据集会产生大量的网络消耗
(4)增加每个Reduce去Map中拿数据并行数
(5)集群性能可以的前提下,增大Reduce端存储数据内存的大小
IO传输阶段
(1)采用数据压缩的方式,减少网络IO的时间,安装snappy和lzop压缩编码器
(2)map输入端主要考虑数据量大小和切片,支持切片的有bzip2,lzo等。注:lzo支持切片必须要创建索引
(3)map输出端主要考虑速度,速度快的主要有snappy和lzo
(4)reduce输出端主要看具体需要,例如作为下一个mr输入需要考虑切片,永久保存考虑压缩了比较大gzip。
7.YARN
YARN的三大调度器
(1)Hadoop调度器主要分三类
FIFO、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)
(2)区别
FIFO调度器:支持单队列,先进先出
容量调度器:支持多队列,队列资源优先选择资源占用率最低的队列分配资源,作业资源按照作业的优先级和提交时间分配,容器资源遵循本地原则。
公平调度器:支持多队列,保证每个任务公平享有队列资源。资源不够时按照缺额分配
(3)生产选择
并发度要求比较高,硬件合格,预算充足,选择公平调度器
集群服务资源不够充足,预算有限,选择容量调度器
(4)生产环境下怎么创建队列
a.调度器默认就一个default队列,无法满足生产需求
b.按照框架:HIVE/SPARK/FLINK每个框架的任务放入指定的队列
c.按照业务模块分:登录注册、购物车、业务1、业务2等
(5)在生产环境下怎么合理使用队列
a 担心员工写出递归死循环代码,耗尽资源
b 实现任务的降级使用,特殊时期保证重要的任务队列资源充足
c 业务部门(重要)> 业务部门(比较重要)> 下单(一般)>购物车(一般)>登录注册(次要)
YARN的执行流程
1.客户端提交一个MR程序给ResourceManager
2.如果请求合法,ResourceManager随机选择一个NodeManager用于生成appmaster
3.appmaster会主动向ResourceManager的应用管理器(application manager)注册自己,告知自己的状态信息,并且保持心跳
4.appmaster会根据任务情况计算自己所需要的container资源(cpu,内存...),主动向ResourceManager的资源调度器(resource scheduler)申请并获取这些container资源
5.appmaster获取到container资源后,把对应指令和container分发给其他NodeManager,让NodeManager启动task任务(maptask任务,reducetask任务)
6.NodeManager要和appmaster保持心跳,把自己任务计算进度和状态信息等同步给appmaster,(注意当maptask任务完成后会通知appmaster,appmaster接到消息后会通知reducetask去maptask那儿拉取数据)直到最后任务完成
7.appmaster会主动向ResourceManager注销自己(告知ResourceManager可以把自己的资源进行回收了,回收后自己就销毁了)
版权归原作者 快打钱! 所有, 如有侵权,请联系我们删除。