Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从MapReduce mapper中的输入文件中获取唯一行号_Java_Hadoop_Mapreduce_Line Numbers - Fatal编程技术网

Java 从MapReduce mapper中的输入文件中获取唯一行号

Java 从MapReduce mapper中的输入文件中获取唯一行号,java,hadoop,mapreduce,line-numbers,Java,Hadoop,Mapreduce,Line Numbers,我复制了一个HDFS中有1000万行的文件。需要在mapper中处理线号5000到500000。我该怎么做 我尝试在mapper中重写run()方法,并尝试在那里使用计数器。但是,当文件被拆分并且多个映射程序正在运行时,当然会有多个计数器在运行。所以这没用。粘贴下面的代码 @Override public void run(Mapper<LongWritable, Text, Text, Text>.Context context) throws IOExceptio

我复制了一个HDFS中有1000万行的文件。需要在mapper中处理线号5000到500000。我该怎么做

我尝试在mapper中重写run()方法,并尝试在那里使用计数器。但是,当文件被拆分并且多个映射程序正在运行时,当然会有多个计数器在运行。所以这没用。粘贴下面的代码

@Override
public void run(Mapper<LongWritable, Text, Text, Text>.Context context)
        throws IOException, InterruptedException {

    setup(context);

    Integer counter = 0;
    while (context.nextKeyValue()) {

        LongWritable currentKey = context.getCurrentKey();
        Text currentValue = context.getCurrentValue();

        System.out.println(currentKey.toString());

        map(currentKey, currentValue, context);
        counter++;
    }

    System.out.println("Counter: " + counter + " Time: "
            + System.currentTimeMillis());
}
@覆盖
公共void运行(Mapper.Context上下文)
抛出IOException、InterruptedException{
设置(上下文);
整数计数器=0;
while(context.nextKeyValue()){
LongWritable currentKey=context.getCurrentKey();
Text currentValue=context.getCurrentValue();
System.out.println(currentKey.toString());
映射(currentKey、currentValue、context);
计数器++;
}
System.out.println(“计数器:“+计数器+”时间:”
+System.currentTimeMillis());
}
另外,我在mapper中得到的关键不是线号,而是线的偏移量。我们能拿到指向行号的钥匙吗?如果是这样,它在多个映射器中是否唯一?(当前关键点(偏移量)在映射器中不是唯一的)


如何才能使其正确?

我会尝试在第一个MapReduce作业中添加这些行号。然后,您可以执行MapReduce作业,包括在Mapper中检查行号的一些代码,以便丢弃整行或执行分析

编辑:
我现在认为第一个MR作业无法实现,因为映射器上的问题将与原始问题相同:它们将收到拆分,而不涉及其在整个大文件中的位置。

  • 默认的InputFormat(如TextInputFormat)将给出记录的字节偏移量,而不是实际的行号-这主要是因为当输入文件可拆分并由两个或多个映射器处理时,无法确定真正的行号

  • 您可以创建自己的InputFormat来生成行号,而不是字节偏移量,但需要将InputFormat配置为从isSplittable方法返回false(大型输入文件不会由多个映射器处理)。如果您有小文件,或者文件大小接近HDFS块大小,那么这不是问题

  • 您还可以使用pig来清理数据,获取那些特定的感兴趣的行,并处理这些特定的数据

    我觉得这是Hadoop的倒退,当你想在不同系统间共享全局状态时,Hadoop会失败。


您的输入文件是否包含行号或jst记录?否则将很困难,因为您可能无法获得5000到500000行的excat,因为数据是分布式的。输入文件没有行号。只要记录。如果你的数据很小,你就可以处理整个文件输入格式。我的数据很大。千万。如果你有行号,那就很容易了。由于数据被拆分,您将无法通过mapreduce作业输入行号谢谢。但除了写一份单独的MR作业来添加行号之外,没有别的方法了吗?我的意思是,这不能在一项工作中完成吗?我现在认为第一项MR工作无法实施。。。在映射器上接收拆分时,您将遇到相同的问题!是,由于输入数据被拆分,您无法写入第一个mapreduce作业。我们不确定这是excat 5000还是5001号线