如何使用avro文件作为MRJob作业的输入?

时间:2014-03-13 10:15:12

标签: python hadoop hadoop-streaming mrjob

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

是否可以使用inline亚军使用MRJob读取avro文件?

2 个答案:

答案 0 :(得分:0)

您需要告诉Hadoop您的"输入格式"的格式是什么?您的Hadoop工作:

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

但我不确定你是如何运行MRJobs的。如果您使用的是Plain Hadoop,我之前的解决方案正在运行。

答案 1 :(得分:0)

正如Chiron解释的那样,您需要指定Hadoop输入格式。 这可以通过在MRJob

中设置void CalculateNormals(VertexPositionNormalTexture[] vertices) { for(int i = 0; i < vertices.Length; i++) vertices[i].Normal = vertices[i].Position; } 选项来完成
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 的.jar文件可用;从v0.5.3开始,您可以在命令行中使用AvroAsTextInputFormat,或者在mrjob配置文件中配置libjars(在v0.5.3时未发布;请参阅--libjar中对--libjar的讨论{3}})。

我不知道将本地测试与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中编写自己的函数来准备本地执行的数据。