Deslocamento de byte do mapeador de streaming do Hadoop não sendo gerado
Estou executando um fluxo de trabalho do Hadoop e os deslocamentos de byte não estão sendo gerados como saída (chaves) do mapeador, como eu esperaria também. O comando:
$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
Meu entendimento é que TextInputFormat é o padrão, então eu também tentei o comando acima sem a opção -inputformat. Eu também tentei remover o -D, mas me disseram que isso é necessário para obter o deslocamento de bytes como chave ao usar a API de streaming.
Por que vale a pena, estou apenas experimentando com o Hadoop para um projeto de estudante. No momento, o mapeador é um python grep muito simples de um arquivo no HDFS, combinando cada linha com a regex fornecida:
pattern = re.compile(os.environ['REGEX'])
for line in sys.stdin:
match = pattern.search(line)
if (match):
sys.stdout.write(line)
Agora, porém, a única coisa que é produzida (para o redutor) são as linhas correspondentes. Estou esperando pares de chave / valor delimitados por tabulação ou espaço em branco, em que key = byte_offset e value = regex_line_match.
Alguém pode me dizer ou sugerir porque isso está acontecendo?
Além disso, estou tão interessado em responder a essas duas perguntas (relacionadas):
É possível para um mapeador determinar manualmente o deslocamento de bytes para cada linha dos dados que está processando em relação ao arquivo ao qual os dados pertencem?É possível para um mapeador determinar o número total de bytes no arquivo ao qual os dados a serem processados pertencem?Se sim para qualquer uma dessas perguntas, como? (python, ou streaming em geral).
Editar:
Se eu usar-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
então os offsets de byte são produzidos como chaves da saída do mapeador. Mas o trabalho leva umrealmente muito tempo para completar (e meu arquivo de entrada tem apenas cerca de 50 linhas de texto!).