我对 Hadoop 很陌生,必须深入研究它的序列化。我知道 Hadoop 带有自己的称为 Writables 的序列化程序。我很想知道 Avro(或 protobuf,thrift)是否取代了 Writables 接口,或者 Avro 仅用于序列化 MR 客户端数据,而不是用于序列化 namenode 和 datanode 之间的内部通信。
2 回答
我在某处读到 Avro 很可能最终成为 Hadoop 中的标准内部数据交换机制/序列化框架,这很有意义,因为它基于继承,就像“新”Hadoop API(使用 mapreduce 命名空间的 API)为其库),而“旧” API(mapred 库)基于接口。这意味着,在实践中,您当然可以将 avro 与这两个 API 一起使用,尽管如果您使用 mapred 库(例如,多种输出格式、链映射器),可能需要自定义代码一两件事。
但是 Avro 提供的远不止“仅仅”消除对您自己的可写文件的需求(尽管在我看来,这是一个相当大的优势):它提供了相当有效的序列化,在针对生成的实体类进行序列化之间的选择(如 thrift 需要) 或使用所谓的 GenericRecord 结构,而不必标记数据。这是可能的,因为 Avro 始终在读写时提供其数据模式(它实际上以 json 格式保存为数据文件中的标题),这意味着您可以选择从一组字段“投影”到通过简单地在用于读取数据的模式中隐含地提供此信息来获得这些字段。然后,您可以通过调整模式来适应输入数据结构的变化,而不是在多个地方更改代码。
AVRO 是一个序列化库(带有多种语言的 api)。AVRO 是使用/实现 Key/Value 对象作为 Writables 的替代方法,但是当在各种服务(数据节点、名称节点、作业和任务跟踪器)之间进行通信时,hadoop 仍然使用它自己的 RPC 数据结构。