1、请讲述HDFS输入文件的具体步骤?

1、Client向NameNode 提交需要上传文件的申请

2、NameNode返回响应给Client,同意上传文件的请求

3、Client向NameNode 申请子节点DataNode.

4、NameNode 响应给Client它的子节点DataNode

5、Client 向DataNode提交申请建立传输通道。

6、DataNode 依次响应连接 (dn1,dn2,dn3)

7、Client 向DataNode上传一个Block,DataNode1向其他子节点
( dn1 传给 dn2 ,dn2 传给dn3),dn1 每传一个packet 会放入一个应答

hadoop和spark面试题 hadoop面试题2020_java

2、请讲述HDFS读取文件的步骤?

1、Client 向NameNode申请下载文件

2、收到请求 NameNode向Client返回文件的元数据

3、Client 向DataNode1 请求 访问 读数据Block_1

4、DataNode1 向Client 传输数据。

5、Client向DataNode2 请求 访问 读数据 Block_2

6、DataNode2 向Client 传输数据。

3、请问运行hadoop 集群需要那些守护进程?

DataNode ,NameNode,TaskTracker,JobTracker

4、请问hadoop的TextInputFormat 作用是什么 ,如何自定义实现?

InputFormat会在map操作之前对数据进行两方面的预处理。
1、是 getSplits,返回的是InputSplit 数组,对数据进行Split分片,每片交给 map操作一次。

2.是 getRecordReader,返回的是RecordReader对象,对每个Split分片进行转换为key-value键值对格式传递给map常用的inputFormat是TextInputFormat,使用的是LineRecordReader对每个分片进行键值对的转换,以行偏移量作为键,行内容作为值。

3.自定义类继承InputFormat接口,重写createRecordReader和 isSplitable方法在createRecordReader ,中可以自定义分隔符。

5、hadoop 集群 可以运行的3个模式
伪分布式模式
全分布式模式
单机模式(本地模式)

6、请问本地模式中需要注意的点?

在单机模式中不会存在守护进程,所有东西都运行在一个JVM上。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开发过程中运行MapReduce程序,这也是最少使用的一个模式。

7、请问MapReduce怎么优化?

1、Combiner 优化
在之前的shuffle过程中的map端生成最终溢写文件时,例如: aaa 1, aaa 1 这样的数据会被合并为{aaa [1,1]} ,而我们可以通过给每个map显示的设定combiner,来将这个节点的输出优化,即如前面的例如,如果他们是同一节点的数据,他们会合并为{aaa,21, combiner相当于小型的reduce,不过他们这要求(reduce的输入数据格式和输出数据格式―致,并且value的值是满足结合律的

2、压缩
通过在对数据压缩,来减少网络IO,减少磁盘占用,可以用在三个地方:输入数据压缩、map 输出压缩、reduce输出压缩。当然压缩也会增加CPU计算

3.map的数量
Map task 的数量使用split的数量决定的,split 的数据越少,每个map task 的执行时间就越短,但是相应的job 的执行时间也会被拉长,因为内部调度的时间更长了。

4、reduce的数量
可以在client设置,增加reduce的数量

5、大量小文件的优化

Mapreduce不怕大文件,就怕小文件,默认情况下,TextInputFormat对任务的切片机制是按照文件规划切片,不管有多少个小文件,都会是单独的切片,都会交给一个maptask,这样,如果有大量的小文件,就会产生大量的maptask,处理效率极端底下

最好的方法∶在数据处理的最前端(预处理、采集),就将小文件合并成大文件,在上传到HDFS做后续的分析,如果已经是大量的小文件在HDFS中了,可以使用另一种inputformat来做切片(CombineFileInputformat),它的切片逻辑跟Flleinputformat不同:它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 maptask 了