首页 > 试题广场 >

请用文字描述 Hadoop 的 MapReduce 计算模型

[问答题]

请用文字描述 Hadoop MapReduce 计算模型,可以从任务的提交、运行、交互、结束等阶段详细描述。根据你所描述的过程模型,是否有可以优化的空间?如果有,可以罗列一些 hadoop 已经实现的优化点,同时提出你自己的优化方案。

首先客户端收集job的运行信息,并检验环境是否合法,比如mapClass、reduceClass,map,reduce组件的key,value是否合法,在检测过程中,如果出现问题,则会直接报错,终止job的提交。检测通过,则客户端会为job向ResourceManager申请一个ID,并且向HDFS服务器提交job的参数信息、切片数量以及组件代码jar包等等。ResourceManager返回一个ID后客户端向ResoueceManager提交job,以及job在HDFS提交运行信息的路径。ResoueceManager初始化后,根据资源路径在HDFS中获取job的切片数以便确定mapTask任务数量。NodeManager向ResoueceManager发送心跳以获得任务,此时符合本地化策略,尽量减少带宽的使用。为了确保程序出错时不至于使NodeManager出错宕机,NodeManager启动一个jvm子程序(worker),来运行mapTask和ReduceTask。
根据split的数量mapreduce开启相等数量的maptask。此时mapTask按行开始按行读取split的数据,形成(k1,v1)k1是每行首字符起始位置,此时触发map方法,按照自定义格式对数据进行处理形成(k2,v2),k2是切分的字符,v2是字符在该行出现的次数。
此时进入shuffle洗牌阶段,将k2,v2写入溢写缓冲区中,溢写缓冲区默认大小为100M,从优化角度可调大缓冲区大小,减小磁盘的IO次数。此时为了调优性能可以引入partition对数据进行分区,默认分区为key的哈希值取正数取模,还可引入combiner对数据进行提前合并,此时进入reduce组件的数据量就会减小,溢写缓冲区的数据有序且分好区。当缓冲区数据达到80%发生溢写操作(可调节但是最好不要设置成100%),将数据写入溢写文件中。数据处理完毕会进行合并操作,将多个溢写文件合并成一个结构化文件。注意combiner中间过程一定发生在缓冲区中,但是当溢写文件>=3时,会在合并时发生combiner中间过程。
shuffle阶段完成,会形成有序分区的结构化文件,文件里是(k3,v3)k3和k2一样,v3是itertor类型的迭代数据。
之后执行reduceTask任务,reduceTask创建fetch线程抓取数据,从优化角度fetch应略大于mapTask数,以便于实现并行。获取到(k3,v3),执行reduce方法根据自定义的归并方式,对数据进行处理,最后得到想要的数据进行输出。

发表于 2022-03-01 21:54:50 回复(0)
首先是Map阶段:MapReduce先将待处理的数据进行逻辑切片,在任务提交之前,先根据数据的信息进行任务的分配和规划,然后把相关的信息提交给Yarn的ResourceManage,ResourceManage计算出所需的资源并进行分配container启动应用,客户端通过InputFormat进行一个逻辑的切分然后通过RecorderReader转化成键值对的形式提交给map任务进行逻辑计算之后。

在map后reduce前的阶段成为shuffle数据洗牌阶段:通过outputcontroller写到100M大小的环形缓冲区中,进行双向写入一边写索引一边写数据,当环形缓冲区到达80%时,对数据进行分区、快速排序然后溢写磁盘、进行归并排序、之后可以进行combine合并操作、再进行一次归并排序。

进入Reduce阶段:在所有MapReduce任务完成后,启动ReduceTask任务,并把数据分区的信息提交给ReduceTask去处理这些数据。ReduceTask读取磁盘文件进行分组Reduce任务操作通过outputformat写回磁盘。
发表于 2021-04-10 11:23:08 回复(0)