Java 从MapReduce mapper中的输入文件中获取唯一行号
我复制了一个HDFS中有1000万行的文件。需要在mapper中处理线号5000到500000。我该怎么做 我尝试在mapper中重写run()方法,并尝试在那里使用计数器。但是,当文件被拆分并且多个映射程序正在运行时,当然会有多个计数器在运行。所以这没用。粘贴下面的代码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
@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会失败。