【问题标题】:How to implement Hadoop mapreduce job as non map/reduce even if does not make any sense?即使没有任何意义,如何将 Hadoop mapreduce 作业实现为非 map/reduce?
【发布时间】:2025-12-12 17:30:01
【问题描述】:

即使以非 map/reduce 方式实现 Hadoop Job 对我来说没有任何意义,我也需要在大学的项目中实现它

Hadoop 作业如何作为非 map/reduce 运行?只需将 reducers 设置为 0 就足够了吗?

job.setNumreduceTasks(0) 

还是有别的办法?

我的应用程序与 mapper 和 reducer 类完美配合,解决了计数问题(类似于世界计数,但以生物学方式)。

【问题讨论】:

  • 为什么不使用 Spark?
  • 另一组正在使用 Spark 执行相同的任务,所以我不确定在我的项目中在 Hadoop 之上运行 Spark 是否是有效的解决方案?所以我正在寻找另一种可能性。
  • 这些天几乎没有人使用 MapReduce。如果您需要在 Hadoop 集群上以分布式方式处理数据,请使用 Spark,除非有很好的理由使用其他东西。毕业后,Spark 更有可能对你有用。
  • @Ben 虽然 Hive、Pig、Sqoop 等仍然使用 MapReduce?人们使用那些
  • @cricket_007 是的,但他们没有直接编写 MapReduce,这是我的观点。

标签: java hadoop mapreduce


【解决方案1】:

您创建了一个 Job 类,根据定义,它要求您设置映射器和化简器类,这使您执行 mapreduce。

如果您必须使用 Hadoop,并且不想执行 多个 map 或 reduce 操作(例如不并行化操作),则不需要通过 InputFormat 拆分文件(默认情况下逐行读取文件)。

如果您让映射器只读取一个拆分,它将处理整个文件。您可以在 mapper 任务中解析整个文件,也可以将其直接传递给 reducer 并在那里执行。

基本上,您只是在此时重新序列化数据

【讨论】:

    【解决方案2】:

    如果您不想使用 map/reduce 操作并且想要在驱动程序上运行所有代码,您应该在不创建任何作业的情况下实现 Tool 接口:

    public class MyApp extends Configured implements Tool {
    
       public int run(String[] args) throws Exception {
         // your code
       }
    }
    

    但如果你只想使用映射器,你可以设置job.setNumReduceTasks(0);

    【讨论】: