在map reduce输出文件中获取未知整数值

a0x5cqrl  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(328)

我正在开发一个hadoop map reduce程序,其中我没有设置Map器和reducer,也没有从我的程序中为作业配置设置任何其他参数。我这样做是假设作业将发送与输出文件的输入相同的输出。但我发现它在输出文件中打印一些伪整数值,每一行用tab分隔(我猜)。
这是我的密码:

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class MinimalMapReduce extends Configured implements Tool {

    public int run(String[] args) throws Exception {

        Job job = new Job(getConf());
        job.setJarByClass(getClass());
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static void main(String[] args) {
        String argg[] = {"/Users/***/Documents/hadoop/input/input.txt",
                            "/Users/***/Documents/hadoop/output_MinimalMapReduce"}; 
        try{
            int exitCode = ToolRunner.run(new MinimalMapReduce(), argg);
            System.exit(exitCode);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

以下是输入:

2011 22
2011 25
2012 40
2013 35
2013 38
2014 44
2015 43

下面是输出:

0   2011 22
8   2011 25
16  2012 40
24  2013 35
32  2013 38
40  2014 44
48  2015 43

如何获得与输入相同的输出?

vnjpjtjt

vnjpjtjt1#

我同意@philantrover的回答,但这里是我发现的更多细节。根据hadoop的权威指南,textinputformat将偏移量添加到行号中。以下是关于textinputformat的文档:
textinputformat是默认的输入格式。每条记录都是一行输入。键是一个longwritable,是行开头文件中的字节偏移量。该值是行的内容,不包括任何行终止符(例如换行符或回车符),并打包为文本对象。因此,包含以下文本的文件:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

分为四个记录的一部分。这些记录被解释为以下键值对:

(0, On the top of the Crumpetty Tree)
(33, The Quangle Wangle sat,)
(57, But his face you could not see,)
(89, On account of his Beaver Hat.)

显然,这些键不是行号。这在一般情况下是不可能实现的,因为一个文件在字节而不是行边界处被拆分。拆分是独立处理的。行号实际上是一个连续的概念。在使用行时必须保持行数,因此可以知道拆分中的行号,但不能在文件中。
但是,每一行的文件内的偏移量是由独立于其他拆分的每个拆分知道的,因为每个拆分都知道前面拆分的大小,并且只是将其添加到拆分内的偏移量中以生成全局文件偏移量。对于需要每行唯一标识符的应用程序,偏移量通常足够。再加上文件名,它在文件系统中是唯一的。当然,如果所有的线都是固定宽度,那么计算行号只需将偏移量除以宽度即可。

hgqdbh6s

hgqdbh6s2#

我这样做是假设作业将发送与输出文件的输入相同的输出
你的假设是对的。从技术上讲,您将获得文件中的所有内容作为输出。请记住,Map器和还原器将键值对作为输入。
Map器的输入是文件的输入拆分,而还原器的输入是Map器的输出。
但我发现它在输出文件中打印一些伪整数值,每行用tab分隔
这些伪整数只不过是该行距文件开头的偏移量。因为你的每一行 [4 DIGITS]<space>[2 DIGITS]<new-line> ,偏移量是8的倍数。
您可能会问,既然还没有定义任何Map器或缩减器,为什么要得到这个偏移量?这是因为,Map程序将始终运行,它将完成将每条线Map到其偏移量的任务,并称为 IdentityMapper .
如何获得与输入相同的输出?
你可以定义一个Map器,把输入线Map到输出,去掉偏移。

public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
    // Some cool logic here
}

在上述代码中, key 包含伪整数值,即偏移量。以及 value 包含每行的值,一次一个。您可以编写自己的代码来编写 value 使用 context.write 功能,然后使用无减速器和设置 job.setNumReduceTasks(0) 以获得所需的输出。

相关问题