不生成Hadoop流映射器字节偏移

时间:2013-03-24 15:43:39

标签: python hadoop mapreduce hadoop-streaming mapper

我正在运行流式Hadoop作业,并且没有生成字节偏移作为映射器的输出(键),就像我期望的那样。命令:

$HADOOP_INSTALL/bin/hadoop \
jar $HADOOP_INSTALL/contrib/streaming/hadoop-streaming-$HADOOP_VERSION.jar \
-D stream.map.input.ignoreKey=false \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-file ./mapper.py \
-file ./reducer.py \
-mapper ./mapper.py \
-reducer ./reducer.py \
-input $INPUT_DIR \
-output $OUTPUT_DIR \
-cmdenv REGEX=$REGEX

我的理解是TextInputFormat是默认的,所以我也在没有-inputformat选项的情况下尝试了上面的命令。我也尝试删除-D,但是我告诉在使用流API时需要将字节偏移量作为键。

为了它的价值,我只是在为学生项目试验Hadoop。目前,映射器是一个非常简单的HDFS文件的python grep,它与提供的正则表达式匹配每一行:

pattern = re.compile(os.environ['REGEX'])
for line in sys.stdin:
   match = pattern.search(line)
   if (match):
      sys.stdout.write(line)

现在,输出(减速器)的唯一东西就是匹配线。我期待制表符或空格分隔的键/值对,其中key = byte_offset和value = regex_line_match。

任何人都可以告诉我或建议为什么会这样吗?

此外,我对回答这两个(相关)问题感兴趣:

  1. 映射器是否可以手动确定字节偏移量 对于每个数据行,它相对于文件进行处理 哪些数据属于?
  2. 映射器是否可以 确定数据所在文件中的总字节数 正在处理属于?
  3. 如果对这两个问题都是肯定的,怎么做? (python,或一般的流媒体)。

    修改
    如果我使用-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat,则字节偏移量将作为映射器输出的键生成。但这项工作需要很长时间才能完成(而且我的输入文件只有大约50行文字!)。

0 个答案:

没有答案