我有4个核心桌面,并希望使用我的所有核心来使用hadoop进行本地数据处理。 (即,有时我有足够的能力在本地处理数据,有时我会将相同的作业提交给群集)。
默认情况下,hadoop本地模式只运行一个映射器和一个reducer,因此我的本地作业非常慢。 我不希望首先在单台机器上设置集群,因为“痛苦”配置,其次我每次都要创建jar。如此完美的解决方案是如何在一台机器上运行嵌入式Hadoop
PS伪分布式模式是不好的选择,因为它将创建具有单个节点的集群,因此我将只获得一个映射器,并且我不得不花费一些时间来进行其他配置。
答案 0 :(得分:5)
您需要使用MultithreadedMapRunner - 只需在JobConf的setMapRunnerClass方法中设置它,并且不要忘记将mapred.map.multithreadedrunner.threads设置为所需的并发级别。
还有另一种方式,你应该:
MultithreadedMapper.setMapperClass
MultithreadedMapper.setNumberOfThreads
但是要小心,你的mapper类应该是线程安全的,并且它的设置和清理方法会被多次调用,所以将MultithreadedMapper与MultipulOutput混合起来并不是一个明智的想法,除非你实现了你自己的MultithreadedMapper启发类。 / p>
答案 1 :(得分:1)
Hadoop故意不会在一个JVM中同时运行多个任务以进行隔离。在独立(本地)模式下,只使用一个JVM。如果要使用四个内核,则应以伪分布式模式运行,并将最大并发任务数增加到四个。您可以使用mapred.tasktracker.map.tasks.maximum
和mapred.tasktracker.reduce.tasks.maximum
属性执行此操作。
答案 2 :(得分:0)
Configuration conf = new Configuration();
Job job = new Job(conf, "SolerRandomHit");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(MultithreadedMapper.class);