• 【hadoop】mapreduce面试题总结


    1 MapReduce概述

    mapreduce是一个分布式运算程序的编程框架,是用户开发的基于Hadoop的数据分析应用的核心框架。mapreduce核心功能是将用户编写的逻辑代码和自带默认组件整合成一个完成的分布式运算程序,并发运行在Hadoop集群上。

    2 mapreduce优点

    易于编程:简单实现一些接口,就可以完成一个分布式程序
    良好的扩展性:简单的增加机器就可以扩展计算能力
    高容错性:在程序运行过程中,某个节点挂了会自动把上面的计算任务转移到另外一个节点上,不至于这个任务失败。
    适合PB级以上海量数据的离线处理:可以实现上千台服务器并发工作,提供较强的数据处理能力。

    3 mapreduce缺点

    不擅长实时计算:不能毫秒或秒级返回结果
    不擅长流式计算:输入mapreduce的数据都是静态的
    不擅长DAG有向图计算:多个应用程序之间存在依赖关系,后一个程序的输入是前一个程序的输出,在这种情况下mapreduce并不是不能做,而是不擅长做。因为每个mapreduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。

    4 Hadoop序列化

    序列化就是把内存中的对象转换成字节序列,以便于存储到磁盘和网络传输
    反序列化就是将收到的字节序列,或者是磁盘持久化的数据转换成内存中的对象

    5 为什么不用Java的序列化

    Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息,比如:各种校验信息,Header,继承体系等。不便于在网络中高校传输。所以Hadoop有自己的一套系列化机制(Writable)。
    Hadoop序列化的特点:
    紧凑:高效的使用存储空间
    快速:读写数据的额外开销小
    可扩展:随着通信协议的升级而可以升级
    互操作:支持多语言的交互

    6 InputFormat

    inputformat代表数据输入格式,主要解决两个问题:如何将数据分割成分片,比如多少行为一个分片;以及如何读取分片中的数据,比如按行读取。
    如何切片由getSplits方法完成,如何读取分片中的数据由RecordReader方法完成。

    7 MapTask工作机制

    ①read阶段:MapTask通过用户编写的RecordReader,从输入的InputSpilt中解析出一个个k-v值
    ②map阶段:该阶段将解析出的k-v交给用户编写map方法处理,并产生新的k-v值
    ③collect阶段:在用户编写的map方法中,当数据处理完成后会调用OutputCollector.collect方法输出结果。在collect方法内部会将打上分区标签的k-v值写入到环形缓冲区中
    ④spill阶段:当环形缓冲区达到80%的容量后,其中的数据会溢写到磁盘上,在溢写前会进行一次快速排序,溢写完成之后会对磁盘中的数据文件进行一次归并排序,并在必要时对数据进行合并、压缩等操作

    8 ReduceTask工作流程

    ①copy阶段:ReduceTask从各个MapTask远程拷贝属于自己分区的数据,在拷贝过程中数据大小超过一定阈值会被写到磁盘上,否则直接放在内存中
    ②merge阶段:在远程拷贝数据的同时,ReduceTask会启动两个线程对磁盘上的文件进行合并,以防止内存使用过多或磁盘小文件过多
    ③sort阶段:用户编写的reduce方法输入数据是按key进行聚集的一组数据。为了将key相同的数据聚集到一起,hadoop采用排序策略。由于各个MapTask已经对自己处理的结果进行局部排序,因此,ReduceTask只需要对所有的数据进行一次归并排序即可
    ④reduce阶段:reduce方法将计算结果写到HDFS上

    9 mapreduce工作流程

    mapreduce程序分为六个步骤:input、split、mapper、shuffle、reducer、finalRedult
    split:每一个分片对应一个mapTask,计算分片大小的公式:Math.max(minSize, Math.min(maxSize, blockSize))

    shuffle:
    shuffle阶段表示map方法之后,reduce方法之前的数据处理过程。map方法之后,数据会首先进入分区方法,将数据打上分区标签,然后把数据发送到环形缓冲区;环形缓冲区默认大小100M,环形缓冲区达到80%时进行溢写。在溢写之前对环形缓冲区中的数据进行快速排序,排序按照key的索引进行字典顺序排序,溢写生成的文件最后会对这些文件进行一次归并排序。对溢写文件也可以进行预聚合combiner操作,最后将文件按照分区存储到磁盘中,等待reducer段拉取。
    每个reducer从磁盘拉取对应分区的数据,拉取数据后先存储到内存中,当内存不足时,再存储到磁盘。拉去完所有的数据后,采用归并排序将内存和磁盘中的数据进行排序。在进入reduce方法前,对数据进行分组操作。(整个shuffle操作进行了3次排序,1次快速排序,2次归并排序)

    10 MapJoin介绍

    mapjoin的主要思想:小表复制到各个节点上,并加载到内存中;大表分片,与小表完成连接操作。mapjoin操作在mapTask中完成,因此无需启动ReduceTask。适合一个小表和一个大表操作

    11 ReduceJoin介绍

    reducejoin的主要思想:mapper端读取多个数据文件,在map方法中对不同文件中的连接字段打上标记,在reduce阶段根据标记对数据进行连接。join操作在reduceTask中完成,适合两个大表连接操作。reducejoin的shuffle的网络传输和排序效率很低,并且reduce端要对2个集合进行乘机计算,很耗费内存

  • 相关阅读:
    一台服务器最大能支持多少条 TCP 连接
    深度学习(七)——神经网络的卷积操作
    每天20题吃透这份将近 500 页的“Java 工程师八股文”,成功入职阿里
    非对称加密——网络安全
    包含Uniapp单聊思路,单群聊集群
    cmake 入门笔记
    MySQL进阶篇(2)—SQL优化、视图/存储过程/触发器
    TCP网络编程入门
    ios基础(二)
    第48节—— redux 中的 compose——了解
  • 原文地址:https://blog.csdn.net/xiexianyou666/article/details/128050978