我需要将 avro 文件作为 mrjob hadoop 作业的输入。除非我将额外的命令传递给 hadoop 流 jar,否则我找不到任何有关如何执行此操作的文档。不过,这会使开发复杂化,因为我一直在使用inline
跑步者在本地进行测试。
是否可以使用inline
运行器通过 MRJob 读取 avro 文件?
我需要将 avro 文件作为 mrjob hadoop 作业的输入。除非我将额外的命令传递给 hadoop 流 jar,否则我找不到任何有关如何执行此操作的文档。不过,这会使开发复杂化,因为我一直在使用inline
跑步者在本地进行测试。
是否可以使用inline
运行器通过 MRJob 读取 avro 文件?
您需要告诉 Hadoop 您的 Hadoop 作业的“输入格式”的格式是什么:
hadoop jar hadoop-streaming.jar
;; other params go here
-inputformat org.apache.avro.mapred.AvroAsTextInputFormat
但我不确定你是如何运行 MRJobs 的。如果您使用的是普通 Hadoop,我之前的解决方案是有效的。
正如 Chiron 所解释的,您需要指定 Hadoop 输入格式。这可以通过HADOOP_INPUT_FORMAT
在 MRJob 中设置选项来完成
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
在您的配置中,您需要确保 .jar 文件AvroAsTextInputFormat
在集群上可用;从 v0.5.3 开始,您可以--libjar
在命令行中使用,或者在 mrjob 配置文件中配置 libjars(在 v0.5.3 尚未发布时;请参阅功能请求--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 中编写自己的函数来准备数据以供本地执行。