【问题标题】:Efficiently write avro record to avro file高效地将 avro 记录写入 avro 文件
【发布时间】:2015-11-23 06:45:53
【问题描述】:

如何有效地将新的 avro 记录添加到现有的 avro 文件中。我的 avro 文件会不断增大,我不想将文件打开到内存中。您能告诉我们实现这一目标的效率吗?

【问题讨论】:

  • 您尝试使用哪种语言进行此操作?爪哇?

标签: avro


【解决方案1】:

您可以使用DataFileWriter.appendTo。这不会将现有文件的内容加载到内存中。 (在底层,它将读取文件的开头以查找架构和其他元数据,然后附加到末尾而不加载中间的内容。)

如果您想在 HDFS 上执行此操作,this gist 可能也是一个不错的起点。

【讨论】:

  • 如何避免在进行 avro 序列化时将文件(大小高达千兆字节)加载到内存中。 avro 有没有一种方法可以支持加载文件并仅在写入 avro 文件时进行序列化。??
  • 以上不会将整个文件加载到内存中,因此即使您的文件是多个 GB 也可以正常工作。 (不确定混乱是否来自那里,但是当您在 Java 中编写 new File(somePath) 时,它不会将文件的内容加载到内存中,它主要只是执行一些路径解析逻辑。)
  • 但在我的情况下,我必须发送存储在 hdfs 中的文件指针,为文件构造一些元数据并将记录(以及通过 avro 序列化的元数据和文件)再次保存到 hdfs。
  • 我不确定您所说的“通过 avro 序列化元数据和文件”是什么意思,但上面链接的要点显示了如何将记录附加到 HDFS 上的文件(如果您的集群支持附加到文件)。如果您通过具体示例更新您的问题(澄清您正在编写的元数据等),那将很有帮助。
【解决方案2】:

您的问题和相关技术不明确;但我会尽力回答我所理解的。 我会假设您在 HDFS 中执行此操作。

data in dir vs files:

在 HDFS 中,您可以考虑目录而不是文件。 Hadoop 生态系统中的工具,例如hive 或 spark 允许您从目录中读取“数据”,而无需考虑目录中存储的文件数量。 这样,您将文件添加到目录中,您的“查询”将逐步显示或获取越来越多的数据。

AVRO , record based:

我将 AVRO 文件视为 avro 记录。假设您有一个 avro 模式,并且您在内存/程序/代码中生成一个对象,然后将其转换为 AVRO 格式。此对象将转换为一个 avro 记录。如果您将该数据写入文件,那将是一个 avro 记录。在 10 天的过程中,如果您在同一个目录中写入 10 个文件,那么当您读取“目录”时,您现在将拥有 10 条记录。

immutability:

一般来说,我认为 HDFS 数据是不可变的。任何写入的文件主要是读取而不是修改。这同样适用于 AVRO 记录,它只不过是一个包含模式和数据的文件。也就是说,您通常不会读取同一个文件并对其进行修改。我假设您将添加新数据而不是修改它。因此,您将只是创建新记录。

serialize multiple objects to one file:

现在让我们考虑一下您确实想将“多个”对象写入一个文件。 我将假设您在给定的时间点实际上在您的手/代码中拥有这些多个对象,并希望保留到单个文件中。 如果您使用jackson-dataformat-avro,它会提供一个SequenceWriter 来做到这一点。

SequenceWriter w = mapper.writer(schema).writeValues(mySingleAvroFile); 
w.write(firstObject); 
w.write(secondObject); 
...
w.close(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多