java - 在Java中将不同类型的数据序列化为ORC格式

标签 java hadoop serialization apache-kafka orc

我能够将CSV数据转换为ORC格式。但是根据新要求,我的应用程序需要将可以采用任何格式(例如CSV,Avro等)的输入数据序列化为ORC编写器可理解的格式,并将其写入kafka主题。稍后,我的应用程序或其他一些应用程序需要从kafka主题中读取这些数据,并将其写为ORC文件。输入数据作为属性包含在一个对象中,同一对象的ORC模式定义为另一个属性。

最佳答案

如果您已经可以从CSV / Avro / etc来源创建ORC格式,则可以创建较小的ORC文件(每个文件约10MB),然后可以使用自己的序列化方法将其填充到Kafka中,例如使用Google Protocol Buffer :
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, Parquet ,文本等),以便可读。
  • 如果您尝试将这些文件与HDFS或EMR / S3存储一起使用,则较小的文件(每个文件小于100MB)效果不佳,尤其是当您有大量数据时。因此,作为最后一步,您可能希望在传输过程完成后合并文件。
  • 关于java - 在Java中将不同类型的数据序列化为ORC格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51615108/

    相关文章:

    Hadoop 包 : how to specify a region? 中的 hadoop-ec2

    c# - 使用不同的名称对 Json.Net 进行序列化和反序列化

    java - 如何使用JAVA SQL语句在每个Apache ignite缓存中创建表?

    hadoop - 在 Crontab 上安排 Hive 查询

    java - 在应用程序崩溃之前获得时间

    hadoop - 在 hive 中加入一张 table 两次

    c# - 为什么 C# 空条件运算符不适用于 Unity 可序列化变量?

    django - 如何在我的 HyeprlinkedModelSerializer 中使用自定义序列化器字段

    java - 如何在java中匹配另一个类中的arraylist数据

    java - HashMap 以小数形式打印字母频率?