我需要将avro文件作为mrjob hadoop作业的输入。除非我将额外的命令传递给hadoop流媒体jar,否则我找不到任何关于如何做的文档。这会使开发变得复杂,因为我一直在使用inline
运行器进行本地测试。
是否可以使用inline
亚军使用MRJob读取avro文件?
答案 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中编写自己的函数来准备本地执行的数据。