如何使映射器处理来自HDFS的整个文件

时间:2016-04-24 14:46:32

标签: hadoop mapreduce hapi

这是我读取包含Hl7消息的文件并使用Hapi Iterator(来自http://hl7api.sourceforge.net)迭代它们的代码

File file = new File("/home/training/Documents/msgs.txt");
InputStream is = new FileInputStream(file);
is = new BufferedInputStream(is);

Hl7InputStreamMessageStringIterator iter = new   
     Hl7InputStreamMessageStringIterator(is);

我想在地图功能中完成这项工作?显然我需要阻止 InputFormat 中的拆分将整个文件作为单个值读取一次并将其更改为String(文件大小为7KB),因为您知道Hapi只能解析整个消息。

我是所有这些的新手所以请耐心等待。

3 个答案:

答案 0 :(得分:0)

您需要实现自己的FileInputFormat子类:

  1. 它必须覆盖isSplittable()方法到false,这意味着映射器的数量将等于输入文件的数量:每个映射器一个输入文件。
  2. 您还需要实施getRecordReader()方法。这正是您需要从上面解析逻辑的类。

答案 1 :(得分:0)

当输入来自文本文件时,您可以覆盖fileInputFormat的isSplitable()方法。使用它,一个映射器将处理整个文件。

public boolean isSplitable(Context context,Path args[0]) { return false; }

答案 2 :(得分:0)

如果您不希望拆分数据文件,或者想要一个处理整个文件的映射器。这样一个文件只能由一个映射器处理。在这种情况下,扩展map / reduce inputformat并覆盖isSplitable()方法并返回“false”,因为boolean会帮助你。

对于ref :(不基于您的代码) https://gist.github.com/sritchie/808035