2012-09-20 51 views
2

我有4核心桌面,并希望使用我所有的核心与hadoop进行本地数据处理。 (即有时我有足够的能力在本地处理数据,有时我会将相同的作业提交给群集)。如何在单个JVM中运行hadoop多线程方式?

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

PS伪分布式模式是不好的选择,因为它将创建具有单节点的群集,所以我将只获得一个映射器,并且我必须花费一些时间在附加组态。

+0

我想你想要伪分布式模式。在Windows上执行此操作的最简单方法是下载Cloudera Hadoop演示:https://ccp.cloudera.com/display/SUPPORT/Downloads?gclid=CKLR7Nv0wrICFQz0nAod7g8AZQ – duffymo

+0

不,“伪分布式模式”将运行具有单节点的群集和2个JVM。所以结果将是相同的1映射器和1 reducer – yura

回答

1

为了隔离目的,Hadoop故意在一个JVM中同时运行多个任务。而在独立(本地)模式下,只能使用一个JVM。如果你想使用你的四个核心,你应该运行在伪分布式模式下,并将最大并发任务数量增加到四个。您可以使用mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum属性来执行此操作。

+0

其实我可以使用conf.set(“mapred.job.reuse.jvm.num.tasks”,“4”)在一个JVM中运行几个映射器。但是这个dos不适用于本地模式。 – yura

+0

迷你集群可以帮助我吗? – yura

+1

mapred.job.reuse.jvm.num.tasks将在同一JVM中按顺序运行多个任务,而不是单独的线程。同样,除非您自己专门编写线程代码,或者像rystsov建议的那样,专门为此使用地图任务,否则不能在同一个JVM中同时运行多个Map任务。无论如何,你为什么要这样做?多个JVM应该几乎一样快。 –

5

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

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

  • 设置MultithreadedMapper在工作类型的对象
  • 通话MultithreadedMapper.setMapperClass你的映射器类与你实际映射类
  • 呼叫MultithreadedMapper.setNumberOfThreads与希望并行级别

但要小心,你的映射类应该是线程安全的,它的设置和清理方法将是ca因此,将MultithreadedMapper与MultipulOutput混合并不是一个聪明的主意,除非您实现了您自己的MultithreadedMapper灵感类。

+0

它赢得新的API hadoop 1.0.3吗? – yura

+1

抱歉,长时间回复,是的MultithreadedMapper与hadoop 1.0.3一起使用,但我欺骗了你,你不应该扩展它,这是一个完整的多线程字数统计范例 - https:// github。COM/rystsov /学习-的hadoop /斑点/主/ SRC /主/ JAVA/COM /叽叽喳喳/ rystsov/MR/MultithreadedWordCount.java – rystsov

0
Configuration conf = new Configuration(); 

    Job job = new Job(conf, "SolerRandomHit"); 

    job.setOutputKeyClass(Text.class); 

    job.setOutputValueClass(IntWritable.class); 


    job.setMapperClass(MultithreadedMapper.class); 
相关问题