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

时间:2012-09-20 00:32:21

标签: hadoop jvm mapreduce

我有4个核心桌面,并希望使用我的所有核心来使用hadoop进行本地数据处理。 (即,有时我有足够的能力在本地处理数据,有时我会将相同的作业提交给群集)。

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

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

3 个答案:

答案 0 :(得分:5)

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

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

  • MultithreadedMapper设置为Job-typed对象中的映射器类
  • 与您实际的映射器类
  • 联系MultithreadedMapper.setMapperClass
  • 使用理想的并发级别调用MultithreadedMapper.setNumberOfThreads

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

答案 1 :(得分:1)

Hadoop故意不会在一个JVM中同时运行多个任务以进行隔离。在独立(本地)模式下,只使用一个JVM。如果要使用四个内核,则应以伪分布式模式运行,并将最大并发任务数增加到四个。您可以使用mapred.tasktracker.map.tasks.maximummapred.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);