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