Hive&Hadoop面试常用问题(精修篇)

说明:

该章节主要针对Hive和Hadoop做面试的常用问题做了汇总和解答

1.hadoop常用端口号:

hadoop2.x

hadoop3.x

hdfs端口500709870
MR执行情况端口80888088
JOBHistory1988819888
集群端口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的执行流程

  1. 作业提交(Job Submission): 用户将作业(Job)提交给MapReduce系统。作业包含了一系列的Map和Reduce任务,以及处理数据所需的其他配置信息。

  2. 作业初始化(Job Initialization): MapReduce框架接收到作业后,会进行初始化操作,包括解析作业配置、计算输入数据的分割点等。

  3. 任务分割(Splitting): 输入数据被分割成多个小块,称为splits。这些splits将分别由不同的Map任务处理。

  4. Map阶段(Map Phase): Map任务开始执行,每个Map任务处理一个split,并生成一系列的键值对(key-value pairs)。Map阶段通常用于数据的过滤、转换和聚合。

  5. 分区(Partitioning): Map阶段输出的键值对会根据键(key)进行分区,以便将具有相同键的所有数据传给同一个Reduce任务。

  6. 归并(Shuffling): 不同Map任务生成的数据可能会分布在不同的节点上。Shuffling阶段负责将数据按照分区传输到对应的Reduce任务所在的节点上,并在传输过程中进行必要的排序和合并操作。

  7. Reduce阶段(Reduce Phase): Reduce任务开始执行,它接收来自Map任务的输出,并将具有相同键的所有数据进行汇总和归并,最终生成最终的键值对结果。

  8. 输出(Output): Reduce阶段的输出会被写入到磁盘或其它存储系统中,这标志着数据处理的完成。

  9. 作业完成(Job Completion): 所有任务完成后,MapReduce框架会进行清理工作,并通知用户作业已经完成。

注:精简版本

  1. 作业提交:用户提交作业到MapReduce系统。

  2. Map阶段:输入数据被分割,每个片段由Map任务处理并生成键值对。

  3. Shuffle阶段:Map生成的键值对按键分区并传输到对应的Reduce任务。

  4. 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任务。

特点

  1. 减少数据传输:Combiner通过在Map任务完成后对输出数据进行局部聚合,减少了发送到Reduce任务的数据量。

  2. 与Reducer功能相似:Combiner的逻辑通常与Reducer的逻辑相同或相似,但仅在Map端进行聚合。

  3. 优化性能:通过减少需要跨网络传输的数据量,Combiner可以显著提高MapReduce作业的性能。

  4. 使用场景:Combiner适用于那些Reducer可以接收聚合后数据的场景,例如求和、计数等操作。

  5. Combiner的执行时机:Combiner在Map任务完成后,但在数据被发送到Reduce任务之前执行。

  6. 与环形缓冲区的交互: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可以把自己的资源进行回收了,回收后自己就销毁了)

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值