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 会放入一个应答
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 了