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

Hadoop: Initialize mapper tasks with delay

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

例如:我将mapreduce.job.running.map.limit设置为450。现在我不想 Hadoop 一次创建这 450 个进程。相反,每个进程的开始之间应该有半秒的时间。

有没有机会做这个?

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

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。

如果此方法能解决您的问题,请告诉我。

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

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

例如,查看 Cloudera 如何在 batch-load 作业中使用它来将数据加载到 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 能够出于完全相同的原因为映射器 ramp-up 设置随机延迟,那就太好了。提交增强请求:

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