如何在单个jvm中运行hadoop多线程?

u3r8eeie  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(314)

我有4个核心的桌面,并希望使用我的所有核心与hadoop本地数据处理(i、 有时我有足够的能力在本地处理数据,有时我向集群提交相同的作业)。
默认情况下,hadoop本地模式只运行一个mapper和一个reducer,所以我的本地作业非常慢。我不想首先在单机上设置集群,因为“痛苦”的配置,其次每次都要创建jar。所以完美的解决方案是如何在一台机器上运行嵌入式hadoop
ps伪分布式模式是一个坏的选择,因为它将创建具有单个节点的集群,所以我将只获得一个Map器,并且我必须在额外的配置上花费一些时间。

xjreopfe

xjreopfe1#

Configuration conf = new Configuration();

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

    job.setOutputKeyClass(Text.class);

    job.setOutputValueClass(IntWritable.class);

    job.setMapperClass(MultithreadedMapper.class);
zpqajqem

zpqajqem2#

您需要使用multi-threadedmaprunner—只需在jobconf的setmaprunnerclass方法中设置它,并且不要忘记将mapred.map.multi-threadedrunner.threads设置为所需的并发级别。
还有一种方法,你应该:
将multithreadedmapper设置为作业类型对象中的Map器类
呼叫 MultithreadedMapper.setMapperClass 和你实际的Map绘制类
呼叫 MultithreadedMapper.setNumberOfThreads 具有理想的并发级别
但是要小心,你的Map器类应该是线程安全的,它的设置和清理方法会被多次调用,所以把多线程apper和多输出混合在一起不是一个聪明的主意,除非你实现了你自己的多线程apper类。

kxe2p93d

kxe2p93d3#

出于隔离的目的,hadoop故意不在一个jvm中同时运行多个任务。在独立(本地)模式下,只使用一个jvm。如果您想利用您的四个核心,您应该在伪分布式模式下运行,并将最大并发任务数增加到四个。你可以用 mapred.tasktracker.map.tasks.maximum 以及 mapred.tasktracker.reduce.tasks.maximum 属性。

相关问题