Avro

summary:

Avro[/ˈæv.roʊ/]とは,Apache Software Foundationが開発したオープンソースのデータシリアライゼーションフレームワークである.2009年に最初のバージョンがリリースされ,特にHadoopエコシステムにおけるデータ交換および永続化を効率的に行うことを目的として設計された.

Avroはスキーマに基づくシリアライゼーション方式を採用しており,データ本体と共にスキーマ情報も保存することで,異なるシステム間,異なるプログラミング言語間での高い相互運用性を実現する.

Avroという名称の由来は,かつて存在したイギリスの航空機メーカーのA.V. Roe and Company[通称Avro]に因む.

この会社名Avroは,創業者であるAlliott Verdon Roe[アリオット・ヴァードン・ロー]の名前の頭文字と姓に由来しており,彼はイギリス航空史において非常に著名な技術者であった.なお,航空機メーカーのAvroは1950年代にHawker Siddeley Groupに吸収合併され,その後,Hawker Siddeley自体も1977年にBritish Aerospace[BAE Systemsの前身]に統合された.

Apache Avroのプロジェクトにおいても,このAvroという言葉は,高速・効率的・先進的といった航空機技術に象徴されるイメージを重ね合わせる形で選ばれた.つまり,データの高速かつ効率的なシリアライゼーションと交換を目指すプロジェクトの精神を象徴する名称として採用されたのである.

なお,Avroの設計者の一人であるダグ・カッティング[Doug Cutting,LuceneやHadoopの生みの親]が,プロジェクト命名に関わった際に,「覚えやすく,短く,テクノロジーに関連するニュアンスを持つ単語」としてこの名称を選定したとされる.

Avroにおけるデータエンコーディングは,スキーマ駆動の構造を持つ.すなわち,各データ要素がどのような型[int,long,string,recordなど]を持つかは,事前に与えられたスキーマに完全に依存する.このため,データ本体には型情報を逐次的に埋め込む必要がなく,非常にコンパクトな形式が得られる.

Avroのバイナリエンコーディングでは,以下のような基本的方針が採られている.整数型[int, long]は可変長のZigZagエンコーディングとVarintエンコーディングによって符号付き整数として圧縮される.これにより,小さな数値は少ないバイト数でエンコードされる.文字列やバイト列は,先頭に長さ[バイト数]を可変長整数で付与した後に実データが続く形式を取る.固定長の型[fixed]は,指定されたバイト数だけをそのまま連続的に記録する.

Avroファイル[.avroファイル]は,さらにコンテナファイルフォーマットを採用している.このフォーマットでは,ファイル全体がヘッダー部と連続するデータブロック[data block]から構成される.ヘッダー部には,ファイル全体のスキーマ[JSON形式で記述された文字列]と,ファイルを識別するための16バイトのsync markerが格納される.このsync markerはデータブロック間に挿入され,並列読み出しやエラーからのリカバリーを容易にする役割を果たす.

データブロックは,同じスキーマに基づく複数のレコードをまとめた単位であり,次の構造を持つ.まず,含まれるレコード数が可変長整数で記録される.その後,ブロック全体の未圧縮サイズまたは圧縮サイズ[使用するcodecに依存]が記録され,最後にレコード群がバイナリエンコードされた形で保存される.Avroはデフォルトでは無圧縮[null codec]だが,SnappyやDeflateといった圧縮方式をオプションで指定することもできる.

例えば,以下のようなAvroスキーマを考える。

{ 
"type": "record",
"name": "User",
"fields": [
{"name": "id", "type": "int"},
{"name": "name", "type": "string"},
{"name": "email", "type": "string"}
]
}

このスキーマに基づき,次のレコードが与えられたとする.

id: 3
name: "Alice"
email: "alice@example.com"

このレコードは,まずidフィールドの3がVarintエンコーディング[可変長整数]として1バイトで格納される.次にnameフィールドの"Alice"の長さ[5バイト]がVarintエンコーディングされ,その後UTF-8エンコードされた文字列として"Alice"が続く.同様に,emailフィールドも長さがVarintエンコードされ,その後にUTF-8エンコードされた文字列本体が順番に格納される.このように,フィールド順に連続的にエンコードされるため,非常に高速な直列化とデシリアライズが可能となる.

Avroファイルとして保存する場合,これらのレコードは一定数まとめられて一つのデータブロックとされ,ファイルヘッダー,同期マーカー[sync marker],そしてファイルフッターとともに格納される.データブロックのサイズは実装や用途に応じて調整され,必要に応じてSnappyやDeflateなどの圧縮アルゴリズムを適用できる.各データブロック間に配置される同期マーカーにより,ファイルの任意の位置からの並列読み込みが可能になっている.

Mathematics is the language with which God has written the universe.





















TDM DataFusion NAT NIC OpenConfig マルチプレクサ