Hadoop MapReduce,Java实现问题

Hadoop MapReduce,Java实现问题,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,目前我正在研究ApacheHadoop(使用MapReduce作业的Java实现)。我查看了一些示例(如WordCount示例)。我成功地编写了自定义mapreduce应用程序(我使用的是Cloudera Hadoop演示VM)。我的问题是关于一些实现和运行时的问题 job类的原型如下所示: public class WordCount { public static class Map extends MapReduceBase implements Mapper<LongWrit

目前我正在研究ApacheHadoop(使用MapReduce作业的Java实现)。我查看了一些示例(如WordCount示例)。我成功地编写了自定义mapreduce应用程序(我使用的是Cloudera Hadoop演示VM)。我的问题是关于一些实现和运行时的问题

job类的原型如下所示:

public class WordCount {

  public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
    // mapping
      }
    }
  }

  public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
      // reducing
    }
  }

  public static void main(String[] args) throws Exception {
    JobConf conf = new JobConf(WordCount.class);
    conf.setJobName("wordcount");
    // setting map and reduce classes, and various configs
    JobClient.runJob(conf);
  }
}
公共类字数{
公共静态类映射扩展MapReduceBase实现映射器{
公共void映射(LongWritable键、文本值、OutputCollector输出、Reporter报告器)引发IOException{
//映射
}
}
}
公共静态类Reduce扩展MapReduceBase实现Reducer{
公共void reduce(文本键、迭代器值、OutputCollector输出、Reporter报告器)引发IOException{
//减少
}
}
公共静态void main(字符串[]args)引发异常{
JobConf conf=newjobconf(WordCount.class);
conf.setJobName(“字数”);
//设置map和reduce类以及各种配置
runJob(conf);
}
}
我有一些问题,我试图用谷歌搜索它们,但我必须告诉大家,关于hadoop的文档非常正式(就像一本大参考书),不适合初学者

我的问题是:

  • Map和Reduce类是否必须是中的静态内部类 主类,或者它们可以在任何地方(仅从主类可见?)
  • 你能像在普通的JavaSE应用程序中一样使用JavaSE和可用库所提供的任何东西吗?我的意思是,像JAXB、Guava、JSON的Jackson等等
  • 编写通用解决方案的最佳实践是什么?我的意思是:我们希望以不同(但稍微相似)的方式处理大量日志文件。日志文件的最后一个标记始终是带有一些条目的JSON映射。一个处理可以是:按上的日志行计数和分组(映射中的keyA、keyB),另一个处理可以是:按上的日志行计数和分组(映射中的keyX、keyY)。(我正在考虑一些基于configfile的解决方案,在那里你可以为程序提供实际需要的条目,如果你需要新的解决方案,你只需要提供配置并运行应用程序)
  • 可能是相关的:在WordCount示例中,Map和Reduce类是静态的内部类,main()对它们没有影响,只是将这些类提供给框架。您能否使这些类成为非静态类,提供一些字段和构造函数,以使用一些当前值(如我提到的配置参数)更改运行时
也许我在不必要地挖掘细节。总体问题是:hadoop mapreduce程序仍然是我们习惯使用的普通JavaSE应用程序吗?

以下是您的答案

  • 只要MapTask/ReduceTask的类加载器能够加载mapper/Reduce类,mapper和reducer类可以位于包结构中的任何位置,也可以位于单独的jar文件中。您展示的示例用于Hadoop初学者的快速测试

  • 是的,您可以使用任何Java库。这些第三方jar应该通过
    hadoop jar
    命令的
    -files
    选项或使用hadoop API提供给MapTask/ReduceTask。有关将第三方库添加到Map/Reduce类路径的更多信息,请查看此链接

  • 是的,您可以使用这两种方法中的任何一种来配置并将配置传递给Map/Reduce作业

    3.1使用下面的
    org.apache.hadoop.conf.Configuration
    对象来设置客户端程序中的配置(使用
    main()
    方法的Java类)

    Configuration conf=new Configuration();
    conf.set(“config1”、“value1”);
    作业作业=新作业(配置,“整个文件输入”);

  • Map/Reduce程序可以访问配置对象,并使用
    get()
    方法获取属性设置的值。如果配置设置较小,建议使用这种方法

    3.2使用分布式缓存加载配置,并使其在Map/Reduce程序中可用。单击查看分布式缓存的详细信息。这种方法更可取

    4.
    main()
    是负责配置和提交Hadoop作业的客户端程序。如果未设置任何配置,则将使用默认设置。例如,映射器类、减速器类、输入路径、输出路径、输入格式类、减速器数量等配置:

    此外,请查看有关作业配置的文档

    是的,Map/Reduce程序仍然是JavaSE程序,但是这些程序分布在Hadoop集群中的机器上。比如说,Hadoop集群有100个节点并提交了单词计数示例。Hadoop框架为每个Map和Reduce任务创建Java进程,并调用回调方法,如
    Map()/reduce()
    在数据存在的机器子集上。本质上,映射器/reducer代码在数据存在的机器上执行。我建议您阅读

    我希望,这会有帮助