ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
要点
- Apache Avro は Hadoop プロジェクト発祥の行指向(Row-oriented)バイナリシリアライゼーション形式で、拡張子は
.avro。 - スキーマを JSON で定義し、本体はバイナリで持つ。スキーマがファイル先頭に同梱されるため、自己記述的(self-describing)。
- スキーマ進化(Schema Evolution)に強く、フィールド追加・削除・型互換変更を後方互換で扱える設計が組み込まれている。
- Apache Kafka のメッセージシリアライザの事実上の標準で、Confluent Schema Registry と組み合わせて使われる。
概要
Avro は 2009 年に Hadoop の作者 Doug Cutting らが「Hadoop の RPC とデータ保存を統一する」目的で立ち上げた OSS である。当時 Thrift や Protocol Buffers(Protocol Buffers)が同種の枠組みとして存在していたが、Avro はそれらが「コード生成必須」「タグ番号必須」だったのに対し、スキーマだけあれば動的に読み書きできる(コード生成は任意)という設計を採った点が大きな違いになっている。
用途としては大きく 2 系統あり、ひとつは バッチ系: Hadoop / Hive / Spark で長期保管するレコードを Avro 形式で書き出し、後から SQL で集計する。もうひとつは ストリーミング系: Kafka に流れるメッセージの 1 レコードを Avro でエンコードし、Schema Registry で型を共有する。とくに Kafka 連携での存在感が大きく、現代の Avro 利用の主戦場はこちらに移っている。
Parquet/ORC が「列指向で集計に強い」のとは対照的に、Avro は行指向で書き込み・追記・1 行単位の取り出しが速い。アクセスパターンが「直近の 1 件を取りたい」「ストリームで流れてくる」場合は Avro、「数億行を列で舐めて集計したい」場合は Parquet という棲み分けになる。
内部構造
Avro ファイル(Object Container File)は次のレイアウトを持つ。
- ヘッダ: マジックバイト
Obj\1、メタデータ(スキーマ JSON、圧縮コーデック)、16 バイトのシンクマーカ。 - データブロック: 複数レコードをまとめたブロック。先頭にレコード数、バイト数、その後にバイナリ本体、最後に再度シンクマーカ。
- シンクマーカは破損時の再同期点として機能し、Hadoop の InputSplit 境界としても使われる。
スキーマは JSON で表現される。例:
{
"type": "record",
"name": "User",
"fields": [
{ "name": "id", "type": "long" },
{ "name": "name", "type": "string" },
{ "name": "email", "type": ["null", "string"], "default": null }
]
}
["null", "string"] のような Union 型で nullable を表す。バイナリ本体はタグ番号を持たず、スキーマ順にそのまま並べていく 位置型(positional) エンコーディングのため、Protocol Buffers よりさらに小さくなることが多い。その代わり、スキーマが無いと 1 バイトも復号できない。
主な用途
- Kafka + Schema Registry: Producer/Consumer 間でスキーマを共有し、互換性ルール(BACKWARD/FORWARD/FULL)を自動チェック。プロダクション Kafka では半ば必須。
- Hadoop/Hive のレコード保存: 1 件 1 件追記する性質のログ(クリックストリーム、アクセスログ)に向く。
- RPC のメッセージ: Hadoop の HDFS/YARN 内部通信などで利用。
- 長期アーカイブ: スキーマがファイルに同梱されるため、数年後でもスキーマ別管理不要で読める。
関連形式との比較
| 形式 | 方向 | スキーマ | 得意 |
|---|---|---|---|
| Avro | 行 | JSON、ファイル同梱 | Kafka / ストリーミング / スキーマ進化 |
| Protocol Buffers | 行 | .proto、別管理 | gRPC / アプリ間通信 |
| Parquet | 列 | ファイル内 | OLAP / 大規模集計 |
| JSON | 行(テキスト) | 無 | Web API |
Protocol Buffers と用途は似るが、Protobuf が「クライアント/サーバ間の RPC ペイロード」に振った設計であるのに対し、Avro は「ファイルとして長期保管しても自己記述で読めること」に振っている点で住み分けがある。
コマンド・ツール
公式 CLI は avro-tools で、Apache Avro のリリース jar として配布される。
$ java -jar avro-tools-1.11.3.jar getschema user.avro
$ java -jar avro-tools-1.11.3.jar tojson user.avro | head
$ java -jar avro-tools-1.11.3.jar fromjson --schema-file user.avsc input.json > user.avro
Python では fastavro が標準的に使われる。
import fastavro
with open("user.avro", "rb") as f:
reader = fastavro.reader(f)
for record in reader:
print(record)
Kafka 連携では、Confluent の Python/Java クライアントに含まれる AvroSerializer / AvroDeserializer 経由で読み書きするのが普通で、レコード単体(ファイルヘッダなし)のワイヤフォーマットになる。
注意点
- スキーマが無いと読めない: ファイル形式ならヘッダ同梱だが、Kafka の素のメッセージはスキーマを別チャネル(Schema Registry)で配ることが前提。
- 列指向ではない: 「数億行 × 数十列のうち 2 列だけ集計」は遅い。集計用には Parquet/ORC に変換する。
- Union 型の扱いに注意:
["null","string"]の順序が違うとデフォルト値の意味が変わる。互換性ルールで「最初の型をデフォルト型として扱う」と決まっている。 - JSON エンコーディングは大きい:
avro-tools tojsonは人間用のデバッグ表示で、容量は CSV 並みかそれ以上に膨らむ。本番運用ではバイナリ前提。
関連リンク
- 親: データベース・データ交換
- 概論: ファイル拡張子とは
- カテゴリ: データベース(カテゴリ)
- 関連する形式: Parquet(.parquet) / ORC(.orc) / Protocol Buffers(.proto)
- テキスト系: CSV(.csv)
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?