我有一个 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 文档有点欠缺。它说“现在在新文件上运行任何作业,比如 wordcount ”。我首先认为我应该使用该/data/mydata.lzo.index
文件作为我的输入,但使用它时我得到一个空输出。该文档还说“请注意,如果您忘记索引 .lzo 文件,该作业将起作用,但将在单个拆分中处理整个文件,这将降低效率。 ”因此无论出于何种原因,它都看不到该index
文件。
传递索引文件的正确方法是什么?
编辑:根据GitHub 上的这个问题,会自动推断索引文件并将根据文件大小进行拆分。仍然不知道为什么我得到一个拆分。