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

Hadoop:延迟初始化映射器任务,hadoop,delay,mapper,Hadoop,Delay,Mapper,是否有任何方法设置映射器任务初始化之间的延迟 例如:我已将mapreduce.job.running.map.limit设置为450。现在我不想Hadoop一次创建这450个进程。相反,每个过程的开始之间应该有半秒钟的时间 是否有机会做到这一点?您可以通过完全相反的方式来实现您的目的,即,如果可以运行需要集群全部资源的MapReduce作业(因此它将阻止其他作业直到完成),如果您可以控制其mapper任务的执行时间,然后,每次上一个作业中的映射器任务完成时,下一个作业的任务将逐个开始。 换句话说

是否有任何方法设置映射器任务初始化之间的延迟

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


是否有机会做到这一点?

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

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

从的所有可配置参数的可能列表中,似乎不可能要求在映射任务之间引入延迟

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

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

我希望您了解InputSplit大小和映射器数量之间的关系。映射器的数量取决于输入拆分,而不是DFS块

我有一些粗略的想法来减少映射器任务的数量以解决您的问题。你必须使用一些参数

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

将此值更改为DFS块大小的倍数。如果您有450个进程,并且希望从的所有可配置参数的可能列表中获得,那么您在映射任务之间引入延迟的要求似乎是不可能的

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

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

我希望您了解InputSplit大小和映射器数量之间的关系。映射器的数量取决于输入拆分,而不是DFS块

我有一些粗略的想法来减少映射器任务的数量以解决您的问题。你必须使用一些参数

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

将此值更改为DFS块大小的倍数。如果您有450个进程,并且希望拥有,我相信目前使用ApacheHadoop是不可能的

您可以使用ApacheCurator的 org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2 例如,机制

例如,请参见Cloudera如何在批处理加载作业中使用此方法将数据加载到Solr-

在那个特定的例子中,他们使用它来限制ZooKeeper初始化的数量 这可以是在同一时间,以避免浮肿的ZooKeeper与风暴的要求,从数百地图

在一个作业中,我使用400个映射器,但同时只将初始化次数限制为30次(一旦初始化完成,映射器将完全独立运行)

在您的示例中,您希望限制映射器对Oracle后端的请求数量,在本例中,映射器希望限制对ZK的请求数量。所以这是同样的问题

理想情况下,如果Hadoop有一种方法可以为映射程序增加一个随机延迟,这将是非常棒的。已提交的增强请求:


我认为目前不可能使用Apache Hadoop

您可以使用ApacheCurator的 org.apache.curator.framework.recipes.locks.InterProcessSemaphoreV2 例如,机制

例如,请参见Cloudera如何在批处理加载作业中使用此方法将数据加载到Solr-

在那个特定的例子中,他们使用它来限制ZooKeeper初始化的数量 这可以是在同一时间,以避免浮肿的ZooKeeper与风暴的要求,从数百地图

在一个作业中,我使用400个映射器,但同时只将初始化次数限制为30次(一旦初始化完成,映射器将完全独立运行)

在您的示例中,您希望限制映射器对Oracle后端的请求数量,在本例中,映射器希望限制对ZK的请求数量。所以这是同样的问题

理想情况下,如果Hadoop有一种方法可以为映射程序增加一个随机延迟,这将是非常棒的。已提交的增强请求:


只是想知道您为什么要延迟?我们的oracle数据库目前存在一些奇怪的问题。它具有2.500个连接的限制。如果我用450个MapPertask启动作业,那么db会拒绝所有连接,尽管它有空闲连接。如果我启动50个MapPertask,那么一切都可以正常工作,大约有100个已使用的连接。虽然db在一个月前使用了900个已用连接和450个MapperTasks,但它仍然工作正常,但它不知何故承受了过重的压力。所以我希望减慢映射器任务的初始化速度可以解决这个问题。不幸的是,我们的数据库管理员还没有一个解决方案。只是想知道你为什么想要延迟?我们有一些奇怪的问题