有没有办法设置Map器任务初始化之间的延迟?例如:我设置了 mapreduce.job.running.map.limit 至 450 . 现在我不想 Hadoop 一次创建450个进程。相反,每个过程的开始之间应该有半秒钟的时间。有机会这么做吗?
mapreduce.job.running.map.limit
450
Hadoop
66bbxpm51#
我认为目前不可能使用apachehadoop。例如,您可以使用apachecurator的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因来自数百个Map者的大量请求而膨胀。在一个作业中,我使用400个Map器,但同时只将初始化次数限制为30次(一旦初始化完成,Map器将完全独立运行)。在您的示例中,您希望限制Map器对oracle后端的请求数,在本例中,Map器希望限制对zk的请求数。所以这是同样的问题。理想的情况是,如果hadoop有一种方法,能够为Map程序设置一个随机延迟,这将是非常好的。提交的增强请求:https://issues.apache.org/jira/browse/mapreduce-7219
qoefvg9y2#
从mapreduce所有可配置参数的可能列表中,似乎不可能要求在map任务之间引入延迟。另一个解决问题的方法是:减少Map任务的数量。 mapreduce.job.running.map.limit 是限制Map任务的指令,但hadoop框架可能会忽略此属性。我希望您知道inputsplit大小和Map器数量之间的关系。Map器的数量取决于输入拆分,而不是dfs块。我有一些粗略的想法,以减少Map任务的数量,以解决您的问题。你必须考虑一些参数。
mapreduce.input.fileinputformat.split.minsize mapreduce.input.fileinputformat.split.minsize.per.node mapreduce.input.fileinputformat.split.maxsize
将此值更改为dfs块大小的倍数。如果您有450个进程并且想要拥有<=50个Map器任务,请将分割最小大小更改为dfs块大小的10倍。如果块大小为128 mb,请将split.min.size更改为1280 mb。如果这个方法能解决你的问题,请告诉我。
hrysbysz3#
您可以通过完全相反的方式来实现您的目的,即,如果可以运行需要集群全部资源的mapreduce作业(因此它将阻止其他作业,直到它完成),如果可以控制其mapper任务的执行时间,然后,每次上一个作业中的Map器任务完成时,下一个作业的任务都将逐个开始。换句话说,你开始一项工作,你知道它的任务需要多长时间,然后开始你的实际工作。这更容易,因为第一个作业可以简单地根据保存在输入文件中的参数执行循环或休眠。
3条答案
按热度按时间66bbxpm51#
我认为目前不可能使用apachehadoop。
例如,您可以使用apachecurator的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因来自数百个Map者的大量请求而膨胀。
在一个作业中,我使用400个Map器,但同时只将初始化次数限制为30次(一旦初始化完成,Map器将完全独立运行)。
在您的示例中,您希望限制Map器对oracle后端的请求数,在本例中,Map器希望限制对zk的请求数。所以这是同样的问题。
理想的情况是,如果hadoop有一种方法,能够为Map程序设置一个随机延迟,这将是非常好的。提交的增强请求:
https://issues.apache.org/jira/browse/mapreduce-7219
qoefvg9y2#
从mapreduce所有可配置参数的可能列表中,似乎不可能要求在map任务之间引入延迟。
另一个解决问题的方法是:减少Map任务的数量。
mapreduce.job.running.map.limit
是限制Map任务的指令,但hadoop框架可能会忽略此属性。我希望您知道inputsplit大小和Map器数量之间的关系。Map器的数量取决于输入拆分,而不是dfs块。
我有一些粗略的想法,以减少Map任务的数量,以解决您的问题。你必须考虑一些参数。
将此值更改为dfs块大小的倍数。如果您有450个进程并且想要拥有<=50个Map器任务,请将分割最小大小更改为dfs块大小的10倍。
如果块大小为128 mb,请将split.min.size更改为1280 mb。
如果这个方法能解决你的问题,请告诉我。
hrysbysz3#
您可以通过完全相反的方式来实现您的目的,即,如果可以运行需要集群全部资源的mapreduce作业(因此它将阻止其他作业,直到它完成),如果可以控制其mapper任务的执行时间,然后,每次上一个作业中的Map器任务完成时,下一个作业的任务都将逐个开始。换句话说,你开始一项工作,你知道它的任务需要多长时间,然后开始你的实际工作。这更容易,因为第一个作业可以简单地根据保存在输入文件中的参数执行循环或休眠。