我有4个核心的台式机,并且想使用我的所有核心通过hadoop进行本地数据处理。
(即有时我有足够的能力在本地处理数据,有时我将相同的作业提交给集群)。
默认情况下,hadoop本地模式仅运行一个映射器和一个reducer,因此我的本地作业确实很慢。
由于“痛苦”的配置,我不想首先在单台计算机上设置集群,其次我每次都必须创建jar。如此完美的解决方案是如何在一台机器上运行嵌入式Hadoop
PS伪分布式模式是一个不好的选择,因为它将创建具有单个节点的群集,因此我将仅获得一个映射器,并且必须花一些时间进行其他配置。
最佳答案
您需要使用MultithreadedMapRunner-只需在JobConf的setMapRunnerClass方法中进行设置即可,不要忘记将mapred.map.multithreadedrunner.threads设置为所需的并发级别。
另外还有另一种方法,您应该:
MultithreadedMapper.setMapperClass
MultithreadedMapper.setNumberOfThreads
但是要小心,您的mapper类应该是线程安全的,并且它的设置和清除方法将被调用多次,因此,除非您实现自己的MultithreadedMapper启发式类,否则将MultithreadedMapper与MultipulOutput混合并不是一个聪明的主意。