我正在尝试实现一个算法,其中只需要一个reducer,而mapreduce作业是迭代执行的。每个Map器在特定迭代中的结果将被添加到reducer中,然后进行处理。然后,在另一次迭代中,减速器的输出作为输入传递给Map器。我希望以异步方式执行作业,即一旦执行了预定义数量的Map器,就将输出直接传递给reducer,即避免了洗牌和排序,因为这只会为我的算法带来开销。这有可能吗?如果不是,那么在实现级别可以为mapreduce作业的异步执行做些什么。我看了许多研究论文,但从中得不到任何想法。
谢谢。
1条答案
按热度按时间gk7wooem1#
您必须为此编写自己的自定义解决方案。我最近在一个项目中也做了类似的事情。
它需要一些代码,所以我只能在这里概述一下步骤:)
套
mapreduce.job.reduce.slowstart.completedmaps
至0.0
所以减速器在Map绘制完成之前就出现了(顺便说一句,这会给你一个加速效果。在继续下面的步骤之前先试试看;)也许足够了)实现你自己的
org.apache.hadoop.mapred.MapOutputCollector
将随机播放输出写入套接字而不是标准随机播放路径(这是Map器端)实现你自己的
org.apache.hadoop.mapred.ShuffleConsumerPlugin
等待Map器连接并从网络中读取对(这是reducer端)你需要做的事情:
在reducer实际监听之前同步Map器(zookeeper是我在这里使用的)
调整作业配置以使用自定义Map器和缩减器组件
进一步阅读:https://hadoop.apache.org/docs/r2.6.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/pluggableshuffleandpluggablesort.html
定义。可行,但需要一些努力:)