Смещение байта потокового преобразователя Hadoop не генерируется
Я выполняю потоковое задание 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 для студенческого проекта. На данный момент маппер - это очень простой python grep файла в HDFS, сопоставляющий каждую строку с предоставленным регулярным выражением:
pattern = re.compile(os.environ['REGEX'])
for line in sys.stdin:
match = pattern.search(line)
if (match):
sys.stdout.write(line)
Хотя сейчас единственное, чтоВыходной сигнал (для редуктора) - совпадающие линии. Я'm ожидает пары «ключ / значение» с разделителями или пробелами, где key = byte_offset и value = regex_line_match.
Может кто-нибудь сказать мне или предложить, почему это происходит?
Также я'Я так же заинтересован в ответе на эти два (связанных) вопроса:
Возможно ли, чтобы преобразователь вручную определял смещение в байтах для каждой строки данных, которые он обрабатывает, относительно файла, которому эти данные принадлежат?Возможно ли для картографа определить общее количество байтов в файле, к которому относятся данные, которые он обрабатывает?Если да, то как? (Python или потоковое в целом).
Редактировать:
Если я использую-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat
тогда смещения байтов производятся как ключи вывода картографа. Но работа требуетдействительно долгое время для завершения (и мой входной файл содержит только около 50 строк текста!).