【Hadoop】面试


1.MR流程

数据输入——Mapper——Shuffle——Reducer——数据输出

  • 数据输入——>Mapper 中间有个FileInputFormat抽象类
    - 这个过程需要将文件进行逻辑上的切片处理,遍历文件目录i获取文件大小,再计算切片大小(默认是等于blocksize大小 128M) ,每次切片完成都要判断剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一个切片,将切片信息写入一个切片规划文件,inputSplit接口提供了获取切片的位置和大小两个方法。
    - 提交切片规划文件到yarn上,yarn上的mrappmaster就可以根据切片大小计算maptask个数

Hadoop提供了TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等实现类,默认是使用TextInputFormat。

  • 继承Mapper类,重写setup、map、cleanup方法,将收集到的kv对放入内存缓冲区中,当缓冲区中数据达到一定阈值就会进行一次快速排序。

  • 进入shuffle过程,从内存缓冲区不断一些出本地磁盘文件,多个文件被合并成更大的文件,这个过程中都要调用Partitioner进行分区和针对Key进行归并排序。

  • 接下来进入ReduceTask任务,拷贝一份map处理后的数据读入内存中,如果内存不够就溢写入磁盘,磁盘上文件数目达到一定阈值,使用归并排序生成一个更大的文件,内存中数据超过一定阈值就会一次合并写入磁盘。最后统一对内存和磁盘的数据进行一次归并排序。

  • 最后就是outputformat数据输出了,默认实现类是TextOutputFormat,如果将数据输入到Mysql、Es、Hbase中需要自定义OutputFormat实现类。

2. Namenode、Datanode、SecondaryNamenode作用

Namenode用于管理hdfs的名称空间、配置副本策略、管理数据块的映射信息、处理客户端请求

Datanode用于实际存储数据、执行数据块的读写操作

Secondary Namenode辅助Namenode分担其工作量,定期合并Fsimage和Edits文件,并且推送给Namenode,可以辅助恢复NameNode。

3. Hdfs的介绍与应用场景

hdfs是一个分布式文件管理系统,适合一次写入、多次写出的业务场景。优点在于:高容错性、适合处理大数据,数据规模在PB级别,百万级别文件数量,可以构建在廉价机器上。缺点:不适合低延时数据访问,无法大量存储小文件,不支持并发写入,文件随机修改。

4. SecondaryNamenode如何恢复数据(检查点机制)

Secondary Namenode询问namenode是否需要checkpoint,如果需要就请求执行checkpoint。Namenode滚动写Edits日志。将滚动前的edits文件和fsimage拷贝到第二名称节点,第二名称节点加载fsimage和edits到内存并合并,生成新的镜像文件fsimage.chkpoint,拷贝fsimage.chkpoint到namenode,namenode重命名为fsimage。

5. 小文件问题

由于数据输入默认是使用TextInputFormat实现类,不管文件多小,都会产生一个独立的切片,都会交给一个MapTask任务去执行,如果小文件过多就会产生大量的MapTask,处理效率非常低下。

可以使用CombineTextInputFormat实现类实现数据的输入。实现原理是将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。可以设置虚拟存储切片最大值来调整切片数量。

6. Hadoop和Spark的区别

  • Hadoop不适用于循环迭代的数据流处理,比如机器学习、交互式的数据挖掘适用场景。
  • Hadoop在多个作业计算过程中,map阶段和reduce阶段会频繁进行磁盘的读写操作来进行数据通讯,这样会大大降低计算效率,而Spark的数据通信是基于内存执行,计算效率更高。
  • Spark Task的启动时间快,采用fork线程的方式,而hadoop采用的是创建新的线程。
  • Spark 的缓存机制比 HDFS 的缓存机制高效。

猜你喜欢

转载自blog.csdn.net/m0_58598240/article/details/128922877
今日推荐