У меня есть сжатый LZO-файл /data/mydata.lzo
, и я хочу запустить его, используя некоторый код MapReduce, который у меня есть. Сначала я создаю файл индекса с помощью пакета hadoop-lzo со следующей командой:
>> hadoop jar hadoop-lzo-0.4.21.jar \
com.hadoop.compression.lzo.DistributedLzoIndexer \
/data/mydata.lzo
Это работает успешно
17/01/04 11:06:31 INFO mapreduce.Job: Running job: job_1472572940387_17794
17/01/04 11:06:41 INFO mapreduce.Job: Job job_1472572940387_17794 running in uber mode : false
17/01/04 11:06:41 INFO mapreduce.Job: map 0% reduce 0%
17/01/04 11:06:52 INFO mapreduce.Job: map 86% reduce 0%
17/01/04 11:06:54 INFO mapreduce.Job: map 100% reduce 0%
17/01/04 11:06:54 INFO mapreduce.Job: Job job_1472572940387_17794 completed successfully
и создает файл /data/mydata.lzo.index
. Теперь я хочу запустить это через другой код Hadoop Java.
hadoop jar myjar.jar -input /data/mydata.lzo
Он выполняется правильно, но занимает НАВСЕГДА. Я заметил, что он разбивает файл только один раз (когда я запускаю это же задание с файлами, отличными от LZO, он разбивает его примерно 25 раз)
mapreduce.JobSubmitter: number of splits:1
Что я делаю неправильно?
Документации по hadoop-lzo немного не хватает. В нем говорится: «Теперь запустите любое задание, скажем, подсчет слов, над новым файлом». Сначала я подумал, что должен использовать файл /data/mydata.lzo.index
в качестве входных данных, но при его использовании я получаю пустой вывод. В документации также говорится: «Обратите внимание, что если вы забудете проиндексировать файл .lzo, задание будет работать, но будет обрабатывать весь файл за один раз, что будет менее эффективно». Так что по какой-то причине он не видит файл index
.
Как правильно передать индексный файл?
EDIT: Согласно этой проблеме на GitHub index файл выводится автоматически и разделяется в соответствии с размером файла. Все еще не уверен, почему я получаю один сплит.