我能够将CSV数据转换为ORC格式。但是,根据新要求,我的应用程序需要将可以采用CSV,Avro等任何格式的输入数据序列化为ORC编写器可理解的格式,并将其写入kafka主题。稍后,我的应用程序或其他一些应用程序需要从kafka主题中读取这些数据,并将其写为ORC文件。输入数据作为属性包含在一个对象中,同一对象的ORC模式定义为另一个属性。
答案 0 :(得分:0)
如果您已经可以从CSV / Avro / etc来源创建ORC格式,则可以创建较小的ORC文件(每个文件约10MB),然后可以使用自己的序列化方法将它们填充到Kafka中,例如说Google协议缓冲区: https://developers.google.com/protocol-buffers/docs/overview
您可以在自己的字段(文件名,路径/目录等)中定义元数据,然后将实际的二进制ORC文件作为简单的字节数组发送。
在Kafka消费者方面,任何消费消息的人都只需要使用protobuf模式对消息进行反序列化,并将接收到的字节数组存储为具有适当文件名,路径等的HDFS / S3 / etc文件。是Protobuf和Kafka不在乎字节数组字段中发送的内容。它可以是纯文本,也可以是ORC,二进制AVRO等。只要您在目标目标存储中正确命名它们,它们就可以工作。
一些警告:
您需要在kafka安装中调整默认值,以允许大于1MB的消息(这是最大大小的默认值)。确保查看此答案以更改所有必需的配置值:How can I send large messages with Kafka (over 15MB)?
如果下游有Hive,请确保正确定义Hive表(使用ORC格式,Avro,镶木地板,文本等),以便可读。
如果您试图将这些文件与HDFS或EMR / S3存储一起使用,则小文件(每个文件小于100MB)效果不佳,尤其是当您有大量数据时。因此,作为最后一步,您可能希望在传输过程完成后合并文件。