• Hadoop面试问题总结


    说下Hadoop生态圈组件及其作用

    Hadoop是目前应用最为广泛的分布式大数据处理框架,其具备可靠、高效、可伸缩等特点。
    Hadoop的核心组件是HDFS、MapReduce。随着处理任务不同,各种组件相继出现,丰富Hadoop生态圈,
    1、HDFS(分布式文件系统)
    HDFS是整个hadoop体系的基础,负责数据的存储与管理。HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。
    2、MapReduce(分布式计算框架)
    MapReduce是一种基于磁盘的分布式并行批处理计算模型,用于处理大数据量的计算。其中Map对应数据集上的独立元素进行指定的操作,生成键-值对形式中间,Reduce则对中间结果中相同的键的所有值进行规约,以得到最终结果。
    Jobtracker:master节点,只有一个,管理所有作业,任务/作业的监控,错误处理等,将任务分解成一系列任务,并分派给Tasktracker。
    Tacktracker:slave节点,运行 Map task和Reduce task;并与Jobtracker交互,汇报任务状态。
    Map task:解析每条数据记录,传递给用户编写的map()函数并执行,将输出结果写入到本地磁盘(如果为map—only作业,则直接写入HDFS)。
    Reduce task:从Map 它深刻地执行结果中,远程读取输入数据,对数据进行排序,将数据分组传递给用户编写的Reduce()函数执行。
    3、Spark(分布式计算框架)
    Spark是一种基于内存的分布式并行计算框架,不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
    8、Hive/Impala(基于Hadoop的数据仓库)
    Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行。通常用于离线分析。

    Hadoop 1.x,2x,3.x的区别:

    hadoop1.x和hadoop2.x的主要区别在于:
    1、hadoop1.x没有提供架构中主节点namenode及jobtrack的高可用及负载均衡机制。而在hadoop2.x中有。
    2、第二个区别就体现在mapreduce的架构设计上,hadoop1.x中mapreduce兼具计算和资源调度两个作用,
    而在hadoop2.x中则将mapreduce中的资源调度功能剥离形成一个独立的框架叫做yarn。使得hadoop更
    加地灵活,因为剥离后的yarn不仅可以运行在hadoop平台,也可以运行在其他的平台,如spark。

    Hadoop3.x新特性
    1、Java最低版本要求从Java7更改成Java8。
    2、HDFS支持纠删码,将原本3倍的存储消耗降低到1.4倍。
    ####在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。
    ####在一定范围的数据出错情况下,通过纠删码技术都可以进行恢复。
    ####既耗网络又耗CPU,适用于冷数据集群。
    3、Hadoop的Shell脚本被重写。
    4、MapReduce任务级本地优化。
    ####MapReduce添加了Map输出collector的本地实现。
    ####对于shuffle密集型的作业来说,这将会有30%以上的性能提升。
    5、支持多于2个的NameNode。
    6、多个服务的默认端口被改变。
    7、提供了单节个磁盘存储不均的情况的解决方案。
    8、重写守护进程以及任务的堆内存管理。

    正常工作的Hadoop集群中Hadoop都分别需要启动哪些进程,它们的作用分别是什么?

    1)NameNode它是hadoop中的主服务器,管理文件系统名称空间和对集群中存储的文件的访问,保存有metadate。

    2)SecondaryNameNode它不是namenode的冗余守护进程,而是提供周期检查点和清理任务。帮助NN合并editslog,减少NN启动时间。

    3)DataNode它负责管理连接到节点的存储(一个集群中可以有多个节点)。每个存储数据的节点运行一个datanode守护进程。

    4)ResourceManager(JobTracker)JobTracker负责调度DataNode上的工作。每个DataNode有一个TaskTracker,它们执行实际工作。

    5)NodeManager(TaskTracker)执行任务

    6)DFSZKFailoverController高可用时它负责监控NN的状态,并及时的把状态信息写入ZK。它通过一个独立线程周期性的调用NN上的一个特定接口来获取NN的健康状态。FC也有选择谁作为Active NN的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。

    7)JournalNode 高可用情况下存放namenode的editlog文件.

    在集群计算的时候,什么是集群的主要瓶颈

    磁盘IO

    搭建Hadoop集群的xml文件有哪些?

    core-site.xml
    hdfs-site.xml
    mapred-site.xml
    yarn-site.xml

    Hadoop的checkpoint流程

    hdfs将文件系统的元数据信息存放在fsimage和一系列的edits文件中。在启动HDFS集群时,系统会先加载fsimage,然后逐个执行所有Edits文件中的每一条操作,来获取完整的文件系统元数据。
    HDFS的存储元数据是由fsimage和edits文件组成。checkpoint的过程,就是合并fsimage和Edits文件,然后生成最新的fsimage的过程。

    Edits文件: 在配置了HA的hadoop2.x版本中,active namenode会及时把HDFS的修改信息(创建,修改,删除等)写入到本地目录,和journalnode上的Edits文件,每一个操作以一条数据的形式存放。Edits文件默认每2分钟产生一个。正在写入的Edits文件以edits_inprogress_*格式存在。

    fsimage文件: fsimage里保存的是HDFS文件系统的元数据信息。每次checkpoint的时候生成一个新的fsimage文件,fsimage文件同步保存在active namenode上和standby namenode上。是在standby namenode上生成并上传到active namenode上的。
    原文链接:https://blog.csdn.net/amber_amber/article/details/47003589

    为什么HDFS中块(block)不能设置太大,也不能设置太小?

    在HDFS中存储数据是以块(block)的形式存放在DataNode中的,块(block)的大小可以通过设置dfs.blocksize来实现;
    在Hadoop2.x的版本中,文件块的默认大小是128M,老版本中默认是64M;
    寻址时间:HDFS中找到目标文件块(block)所需要的时间。

    如果块设置过大,
    一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
    另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。

    如果块设置过小,
    一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
    另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。

    因而,块适当设置大一些,减少寻址时间,那么传输一个由多个块组成的文件的时间主要取决于磁盘的传输速率。

    HDFS中块(block)的大小为什么设置为128M?
    HDFS中平均寻址时间大概为10ms;
    经过前人的大量测试发现,寻址时间为传输时间的1%时,为最佳状态;
    所以最佳传输时间为10ms/0.01=1000ms=1s
    目前磁盘的传输速率普遍为100MB/s;
    计算出最佳block大小:100MB/s x 1s = 100MB
    所以我们设定block大小为128MB。

    因为HDFS的的一个设计目标就是能够快速读取。而对于磁盘来说,读取一个数据块涉及到三种时间开销,寻道时间、旋转时间和传输时间。传输时间是磁盘本身的特性,不可能通过人工手段来改变,但是对于寻道时间和旋转时间,则可以通过增大一次读取的数据量来减少寻道和旋转的次数。这样的话,就可以将读取数据的速率设计为接近真实的磁盘传输速率。
    原文链接:https://blog.csdn.net/s5660gt/article/details/83655584

    Hadoop常见的压缩算法?

    hadoop支持的一般压缩算法如下:
    LZO
    Gzip
    Bzip2
    LZ4
    Snappy

    LZO:
    算法是线程安全的
    算法是数据无损的
    LZO是便携的
    Lzop是使用LZO作为压缩服务的文件压缩器,它是最快的压缩和加压缩器。

    GUN zip,基于DEFLATE算法,LZ77和Huffman编码的结合。它比LZO压缩性能好但是慢。

    总结
    gzip是普通的压缩器,bzip压缩性能好于gzip但速度慢,LZO由很多小块组成。
    LZO和Snappy的压缩速度好但压缩效率低,解压是gzip的两倍。Snappy解压缩好于LZO
    https://blog.csdn.net/victory0508/article/details/47903715

    Hadoop作业提交到YARN的流程?

    1,当client想yarn提交了作业后,就意味着想ResourceManager申请一个ApplicationMaster。这个时候RM(这里我们将ResourceManager简称为RM,同理NodeManager为NM)将分配一个ApplicationMaster给这个作业,同时向相应的NM进行rpc通信要求其启动一个container,在这个container里面启动所分配的ApplicationMaster。

    2,随后这个ApplicationMaster将向RM中的ApplicationManager反向注册,这样用户就可以通过web界面直接监控和查看作业的具体情况。然后ApplicationMaster将想ResourceScheduer申请和领取资源(资源列表就是一系列NM)。

    3,当获取到了NM列表后ApplicationMaster将与相关的NM进行rpc通信,要求他们启动相关的container,这些container里面就是运行作业的task任务的。

    4,各个container里面的task通过rpc通信定期想ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个task的运行状态,从而在task失败的时候可以重启task,用户也可以通过web界面来实时地查看应用程序的情况。

    5,当作业完成后,ApplicationMaster将想ApplicationManager注销并关闭。

    总结起来就是两个阶段:第一个阶段是提交作业到RM上面并开启一个ApplicationMaster。第二阶段,ApplicationMaster申请资源并将task分配到NM上运行同时监控他们直到作业完成并被注销关闭。
    原文链接:https://blog.csdn.net/weixin_39702831/article/details/83090080

    Hadoop的Combiner的作用:

    每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,以减少在map和reduce节点之间的数据传输量,以提高网络IO性能,是MapReduce的一种优化手段之一,其具体的作用如下所述。
    Combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。

    什么是MapReduce

    mapTask的并行机制
    mapTask在运行的时候,开启多个map由谁来决定?
    默认情况:mapTask 的数量和读取 HDFS 中的数据块 block 的数量相等
    block块:HDFS 中文件各个小数据块(默认 128m )(物理划分)
    FileSplit: 在MapReduce 读取每一个块称为 fileSplit(文件切片)(逻辑划分)
    block 的数量 和 文件分片的数量一样,大小也是一样。

    Mapreduce 中 map 阶段的运行机制

    • 读取HDFS中数据, 启动mapTask数量与读取文件的block块(fileSplit)数量是相等的
    • 当分片完成后,MR程序会将split中的数据以K/V(key/value)的形式读取出来,然后将这些数据交给用户自定义的Map函数进行处理。
    • map对数据进行打分区标记。默认分区方案:hash 取模计算法 % numReduceTask,分区可以保证: 相同key , 打上分区的编号必然是一样的
    • 当分好区以后, 数据就会被写入到 环形缓冲区中, 环形缓冲区本质上就是一个内存空间(数组), 大小为100M
      (当这个环形缓冲区容量达到0.8系数就会启动一个溢写的线程, 将80%的数据进行溢写到磁盘上, 在溢写过程中就会执行排序的工作, 如果此时有规约, 此时就是执行规约的时候了。当mapTask执行完成后, 如果环形缓冲区依然还有一些剩余数据, 一次性全部溢写到磁盘上, 此时在磁盘上就会有多个溢写出来的临时文件, 然后对这些临时文件进行merge合并操作, 形成一个最终的排好序,分好区规约好的大文件。

    Mapreduce 中 reduce 阶段的运行机制

    • 当reduceTask检测到mapTask全部都执行完成了, 从多个mapTask中拷贝属于自己的分区的数据
    • 最后将这些数据合并成一个大的数据集,并且按照key值进行聚合,把聚合后的value值作为一个迭代器给用户使用。
    • 用户使用自定义的reduce函数处理完迭代器中的数据后,一般把结果以K/V的格式存储到HDFS上的文件中。
      (在copy过程中, 会先将数据写入到内存中, 当内存存储不下的时候, 在溢写到磁盘上, 形成临时文件。当copy结束后, 会将所有溢写出来的临时文件全部合并为一个大文件, 此时在合并的过程中, 会对数据进行重新的排序工作, 如果reduce只有一个, 此时排序就是全局排序, 如果是多个, 依然是局部排序操作。对排序好数据, 执行分组操作, 将相同key的value数据合并为一个集合, 然后分好一组, 调用一次reduceTask中reduce方法。reduce方法执行完成后, 将结果数据直接输出到即可。)

    一个程序中Map和Reduce的数量是有split和partition的数据决定的。

    Combine优化
    整个过程中可以提前对聚合好的value值进行计算,这个过程就叫Combine。
    在数据排序后,溢写到磁盘前,相同key值的value是紧挨在一起的,可以进行聚合运算,运行一次combiner。
    原文链接:
    https://blog.csdn.net/woshilovetg/article/details/111414081
    https://blog.csdn.net/qq_31975963/article/details/84995460

    MR的运行流程概述

    • 一个文件分成多个split数据片。
    • 每个split由多一个map进行处理。
    • Map处理完一个数据就把处理结果放到一个环形缓冲区内存中。
    • 环形缓冲区满后里面的数据会被溢写到一个个小文件中。
    • 小文件会被合并成一个大文件,大文件会按照partition进行排序。
    • reduce节点将所有属于自己的数据从partition中拷贝到自己的缓冲区中,并进行合并。
    • 最后合并后的数据交给reduce处理程序进行处理。
    • 处理后的结果存放到HDFS上。

    原文链接:https://blog.csdn.net/qq_31975963/article/details/84995460

  • 相关阅读:
    对于两个独立随机变量X,Y, E(XY)=E(X)E(Y)
    用chrome dev tools 强制js注入
    React中的JSX --- { }的使用
    解析javascript中的for in和for of
    Flink-join(流表关联流表,流表关联维表),自定义函数,sql如何保证数据唯一性,执行一组sql的好处...
    Imagination CPU系列研讨会|RISC-V平台的性能分析和调试
    如何使用工程仪器设备在线监测管理系统
    【Linux】从BIOS到bootloader
    【智能优化算法】基于移动阻尼波算法求解单目标优化问题附matlab代码
    Selenium4+Python3系列(十一) - Page Factory设计模式
  • 原文地址:https://blog.csdn.net/weixin_43260719/article/details/126219300