MENU

Apache Avroとは|スキーマ進化に強い行指向データ形式

Apache Avro アイキャッチ
Apache Avro

Apache Avro(アヴロ)は2009年にHadoopの主要メンテナDoug Cuttingが発案した行指向のデータシリアライズフォーマットで、Apache Software Foundationのトップレベルプロジェクトとして発展してきた。Protocol BuffersやThriftと並ぶバイナリ表現でありながら、スキーマをJSON形式で表現し、ファイル先頭やレジストリに同梱できる点が独特だ。Kafkaの推奨シリアライズ形式として広く採用され、ストリーミング基盤の標準言語となっている。

目次

この記事の目次

  1. Avroのデータモデルとファイル構造
  2. スキーマ進化と互換性ルール
  3. ParquetやProtoとの使い分け
  4. 運用時のチェックポイント
  5. まとめ

Avroのデータモデルとファイル構造

Avroのデータモデルとファイル構造

Avroのデータモデルはrecord・enum・array・map・union・fixed・nullなどのプリミティブと複合型から成り、これらをJSONで宣言する。スキーマ自体がデータと切り離せるため、バイナリ本体にはタグや型名を書かず、純粋に値だけを並べたコンパクトなレイアウトが実現される。1行のサイズが小さいぶん、JSONやCSVと比べて1桁以上の効率改善が見込める。

Object Container Fileと呼ばれる標準ファイル形式では、先頭にスキーマJSONをメタデータブロックとして埋め込み、その後に複数のデータブロックが続く。ブロックごとにDeflateやSnappyで圧縮可能で、ファイル末尾にはsyncマーカーがあるためHadoop MapReduceからの分割読み込みもしやすい。Hadoop時代の遺産だが、現在もMongoDBのoplogエクスポートやKafka Connectでよく見かける。

スキーマ進化と互換性ルール

スキーマ進化と互換性ルール

Avroの代名詞ともいえる機能がスキーマ進化である。書き込み側のWriter Schemaと読み出し側のReader Schemaが異なってもよく、フィールド追加・削除・名前変更(aliases)を一定ルールで吸収できる。新フィールドにdefault値を与えれば古いデータも問題なく読めるし、削除されたフィールドはReader側で無視されるという挙動が標準で定義されている。

この特性を最大限引き出すのがConfluent Schema Registryで、Kafkaの各トピックに対しスキーマのバージョンを管理し、Backward/Forward/Fullなど互換性レベルを強制する。Producerはスキーマ全体ではなくIDだけをメッセージに付けて送信するため、転送量もわずか数バイトの増加で済む。マイクロサービス間の契約を緩やかに保つ仕組みとしてAvroがデファクトになった背景がここにある。

ParquetやProtoとの使い分け

ParquetやProtoとの使い分け

AvroとParquetはしばしば対比されるが、用途が異なる。Avroは行指向で「1レコードずつ読み書きする」ストリーミングや短期保管に強く、KafkaやLogging Pipelineの中間形式に向く。一方Parquetは列指向で「大量レコードを一括集計する」用途に最適化され、データレイクの長期保管層に向く。Kafkaで流れてきたAvroを、最終的にSparkでParquetに変換してS3へ書き出す、というハイブリッド構成が王道だ。

Protocol BuffersやThriftもバイナリ形式だが、これらはRPCの文脈で型コード生成を前提に設計されており、スキーマがコードと一体化する。Avroは動的型付け言語(Python、Ruby)からも扱いやすく、ジェネリックレコードAPIで実行時にフィールドを読める。「契約を強制したい」ならProto、「ログ/イベント中継でスキーマも一緒に運びたい」ならAvro、と整理すると役割が掴みやすい。

運用時のチェックポイント

運用時のチェックポイント

Avro導入で最初に決めるべきは「スキーマレジストリを使うか単体ファイルにするか」である。Kafkaが絡むなら迷わずConfluent Schema Registryを採用すべきで、互換性レベル(BACKWARD推奨)と削除ポリシーをチームで合意する必要がある。スキーマレジストリの可用性は本番Kafkaクラスタと同等に重要で、SPOFにしない設計が肝要だ。

Logical Typesの扱いも頻出の落とし穴である。timestamp-millis、decimal、uuidなどはAvro仕様上は規定されているが、ランタイムによってtimezone解釈やprecisionの扱いが微妙に異なる。とくにdecimalはScale指定の取り違いで金額計算が壊れる事故が起きるため、送信側と受信側でユニットテストを揃えてから本番投入することを強く推奨する。

まとめ

Apache Avroはスキーマ進化を前提に設計された行指向シリアライズの代表格で、Kafka中心のストリーミング基盤において事実上の共通語となっている。ファイル単体でも自己記述的で扱いやすく、長期保管にはParquetへ橋渡しする使い方が定石だ。型契約とコンパクトさを両立したい場面では最初に検討すべき形式である。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次