Hadoop:使用延迟初始化映射器任务

时间:2016-01-12 07:45:59

标签: hadoop delay mapper

有没有办法在映射器任务的初始化之间设置延迟?

例如:我已将450设置为Hadoop。现在我不希望{{1}}一次创建这450个进程。相反,每个过程的开始之间应该有半秒钟。

有没有机会这样做?

3 个答案:

答案 0 :(得分:0)

您可以通过完全相反的方式来实现您的目的,即如果可以运行需要集群的全部资源的MapReduce作业(因此它将阻止其他作业直到完成),并且如果您可以控制映射器任务的执行时间,每次上一个作业的映射器任务完成后,下一个作业的任务将逐个启动。 换句话说,你开始一项工作,你知道它的任务需要多长时间,然后开始你的实际工作。 这更容易,因为第一个作业可以根据输入文件中保存的参数简单地进行循环或休眠。

答案 1 :(得分:0)

MapReduce的所有可配置参数的可能列表中,似乎无法在地图任务之间引入延迟。

解决问题的另一个方法是:减少地图任务的数量。

mapreduce.job.running.map.limit是一个限制Map任务的指令,但Hadoop框架可能会忽略此属性。

我希望您了解InputSplit尺寸和放大器之间的关系。地图集的数量。映射器的数量基于InputSplits决定,而不是基于DFS块。

我有一些粗略的想法来减少Mapper任务的数量来解决你的问题。你必须玩一些参数。

mapreduce.input.fileinputformat.split.minsize
mapreduce.input.fileinputformat.split.minsize.per.node
mapreduce.input.fileinputformat.split.maxsize

将此值更改为DFS块大小的倍数。如果您有450个进程并希望具有< = 50个Mapper任务,请将拆分最小值更改为DFS块大小的10倍。

如果您的块大小为128 MB,请将split.min.size更改为1280 MB。

如果这种方法可以解决您的问题,请告诉我。

答案 2 :(得分:0)

我认为当前无法使用Apache Hadoop。

您可以使用Apache Curator的手动设置来同时限制初始化次数 org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2 例如机制

例如,查看Cloudera如何在批量加载作业中使用它来将数据加载到Solr-

https://github.com/cloudera/search/blob/cdh6.2.0/search-crunch/src/main/java/org/apache/solr/crunch/MorphlineInitRateLimiter.java#L115

在该特定示例中,他们使用它来限制ZooKeeper初始化的次数 可以同时进行,以避免因数百个映射器发出的大量请求而使ZooKeeper膨胀。

在一项工作中,我使用了400个映射器,但一次只能将初始化次数限制为30个(一旦完成初始化,映射器就完全独立运行)。

在您的示例中,您想限制从映射器到Oracle后端的请求数,在此示例中,他们想将对ZK的请求数进行限制。所以这是同样的问题。

理想情况下,如果Hadoop出于完全相同的原因而有一种方法可以为映射器的构建增加随机延迟,那将是很好的。提出的增强要求:

https://issues.apache.org/jira/browse/MAPREDUCE-7219