1、fsimage和edit的区别?

NameNode 的元数据存放在内存中,FsImage 用来备份元数据到磁盘中。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

2、datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?

1)这样处理是不合理的,因为那么 namenode 格式化操作,是对文件系统进行格式化,namenode 格式化时清空 dfs/name 下空两个目录下的所有文件,之后,会在目录 dfs.name.dir 下创建文件。

2)文本不兼容,有可能时 namenode 与 datanode 的 数据里的 namespaceID、clusterID 不一致,找到两个 ID 位置,修改为一样即可解决。

3、MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

1)一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce 框架本质就是一个 Distributed Sort。

2)在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce()处理。

3)很多人的误解在 Map 阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载)。

4)由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的。

4、请列出你所知道的 hadoop 调度器,并简要说明其工作方法?

解答:

  1. FIFO schedular:默认,先进先出的原则

  2. Capacity schedular:计算能力调度器,选择占用最小,优先级高的先执行,以此类推。

  3. Fair schedular:公平调度,所有的job具有相同的资源。

5、DataNode 如何保证数据完整性

1)当DataNode读取Block的时候,它会计算CheckSum。

2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。

3)Client读取其他DataNode上的Block。

4)常见的校验算法 crc(32)  md5(128)  sha1(160)

5)DataNode在其文件创建后周期验证CheckSum

6、HDFS读写数据的过程

读:

1、跟namenode通信查询元数据,找到文件块所在的datanode服务器;

2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流;

3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验);

4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件

写:

1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在;

2、namenode返回是否可以上传;

3、client请求第一个 block该传输到哪些datanode服务器上;

4、namenode返回3个datanode服务器ABC;

5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端;

6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答;

7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。