Apache Avro

AvroはHadoop Hadoopで開発された行指向のRPCおよびデータシリアライゼーションフレームワークである。JSONを使用してデータ型とプロトコルを定義し、データをコンパクトなバイナリフォーマットにシリアル化する。主な用途は、永続化データのシリアル化フォーマット、Hadoopノード間の通信とHadoopサービスのクライアントプログラムのためのlabel=ワイヤーフォーマットである。Avroはエンコードされるデータを構造化するためのスキーマを使用する。人間が編集するためのスキーマ言語（Avro IDL）とJSONを基にしたよりlabel=機械可読なスキーマ言語の2種類がある。 
ThriftやProtocol Buffersに似ているが、スキーマが変更された場合でも（静的な型付き言語が必要でない限り）、コード生成プログラムを実行する必要はない。
Apache Spark SQLはデータソースとしてAvroにアクセスできる。

**Avroのオブジェクトコンテナファイル**
Avroのオブジェクトコンテナファイルには次の要素から構成される。- ファイルヘッダ- それに続く1つ以上のデータブロック
ファイルヘッダは次の要素から構成される。- 4倍とのASCII文字'O'、'b'、'j'と、それに続くAvroのバージョン番号1（0x01）（バイナリ値は0x4F 0x62 0x6A 0x01）。- スキーマ定義を含むファイルメタデータ。- ファイルごとにランダム生成された16バイト同期マーカー。
データブロックに対しては、Avroはシリアル化エンコーディングとしてバイナリとJSONの2種類が指定できる。ほとんどのアプリケーションはサイズが小さく高速なため、バイナリエンコーディングを使用している。デバッグとウェブベースのアプリケーションの場合はJSONエンコーディングが適切な場合もある。

**スキーマ定義**
AvroのスキーマはJSONを使用して定義される。スキーマは、プリミティブ型（null、boolean、int、long、float、double、bytes、string）と複合型（record、enum、array、map、union、fixed）から構成される。
単純なスキーマの例:
{
"namespace": "example.avro",
"type": "record",
"name": "User",
"fields": 
{"name": "name", "type": "string"},
{"name": "favorite_number",  "type": "null", "int"},
{"name": "favorite_color", "type": "null", "string"}

}

**シリアライズとデシリアライズ**
Avroのデータは対応するスキーマとともに保存することもできる。その場合、シリアル化されたデータ事前にスキーマを知らなくても読み込むことが可能である。

**シリアライズとデシリアライズを行うPythonコードの例**
シリアライズ:
import avro.schema
from avro.datafile import DataFileReader, DataFileWriter
from avro.io import DatumReader, DatumWriter
# Need to know the schema to write. According to 1.8.2 of Apache Avro
schema = avro.schema.parse(open("user.avsc", "rb").read())
writer = DataFileWriter(open("users.avro", "wb"), DatumWriter(), schema)
writer.append({"name": "Alyssa", "favorite_number": 256})
writer.append({"name": "Ben", "favorite_number": 8, "favorite_color": "red"})
writer.close()
ファイルusers.avroは、以下のように、JSONのスキーマとデータのコンパクトなバイナリ表現を格納している。
$ od -v -t x1z users.avro 
0000000 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63  >Obj...avro.codec.null.avro.schema..{"type": "record", "name": "User", "namespace": "example.avro", "fields": {"type": "string", "name": "name"}, {"type": "int", "null", "name": "favorite_number"}, {"type": "string", "null", "name": "favorite_color"}}......GTb.h...B.$.,.Alyssa.....Ben....red.....GTb.h...B.$デシリアライズ:
# The schema is embedded in the data file
reader = DataFileReader(open("users.avro", "rb"), DatumReader())
for user in reader:
print(user)
reader.close()
このコードの出力は次のようになる。
{'name': 'Alyssa', 'favorite_number': 256, 'favorite_color': None}
{'name': 'Ben', 'favorite_number': 8, 'favorite_color': 'red'}

**APIがあるプログラミング言語**
理論的にはどんな言語もAvroを使用できるが、以下の言語にはすでにAPI実装が存在する:- C- C++- C#- Elixir- Go- Haskell- Java- JavaScript- Perl- PHP- Python- Ruby- Rust- Scala

**Avro IDL**
Avroの型とプロトコル定義には、JSONのサポートに加えて、Avro IDL（旧称GenAvro）と呼ばれる実験的な代替のインタフェース記述言語（IDL）構文のサポートも提供されている。このフォーマットは、より伝統的なIDLやプログラミング言語に慣れたユーザーが簡単に適応できるように設計されており、C/C++やProtocol Buffersなどに似た構文を持つ。

**ロゴ**
オリジナルのApache Avroのロゴは現在は倒産したイギリスの航空機製造会社Avro（元A.V. Roe and Company）に由来している。
Apache Avroのロゴは2023年末にオリジナルのデザインに更新された。

**関連項目**
 Comparison of data serialization formats- Apache Thrift- Protocol Buffers- Etch (protocol)- Internet Communications Engine- MessagePack- CBOR

**出典**

**参考文献**
 last=White