Avro
Avro は、様々なプログラミング言語でデータをコンパクトかつ効率的にシリアル化できるデータシリアル化システムです。これは、Apache Hadoop プロジェクトの一環として開発されたもので、ビッグデータシステムでデータのシリアル化、プロセス間通信およびデータの格納によく使用されています。
Avro を使用すると、データのスキーマを JSON 形式で定義できます。これを使用すれば、言語に依存しない方法でデータをシリアル化および逆シリアル化することができます。スキーマには、データタイプとデータ構造に関する情報が含まれています。このスキーマを使用して、様々なプログラミング言語のコードを生成します。スキーマは、これらの言語で記述されたデータのシリアル化や逆シリアル化に使用できます。
CSV や JSON などの従来のデータ形式には、次のようなメリットとデメリットがあります。
CSV
メリット:
- 解析しやすい
- 比較的読みやすい
- 解釈しやすい
デメリット:
- データタイプに一貫性がない
- 解析がトリッキー
- 構造を適用しにくい
JSON
利点:
- 複数形式のデータ(配列、ネストした要素など)をサポート
- データ通信の公認 web 標準
- 任意の言語で読み取り可能
- 共有しやすい
デメリット:
- スキーマが適用されない
- キーの繰り返しでサイズが大きくなることがある
Avro
ここで Avro の出番です。XML/JSON の欠点を最小限に抑えながら、データの検証と転送にスキーマベースのアプローチを使用することができます。スキーマは JSON で記述されています。Avro を使用して記述されたコードには、スキーマとペイロードの両方が埋め込まれています。 Avro には、次のようなメリットがあります。
- データが完全に型指定されている
- データが自動的に作成される
- ドキュメントがスキーマに埋め込まれている
- 多くの言語で読み取ることができる
- スキーマを安全に拡張できる
ただし、Avro には次のような欠点があります。
- 導入に制限がある
- スキーマを読み取るには追加のツールが必要になる場合がある(シリアル化と圧縮)
Avro スキーマ
Avro スキーマ定義は JSON レコードです。これはレコードなので、JSON 配列で構成された複数のフィールドを定義することができます。そうした各フィールドには、フィールドの名前とタイプが指定されています。タイプは、整数のような単純なものでも、別のレコードのような複雑なものでも構いません。
{ "type" : "record", "name" : "userInfo", "namespace" : "my.example", "fields" : [{"name" : "age", "type" : "int"}] }
Avro でサポートされているプリミティブデータタイプの一覧を次に示します。
- null:値なし
- boolean:二値
- int:32 ビット符号付き整数
- long:64 ビット符号付き整数
- float:単精度(32 ビット)IEEE 754 浮動小数点数
- double:倍精度(64 ビット)IEEE 754 浮動小数点数
- bytes:8 ビット符号なしバイトのシーケンス
- string:Unicode 文字シーケンス
Avro では、レコード、列挙、配列、マップ、共用体、固定の 6 つの複合タイプをサポートしています。詳しくは、Avro のドキュメントを参照してください。
Avro 用の ColdFusion メソッド
プロトコルバッファー
プロトコルバッファー(protobuf)は、構造化データをシリアル化するための、言語にもプラットフォームにも依存しない拡張可能なメカニズムです。これは、様々なサービスやアプリケーション間でデータを転送するために、XML および JSON の代わりとして Google で開発されたものです。
プロトコルバッファーは、コンピューターで効率的に解析できるシンプルかつコンパクトなバイナリ形式を使用しているので、ネットワーク接続された高性能なシステムに最適です。これは、言語に依存しないスキーマを使用してデータ構造を定義し、Java、C++、Python を始めとする様々なプログラミング言語でそのデータ構造の読み取りと書き込みを行うためのコードを生成します。
protobuf を使用するメリットの 1 つは、XML や JSON などの従来のテキストベース形式と比較して、データの格納と転送をコンパクトかつ効率的に行えることです。この結果、帯域幅の使用量とデータ処理時間の点で、パフォーマンスが大幅に向上します。
全体として、プロトコルバッファースキーマは、様々なプログラミング言語やプラットフォームでデータのシリアル化と逆シリアル化に使用できる構造化データ形式を簡単に定義する手段となります。メッセージ定義には、宣言済みの型を持つ 3 つのフィールド定義と、一意の割り当て済みタグ番号が含まれています。
プロトコルバッファースキーマ
プロトコルバッファースキーマは、プロトコルバッファーを使用してシリアル化および逆シリアル化されるデータの構造を定義するファイルです。スキーマは、プロトコルバッファー言語(プロト言語)と呼ばれる単純な言語を使用して定義されます。この言語は、プラットフォームに依存せず、人間にとってもマシンにとっても理解しやすいように設計されています。
次の例では、name、id および email の 3 つのフィールドを持つ「Person」というメッセージを定義している簡単なプロトコルバッファースキーマを示しています。
syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; }
この例では、使用しているプロトコルバッファー仕様のバージョン(この場合は proto3)を最初の行で指定しています。message キーワードは「Person」という新しいメッセージタイプを定義しています。メッセージ定義内には 3 つのフィールドがあり、それぞれにタイプと一意のタグ番号が指定されています。
string、int32 および float は、プロトコルバッファーでサポートされているプリミティブデータタイプの一部ですが、カスタムタイプも定義できます。各フィールドには、シリアル化の際にフィールドの識別に使用される一意のタグ番号が付与されます。
メモ:プロトコルバッファーは Solaris ではサポートされていません。