【问题标题】:How to run hadoop multithread way in single JVM?如何在单个 JVM 中运行 hadoop 多线程方式?
【发布时间】:2012-09-20 00:32:20
【问题描述】:

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

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

PS 伪分布式模式是不好的选择,因为它会使用单节点创建集群,所以我只会得到一个映射器,我必须花一些时间进行额外的配置。

【问题讨论】:

  • 我认为你想要伪分布式模式。在 Windows 上最简单的方法是下载 Cloudera Hadoop 演示:ccp.cloudera.com/display/SUPPORT/…
  • 否,“伪分布式模式”将运行具有单节点和 2 个 JVM 的集群。所以结果将是相同的 1 个映射器和 1 个减速器

标签: hadoop jvm mapreduce


【解决方案1】:

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

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

  • MultithreadedMapper 设置为作业类型对象中的映射器类
  • 致电MultithreadedMapper.setMapperClass 与您实际的映射器类
  • 以理想的并发级别调用MultithreadedMapper.setNumberOfThreads

但请注意,您的映射器类应该是线程安全的,并且它的设置和清理方法会被调用多次,因此将 MultithreadedMapper 与 MultipulOutput 混合并不是一个聪明的主意,除非您实现了自己的受 MultithreadedMapper 启发的类。

【讨论】:

【解决方案2】:

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

【讨论】:

  • 其实我可以,使用 conf.set("mapred.job.reuse.jvm.num.tasks", "4") 在一个 JVM 中运行多个映射器。但这不适用于本地模式。
  • mapred.job.reuse.jvm.num.tasks 将在同一个 JVM 中按顺序运行多个任务,而不是作为单独的线程。同样,您不能在同一 JVM 中同时运行多个 Map 任务,除非您自己专门编写线程代码,或者像 rystsov 建议的那样,专门为此使用 map 任务。为什么你还想要它?多个 JVM 应该几乎一样快。
  • 我非常喜欢 Cascading Local 模式,它在本地非常快。但我可以支持兼容性以在 hadoop 和本地模式下运行我的代码。所以我想运行我的简单数据处理 scipts,它可以在 hadoop 和本地高效运行,因为我几乎有一半可以在内存中完成(我的笔记本电脑有 16GB RAM)。
【解决方案3】:
    Configuration conf = new Configuration();

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

    job.setOutputKeyClass(Text.class);

    job.setOutputValueClass(IntWritable.class);


    job.setMapperClass(MultithreadedMapper.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-10-24
    • 2021-01-02
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多