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