Apache flink 弗林克';s";TypeSerializedOutputFormat“;将奇怪的二进制数据写入到一起

Apache flink 弗林克';s";TypeSerializedOutputFormat“;将奇怪的二进制数据写入到一起,apache-flink,Apache Flink,我使用Flink生成数组数据,供其他应用程序使用。(我不需要数组的任何元信息) 我比较了二进制数据和Flink生成的文本数据,发现二进制数据中有一个奇怪的数据 val bin_output_format = new TypeSerializerOutputFormat[(Long, Long)] bin_output_format.setWriteMode (WriteMode.OVERWRITE) bin_output_format.setOutputFilePath(new Path (

我使用Flink生成数组数据,供其他应用程序使用。(我不需要数组的任何元信息) 我比较了二进制数据和Flink生成的文本数据,发现二进制数据中有一个奇怪的数据

val bin_output_format = new TypeSerializerOutputFormat[(Long, Long)]  
bin_output_format.setWriteMode (WriteMode.OVERWRITE)
bin_output_format.setOutputFilePath(new Path (s"${outDir}/NAME_Binary")) 

tuple_pair_list.map { tuple => tuple._1 + "\t" + tuple._2}.writeAsText(s"${outDir}/NAME_TXT", WriteMode.OVERWRITE)                        
tuple_pair_list.output (bin_output_format)
  • 如何删除附加在二进制文件末尾的metainfo? (看起来像是条目数)

  • 为什么里面有一些错误的数据?我可以移除它们吗?您可以在下图中看到两者之间的差异。(两个(127,-1,-1)和一个空值)


  • 我在这里遗漏了什么吗?

    Flink的
    TypeSerializerOutputFormat
    设计用于与
    TypeSerializerInputFormat
    一起工作,并允许并行文件扫描。Flink使用它的内部序列化程序进行二进制编码。其中一些序列化程序基于外部库,如Avro和Kryo。每当Flink的序列化程序(或使用的库)的内部实现发生更改时,编码可能会更改。此外,输出格式在固定块边界对齐数据,如果记录跨越边界,则使用填充


    因此,
    TypeSerializerOutputFormat
    的输出并不意味着被其他工具或读取器使用。我将实现一个定制的
    OutputFormat

    Flink的
    TypeSerializerInputFormat
    设计用于与
    TypeSerializerInputFormat
    一起工作,并允许并行文件扫描。Flink使用它的内部序列化程序进行二进制编码。其中一些序列化程序基于外部库,如Avro和Kryo。每当Flink的序列化程序(或使用的库)的内部实现发生更改时,编码可能会更改。此外,输出格式在固定块边界对齐数据,如果记录跨越边界,则使用填充


    因此,
    TypeSerializerOutputFormat
    的输出并不意味着被其他工具或读取器使用。我将实现一个定制的
    OutputFormat

    为了扩展Fabian的答案,Flink的
    TypeSerializer*格式
    与Hadoop的SequenceFile格式相当。也许在自定义应用程序中使用Flink的TypeSerializerInputFormat(以非并行方式)也更容易。另一个选项是Avro、拼花等格式。明白了!。感谢您的及时回复:D似乎我需要为自己的目的自定义“BinaryOutputFormat”类。请注意,支持并行扫描的块边界逻辑是在
    BinaryOutputFormat
    中实现的。因此,生成的文件可能也有内部填充字节。如果您想为“简单”顺序扫描编写二进制文件,您应该扩展
    FileOutputFormat
    。为了扩展Fabian的答案,Flink的
    TypeSerializer*格式可以与Hadoop的SequenceFile格式相媲美。也许在自定义应用程序中使用Flink的TypeSerializerInputFormat(以非并行方式)也更容易。另一个选项是Avro、拼花等格式。明白了!。感谢您的及时回复:D似乎我需要为自己的目的自定义“BinaryOutputFormat”类。请注意,支持并行扫描的块边界逻辑是在
    BinaryOutputFormat
    中实现的。因此,生成的文件可能也有内部填充字节。如果要为“简单”顺序扫描编写二进制文件,应扩展
    FileOutputFormat