gpt4 book ai didi

java - Mapreduce 编程 : details required

转载 作者:行者123 更新时间:2023-12-02 21:48:26 25 4
gpt4 key购买 nike

我需要一些帮助来理解 mapreduce 流程,而不是理论上的,而是引用普通的 Java 代码片段。我一直在阅读有关在 hadoop 中处理的教程、API、论坛和其他与主题相关的问题;映射减少。我对流程、hadoop 的处理方法非常满意。我理解的问题与Java中的mapreduce编码有关。我已经阅读并尝试了一些已经可用的代码;即字数等。我无法理解的是原始数据流入 Mapper 和 Reducer 类(严格按照 Java 代码,而不是理论流程)。

我也会尝试用代码来呈现它;也许我可以这样让自己更容易理解。让我们说经典的wordcount程序;我在某处发现的 map & reduce 类的声明为:

public static class Map extends MapReduceBase implements 
Mapper<LongWritable, Text, Text, IntWritable>

public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable>

我对上述代码段的查询:
  • 我将如何决定所有 4 个参数的类型应该在这里?
  • API 定义表明它类似于

    org.apache.hadoop.mapreduce.Mapper(KEYIN,VALUEIN,KEYOUT,VALUEOUT)
  • 如果我通过命令行将文件传递给我的程序,在什么
    论证整个内容去哪儿了?根据对hadoop的理解
    流,我说前 2 个参数,即 KEYIN 和 VALUEIN 将是
    用过的。键将是单词,而值将在那里计数(无论映射阶段的输出是什么)。
  • 我如何声明我的 key 是否应该是 LongWritable。如果我
    只声明整数类型的第一个参数? (我不是在谈论
    Integer 和 LongWritable 类型的区别,但基本
    决定)。
  • 我将如何决定我的问题的哪一部分应该在我的映射器中
    类和 reducer 类应该是什么部分?
  • 映射器和 reducer 类中声明的参数类型是否应该是
    相同还是不同?就像上面的声明一样,它们是不同的。这怎么算?我能猜到的唯一答案是映射阶段输出的中间值可能与映射类的输入类型不同。 (对此不确定,所以如果荒谬,请原谅这个解释)。

  • 例如,我尝试编写一个小代码来找出一个用逗号分隔的整数值的小文本文件中的最大数字。首先,我无法决定应该在哪里进行处理;在映射器类或 reducer 类中?查看周围的大量代码,我以某种方式得出一个结论,即处理应该在 reducer 类中,而我可以在 mapper 类中对我的输入应用一些基本检查。这个逻辑我只是自己假设的,所以你可以玩得开心:)
    有人可以告诉我这段代码有什么问题吗?可以帮助我澄清我的理解吗?

    我的代码:
    public class mapTest {
    public static class Map extends MapReduceBase implements
    Mapper<Text, Text, Text, Reporter>{

    @Override
    public void map(Text text, Text value,
    OutputCollector<Text, Reporter> output, Reporter arg0)
    throws IOException {
    // TODO Auto-generated method stub
    String val = value.toString();

    if(val.equals(null)){
    System.out.println("NULL value found");
    }
    output.collect(value, arg0);

    }

    }

    public static class Reduce extends MapReduceBase implements
    Reducer<Text, Text, Text, Reporter>{

    public void reduce(Text key, Iterator<Text> value,OutputCollector<Text, Reporter> output, Reporter arg0)
    throws IOException {
    // TODO Auto-generated method stub
    Text max = value.next();

    while(value.hasNext()){
    Text current = value.next();
    if(current.compareTo(max) > 0)
    max = current;
    }
    output.collect(key, (Reporter) max);
    }

    }



    /**
    * @param args
    * @throws IOException
    */
    public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    JobConf conf = new JobConf();

    conf.setMapperClass(Map.class);
    conf.setReducerClass(Reduce.class);
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(Text.class);
    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);
    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));

    JobClient.runJob(conf);
    }

    }

    PS:参数类型,我只是以某种方式随机提到,虽然我不明白除了 Reporter 类型之外的任何重要性。

    在发布这个问题之前,我做了所有我能做的研究。请帮助我理解这个流程。我不想仅仅通过从其他地方获取代码并做化妆品来搞砸一切。

    提前致谢-

    阿迪尔

    最佳答案

  • mapper 的 KEYIN,VALUEIN 和 reducer 的 KEYOUT,VALUEOUT 分别取决于您的输入/输出格式。 map 输出 k/v 对必须与 reducer 的输入匹配。
  • 对于文本文件,您可能需要 TextInputFormat。键是文件的字节偏移量,值是行。从那里你可以解析出任何你想要的数据,就像一个普通的字符串。
  • LongWritable 与 IntWritable 就像选择 int 与 long 一样。这一切都取决于您的数据。
  • 大部分工作应该在 mapper 还是 reducer 中完成还有待商榷。您通常使用比 reducer 更多的映射器,因此您可以利用更多的并行性。您还可以减少在减少之前需要重新洗牌和排序的数据量。然而,reducer 的所有值都基于键配置,因此处理在那里也可能有意义。就我个人而言,我尽可能早地尽量减少数据。当所有东西都可以放入内存时,Mapreduce 是最有效的。
  • 关于java - Mapreduce 编程 : details required,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152312/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com