我运行一个流的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文件的一个很简单的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字节和值= regex_line_match。
谁能告诉我,或暗示为什么发生这种情况?
另外,我只是在回答这两个(相关)的问题一样感兴趣:
- 是否有可能为一个映射器来手动确定字节为它正在处理相对于该数据所属的文件中的数据的每一行偏移?
- 是可能的是,映射器,以确定该数据是处理所属的文件中的字节的总数?
如果是要么对这些问题,怎么样? (Python或一般流)。
编辑:
如果我使用-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
然后字节偏移产生作为映射器输出的密钥。 但这项工作需要很长的时间才能完成(和我的输入文件只有约50在它的文本行!)。