【问题标题】:How to use avro files as input to a MRJob job?如何使用 avro 文件作为 MRJob 作业的输入?
【发布时间】:2014-03-13 10:15:11
【问题描述】:

我需要将 avro 文件作为 mrjob hadoop 作业的输入。除非我将额外的命令传递给 hadoop 流 jar,否则我找不到任何有关如何执行此操作的文档。不过这会使开发复杂化,因为我一直在使用 inline 运行器在本地进行测试。

是否可以使用 inline runner 来读取带有 MRJob 的 avro 文件?

【问题讨论】:

    标签: python hadoop hadoop-streaming mrjob


    【解决方案1】:

    您需要告诉 Hadoop 您的 Hadoop 作业的“输入格式”的格式是什么:

    hadoop jar hadoop-streaming.jar 
      ;; other params go here
      -inputformat org.apache.avro.mapred.AvroAsTextInputFormat
    

    但我不确定您如何运行 MRJobs。如果您使用的是普通 Hadoop,我之前的解决方案是有效的。

    【讨论】:

    • 谢谢我昨天发现的。我想我只需要安装一个本地 hadoop 实例并针对它进行开发,除非有任何其他答案......
    【解决方案2】:

    正如 Chiron 所解释的,您需要指定 Hadoop 输入格式。 这可以通过在 MRJob 中设置 HADOOP_INPUT_FORMAT 选项来完成

    from mrjob.job import MRJob
    from mrjob.protocol import JSONProtocol
    class MRAvro(MRJob):
        # Converts each AVRO record into one JSON record per line 
        HADOOP_INPUT_FORMAT = 'org.apache.avro.mapred.AvroAsTextInputFormat'
        # Reads each JSON line into 
        INPUT_PROTOCOL = JSONProtocol
    
        def mapper(self, avro_record, _):
            # TODO
    
        def reducer(self, key, values):
            # TODO
    

    在您的配置中,您需要确保AvroAsTextInputFormat 的 .jar 文件在集群上可用;从 v0.5.3 开始,您可以在命令行中使用 --libjar,或者在 mrjob 配置文件中配置 libjars(在 v0.5.3 尚未发布时;请参阅 feature request 中关于 --libjar 的讨论)。

    我不知道将本地测试与 AVRO 集成的简单方法(HADOOP_INPUT_FORMAT 被本地跑步者忽略)。一种解决方案是使用 Apache avro-tools 的 tojson 方法转换您的测试数据。

    java -jar avro-tools-1.8.1.jar test_data.avro > test_data.json
    

    否则,您可以使用 avro 或 fastavro 库在 python 中编写自己的函数来准备数据以供本地执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多