如何在单个JVM中运行hadoop多线程方式?

yur*_*ura 2 hadoop jvm mapreduce

我有4个核心桌面,并希望使用我的所有内核用于使用hadoop进行本地数据处理.(即,有时候我有足够的能力在本地处理数据,有时候我会向集群提交相同的工作).

默认情况下,hadoop本地模式只运行一个映射器和一个reducer,因此我的本地作业非常慢.我不希望首先在单台机器上设置集群,因为"痛苦"配置,其次我每次都要创建jar.如此完美的解决方案是如何在一台机器上运行嵌入式Hadoop

PS伪分布式模式是不好的选择,因为它将创建具有单个节点的集群,因此我将只获得一个映射器,我不得不花费一些时间来进行其他配置.

rys*_*sov 5

您需要使用MultithreadedMapRunner - 只需在JobConf的setMapRunnerClass方法中设置它,并且不要忘记将mapred.map.multithreadedrunner.threads设置为所需的并发级别.

还有另一种方式,你应该:

  • MultithreadedMapper设置为Job-typed对象中的mapper类
  • 打电话MultithreadedMapper.setMapperClass与你实际映射类
  • 调用MultithreadedMapper.setNumberOfThreads具有理想的并发级别

但是要小心,你的mapper类应该是线程安全的,并且它的设置和清理方法会被多次调用,所以将MultithreadedMapper和MultipulOutput混合起来并不是一个明智的想法,除非你实现了你自己的MultithreadedMapper启发类.