用mrjob处理lzo序列文件

rlcwz9us  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(368)

我正在用mrjob编写一个任务,使用google ngrams数据计算各种统计数据:https://aws.amazon.com/datasets/8172056142375670
我使用制表符分隔的文本中未压缩的数据子集在本地开发并测试了我的脚本。当我尝试运行作业时,出现以下错误:

Traceback (most recent call last):
  File "ngram_counts.py", line 74, in <module>
    MRNGramCounts.run()
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 500, in run
    mr_job.execute()
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 509, in execute
    self.run_mapper(self.options.step_num)
  File "/usr/lib/python2.6/dist-packages/mrjob/job.py", line 574, in run_mapper
    for out_key, out_value in mapper(key, value) or ():
  File "ngram_counts.py", line 51, in mapper
    (ngram, year, _mc, _pc, _vc) = line.split('\t')
ValueError: need more than 2 values to unpack
(while reading from s3://datasets.elasticmapreduce/ngrams/books/20090715/eng-1M/5gram/data)

可能这是因为公共数据集的压缩方案(从上面的url链接):
我们将数据集存储在amazons3的单个对象中。该文件为序列文件格式,采用块级lzo压缩。序列文件键是作为longwritable存储的数据集的行号,值是作为textwritable存储的原始数据。
关于如何设置可以处理这些文件的工作流有什么指导吗?我已经找遍了小费,但没有找到任何有用的。。。
(我是mrjob和hadoop的亲戚n00b。)

kkih6yb8

kkih6yb81#

我终于明白了。看起来emr为您处理lzo压缩,但是对于序列文件格式,您需要将以下hadoop\u input\u format字段添加到mrjob类中:

class MyMRJob(MRJob):

    HADOOP_INPUT_FORMAT = 'org.apache.hadoop.mapred.SequenceFileAsTextInputFormat'

    def mapper(self, _, line):
        # mapper code...

    def reducer(self, key, value):
        # reducer code...

还有另一个问题(引自aws托管的google ngrams页面):
序列文件键是作为longwritable存储的数据集的行号,值是作为textwritable存储的原始数据。
这意味着每一行前面都有一个额外的long+tab,因此在mapper方法中进行的任何行解析都需要考虑前面的信息。

相关问题