我正在运行一个流式 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)
但现在,唯一输出(到 reducer)的是匹配行。我期待制表符或空格分隔的键/值对,其中 key=byte_offset 和 value=regex_line_match。
谁能告诉我或建议为什么会这样?
另外,我也有兴趣回答这两个(相关)问题:
- 映射器是否可以手动确定它正在处理的每一行数据相对于数据所属文件的字节偏移量?
- 映射器是否可以确定它正在处理的数据所属的文件中的总字节数?
如果对这两个问题中的任何一个都是肯定的,那么如何?(python,或一般的流媒体)。
编辑:
如果我使用-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
,那么字节偏移量将作为映射器输出的键产生。但是这项工作需要很长时间才能完成(而且我的输入文件中只有大约 50 行文本!)。