2011-07-24 45 views
2

任何人都知道如果org.apache.hadoop.mapreduce.Job是线程安全的?在我的应用程序中,我为每个作业创建一个线程,然后waitForCompletion。我还有另一个监视器线程,用isComplete检查每个作业的状态。hadoop的工作ThreadSafe?

安全吗?工作是否线程安全?文档似乎没有提到任何关于它...

感谢 乌迪

回答

3

不像别人,我也使用线程并行提交作业,并等待其完成。你只需要使用每个线程的作业类实例。如果您通过多个线程共享相同的作业实例,则必须亲自处理同步。

+0

谢谢@Thomas,我认为是这样的... – Udi

+0

您是否在使用调度程序来运行parralel作业? –

+0

@David Grunzman是的,它是石英和依赖工作链的混合物,其中一些可以并行运行,所以我将它们并行提交。 –

0

为什么你想要写为每个作业一个单独的线程?你的用例到底是什么?

您可以在Hadoop集群中运行多个作业。你有多个工作之间的依赖关系吗?

假设您有10个工作正在运行。 1工作失败,那么你需要重新运行9个成功的任务。

最后,作业服务器将采取Hadoop集群上调度多个作业的照顾。如果你没有依赖关系,那么你不应该担心线程安全。如果你有依赖关系,那么你可能需要重新考虑你的设计。

+0

我使用Job.waitForCompletion()。此方法是IO块直到完成完成。如果我在单个线程中运行所有内容,线程将运行串行而不是并行... – Udi

+0

您将作业与任务混淆。 –

-1

如果要检查作业是否完成,我认为你是一个有点困惑地图如何减少工作。您应该让Hadoop为自己做到这一点。

+1

我不同意。就我而言,我有一个组件,它可以一个接一个地在一个流中运行多个作业,并且对于某些作业,如果特定作业失败,我想停止处理(结束 - 2 - 端)运行。 另一种情况是有REST服务,读取HBase的表几作业的状态信息,并有权调用自定义Hadoop的代码,以检查是否有特定的job_id作业已finnished - 否则没有状态信息在HBase的表坚持呢。 – Zec

0

是它们实际上..中的文件块被分割,并且每个块被独立的节点上执行。所有地图任务并行运行,然后在完成之后将其送入减速器。正如你在多线程程序中所想到的那样,不存在同步问题。在多线程程序中的所有线程都在同一个盒子运行,因为它们共享一些数据,你必须将它们同步

0

以防万一你需要另一种并行的在地图上的任务级别,您应该重写运行( )方法在你的映射器中,并在那里使用多个线程。默认实现调用setup(),然后map()乘以要处理的记录数,最后调用cleanup()方法一次。

希望这可以帮助别人!