我正在运行流式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。
任何人都可以告诉我或建议为什么会这样吗?
此外,我对回答这两个(相关)问题感兴趣:
如果对这两个问题都是肯定的,怎么做? (python,或一般的流媒体)。
修改
如果我使用-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
,则字节偏移量将作为映射器输出的键生成。但这项工作需要很长时间才能完成(而且我的输入文件只有大约50行文字!)。