SlideShare a Scribd company logo
© 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation
NTTデータ テクノロジーカンファレンス 2019
ストリーミング処理における Apache Avro の活用について
2019年 9月 5日
株式会社NTTデータ 技術開発本部 先進基盤技術グループ
関 堅吾
© 2019 NTT DATA Corporation 2
Apache Avro とは
• Hadoop の生みの親である Doug Cutting が 2009年に始めたプロジェクトで、
以下の特徴を備えたデータフォーマットおよびシリアライザ/デシリアライザ
(以下, http://avro.apache.org/docs/1.9.1/ から抜粋・編集)
1. データのシリアライズ・デシリアライズにスキーマを用いる
2. 豊富なデータ型、コンパクトで高速なバイナリ形式のデータフォーマット
3. ファイル永続化のサポート
4. 多様なプログラミング言語から容易に扱える
• 本LTでは、上記の観点から、昨今事例が増えてきたストリーミング処理において、
Avro がデータ交換フォーマットに向いていると考える理由を説明したいと思い
ます。
© 2019 NTT DATA Corporation 3
Avro によるデータ交換の流れ
a 27
b "foo"
オブジェクト
Avroスキーマ
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
ファイルシステム0x3606666f6f
Binary-encoded
Avro data
BinaryEncoder
DatumWriter
+
アプリケーションB
a 27
b "foo"
hash
0x3606666f6f
BinaryDecoder
DatumReader
+
4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec
08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem
61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec
6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t
65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields":
5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long"
2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"},
7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string
22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}]
7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }...............
a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo.......
c0 b8 fc 78 79 71 bd a0 da | .........
DataFileWriter
アプリケーションA
file header
file data block
アプリケーションC
a 27
b "foo"
dictionary
0x3606666f6f
BinaryDecoder
DatumReader
+
DataFileReader
※下線は Avro が提供するクラスを示す
Object container file
© 2019 NTT DATA Corporation 4
「1. データのシリアライズ・デシリアライズにスキーマを用いる」
a 27
b "foo"
オブジェクト
Avroスキーマ
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
ファイルシステム0x3606666f6f
Binary-encoded
Avro data
BinaryEncoder
DatumWriter
+
アプリケーションB
a 27
b "foo"
hash
0x3606666f6f
BinaryDecoder
DatumReader
+
4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec
08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem
61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec
6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t
65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields":
5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long"
2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"},
7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string
22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}]
7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }...............
a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo.......
c0 b8 fc 78 79 71 bd a0 da | .........
DataFileWriter
アプリケーションA
file header
file data block
Object container file
アプリケーションC
a 27
b "foo"
dictionary
0x3606666f6f
BinaryDecoder
DatumReader
+
DataFileReader
※下線は Avro が提供するクラスを示す
スキーマを用いてシリアライズ・デシリアライズを行うことで、
シリアライズ後のデータはフィールド名や型に関する情報を
持たずに済み、デシリアライズ時にはデータのバリデーション
も行える
© 2019 NTT DATA Corporation 5
「2. 豊富なデータ型、コンパクトで高速なバイナリ形式のデータフォーマット」
a 27
b "foo"
オブジェクト
Avroスキーマ
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
ファイルシステム0x3606666f6f
Binary-encoded
Avro data
BinaryEncoder
DatumWriter
+
アプリケーションB
a 27
b "foo"
hash
0x3606666f6f
BinaryDecoder
DatumReader
+
4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec
08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem
61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec
6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t
65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields":
5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long"
2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"},
7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string
22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}]
7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }...............
a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo.......
c0 b8 fc 78 79 71 bd a0 da | .........
DataFileWriter
アプリケーションA
file header
file data block
Object container file
アプリケーションC
a 27
b "foo"
dictionary
0x3606666f6f
BinaryDecoder
DatumReader
+
DataFileReader
※下線は Avro が提供するクラスを示す
この例ではごく一部しか使っていないが、実際は以下のように豊富なデータ型を提供
・単純型: null, boolean, int, long, float, double, bytes, string
・複合型: record, enum, array, map, union, fixed (固定長バイト列)
上記に加えて、単純型をベースにした各種の論理型もサポート
(decimal, UUID, date, time, timestamp, duration) *durationはv1.9.1時点では仕様のみ
以下の仕様に基づき、プログラム中の変数をバイナリデータへ効率的にエンコード
https://avro.apache.org/docs/current/spec.html#binary_encoding
© 2019 NTT DATA Corporation 6
「3. ファイル永続化のサポート」
a 27
b "foo"
オブジェクト
Avroスキーマ
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
0x3606666f6f
Binary-encoded
Avro data
BinaryEncoder
DatumWriter
+
アプリケーションB
a 27
b "foo"
hash
0x3606666f6f
BinaryDecoder
DatumReader
+
4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec
08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem
61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec
6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t
65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields":
5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long"
2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"},
7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string
22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}]
7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }...............
a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo.......
c0 b8 fc 78 79 71 bd a0 da | .........
DataFileWriter
アプリケーションA
file header
file data block
Object container file
アプリケーションC
a 27
b "foo"
dictionary
0x3606666f6f
BinaryDecoder
DatumReader
+
DataFileReader
※下線は Avro が提供するクラスを示す
・ファイル永続化時には、スキーマがヘッダに埋め
込まれるため、ファイル単体でデシリアライズ可能
・また、スキーマはヘッダ中に1回しか現れないため、
1ファイルに格納するレコード数が多くなるほど、他
のデータフォーマットに比べて格納効率が良くなる
© 2019 NTT DATA Corporation 7
「4. 多様なプログラミング言語から容易に扱える」
a 27
b "foo"
オブジェクト
Avroスキーマ
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
ファイルシステム0x3606666f6f
Binary-encoded
Avro data
BinaryEncoder
DatumWriter
+
アプリケーションB
a 27
b "foo"
hash
0x3606666f6f
BinaryDecoder
DatumReader
+
4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec
08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem
61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec
6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t
65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields":
5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long"
2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"},
7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string
22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}]
7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }...............
a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo.......
c0 b8 fc 78 79 71 bd a0 da | .........
DataFileWriter
アプリケーションA
file header
file data block
Object container file
アプリケーションC
a 27
b "foo"
dictionary
0x3606666f6f
BinaryDecoder
DatumReader
+
DataFileReader
※下線は Avro が提供するクラスを示す
静的型付け言語向けに、スキーマから
クラス定義を生成できる
動的言語向けに、プログラム中から直接スキーマを読み込み、
マップ/辞書/ハッシュのような汎用的なデータ構造に
対応づけることも可能
© 2019 NTT DATA Corporation 8
本 LT で想定する「ストリーミング処理」の形態
本LTでは、以下のような形態の処理を想定して、上流と下流のアプリケーション間
で交換するデータ形式はどのような特性を備えていることが望ましいかを検討する。
なお、Google の Tyler Akidau 氏 (Apache Beam の作者) は、ストリーミング処理を「無限に生成されるデータセットに
対する処理」と定義している [1][2] が、本 LT では、実際にそのようなデータセットを扱う際に課題となることが多い
「データが常時流入してくる」「業務要件として低レイテンシを求められる」といった特性に着目した議論を行う。
[1]: https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101
[2]: http://streamingsystems.net/
上流アプリケーション メッセージング基盤
下流アプリケーション
© 2019 NTT DATA Corporation 9
ストリーミング処理でよく発生する要件・課題
実現したい業務や、メッセージング基盤 の選択にもよるが、ストリーミング処
理では以下のような要件や課題が発生することが多い。
1. 低レイテンシと十分なスループットの両立
2. 不正なメッセージに起因する問題のデバッグ・トラブルシュートの難しさ
3. メッセージの再送や配信遅延、到着順序の逆転
4. 許容されるダウンタイムの短さ
© 2019 NTT DATA Corporation 10
1. 低レイテンシと十分なスループットの両立
• 低レイテンシ
• そもそも、バッチ処理に比べて扱いにくいストリーミング処理をあえて導入するのは、業務要件上、処理
結果をできる限り即時に利用したいためであることが多い
• そのためには、データが溜まるのを待ってから一斉に処理するのではなく、個々のメッセージが到着し次
第、即座に処理を行う必要がある
• そういった用途には、Parquet や ORC のような列指向のフォーマットではなく、Avro のような行指向の
データフォーマットの方が向いている
• 十分なスループット
• 一方で、データは上流から常時流れてくるため、その速度に追いつけないとシステムがダウンしてしまう
• さらに、一時的なバーストへの耐性や、故障復旧時に追いつくための余力も考えると、流入速度の数倍の
処理性能は確保したい
• そのため、システム全体のキャパシティプランニングやアプリケーション設計を行うと同時に、採用する
データフォーマットも、高速にシリアライズ・デシリアライズできる必要がある
• Avro のシリアライズ・デシリアライズは高速であり、一般的な用途には十分な性能を備えている。ベンチ
マーク結果を以下に示す。
フィールド数・少 フィールド数・多
シリアライズ 314万件/秒 157万件/秒
デシリアライズ 647万件/秒 72万件/秒
AWS の m5.large インスタンス1台を使用し、Avro に付属するベンチマーク
ツールを用いて、単位時間あたりに処理できるレコード数を以下の2条件で測定。
• フィールド数・少: double と int, それぞれ3フィールドからなるレコード
• フィールド数・多: int, string, string[2], int[10], enum の各フィールドか
らなるレコードで、各 string の長さは70字未満のランダム
© 2019 NTT DATA Corporation 11
2.不正なメッセージに起因する問題のデバッグ・トラブルシュートの難しさ
• 流入データ中に不正なメッセージが混入していると、下流での読出し時にアプリケーションが異常終了したり、
気づかないうちに誤った処理結果を出力している場合がある
• しかし、以下のような理由から、不正メッセージに起因する問題のトラブルシュートは難航することが多い
• メッセージング基盤によっては、メッセージのディスク永続化をサポートしない、もしくはディスクに永続化すると
著しく性能が低下するものがある。その場合、メッセージはメモリ上にのみ存在するが、メモリ上のメッセージは時
間経過や容量の逼迫によって削除されるため、問題が発覚したタイミングでは、原因となったメッセージが既に存在
しない場合がある
• メッセージを取得する方法は、振り分け先のパーティション/シャードや、その中でのメッセージのオフセット/位
置を指定してアクセスするのが一般的だが、これだけでは原因となったメッセージを特定するのは難しく、だいたい
の位置を起点に、しらみつぶしに調査せざるを得ないことが多い
• そのため、アプリケーション設計時に、不正データ混入時の挙動を定義しておくのに加えて、データフォーマッ
ト自身も、スキーマによるバリデーションの仕組みを備えていることが望ましい
• Avro では、シリアライズ・デシリアライズにスキーマを使用することから、
• 上流での書込み時に、データがスキーマに従ってシリアライズされるため、少なくとも各フィールドの
型については、誤ったデータが下流に送られることはありえない。
• 下流での読込み時も、データはスキーマに従ってデシリアライズされ、スキーマに適合しないデータは
エラーとなることから、不正データの検出が容易である。
© 2019 NTT DATA Corporation 12
3. メッセージの再送や配信遅延、到着順序の逆転
• 再送や配信遅延については、アプリケーション層での対処が必要
• 再送に備えて、アプリケーションを冪等な作りにする
• 配信遅延に対しては、何らかの watermark を設けて、それ以降に受信したメッセージは破棄する仕様とする、等
• 到着順序の逆転については、新旧スキーマの混在が懸念される。例えば以下のようなケースでは、新しいス
キーマでシリアライズされたメッセージが、古いスキーマのものよりも先に到着しうる。
• メッセージを非同期に送信しており、何らかの理由で正常に送信できなかったものが再送に回る
• 全台停止ではなく、ローリングアップグレードで上流のスキーマを段階的に更新している
• 利用しているメッセージング基盤の仕様として、パーティション内やノード内での送達順序は保証されるが、それ
らを跨いでの順序は保証されない
• Avro では、シリアライズに用いたスキーマとデシリアライズに用いるスキーマが一致しない場合にどう解決さ
れるかが明確に定義されている [3] ため、下流のアプリケーションを新しいスキーマに更新した後に、古いス
キーマでシリアライズされたメッセージを受け取っても、スキーマ間で互換性があれば、安全に対処できる
• 書込み側のスキーマに存在するフィールドが読込み側に存在しない→そのフィールドは無視される
• 読込み側に存在するフィールドが書込み側に存在しない場合、読込み側でデフォルト値が
• 定義されている→デフォルト値が使われる
• 定義されていない場合→エラーになる
• 同名のフィールドの型が変更された場合、互換性があればキャストされる、等
[3] : https://avro.apache.org/docs/current/spec.html#Schema+Resolution
© 2019 NTT DATA Corporation 13
4. 許容されるダウンタイムが短い
• ストリーミング処理では一般に即時性が重視されるため、長時間の停止は SLA 違反に繋がる
可能性が高い
• また、データが常時流入してくるため、未処理のデータが大量に溜まってしまうと処理が追い
つけなくなり、過去のデータを未処理のまま破棄せざるを得なくなる
• Avro の場合、コミュニティやベンダーが提供している schema registry を使うことで、無停
止でのスキーマの更新や、上流・下流でのスキーマの連携が容易になる
• Schema Repo: https://github.com/schema-repo/schema-repo (AVRO-1124 から独立)
• Confluent Schema Registry: https://www.confluent.io/confluent-schema-registry
• Hortonworks Schema Registry: https://github.com/hortonworks/registry
• Avro 自身も、以下のような仕様や機能を用意しており、これらを利用して、自前で簡単な
schema registry を実装することも可能
• Single-object encoding: http://avro.apache.org/docs/current/spec.html#single_object_encoding
• Fingerprint: https://avro.apache.org/docs/current/spec.html#schema_fingerprints
• Parsing Canonical form:
https://avro.apache.org/docs/current/spec.html#Parsing+Canonical+Form+for+Schemas
© 2019 NTT DATA Corporation 14
27
Avro が提供する機能を利用した schema registry の実現例
e8 c6 … 3606666f6f
binary-
encoded
datadata
Avroスキーマ
C3 01
a
b "foo"
BinaryMessage
Encoder
Single-object
encoding
e8c6c20c615f2c47
Avroスキーマ Avroスキーマ
(parsing canonical form)
fingerprint
{"type": "record", "name": "test",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}]}
{"name":"test","type":"record","fiel
ds":[{"name":"a","type":"long"},{"na
me":"b","type":"string"}]}
不要な要素や空白・改行の除去
所定の順序による要素のソート
name要素の値を完全修飾名に、等
ハッシュ値 (CRC64, MD5,
SHA-256など) を計算
e8 c6 … {"name":"test","type":"record","fields":...
xx xx … {"name":“xxxx","type":"record","fields":...
上流アプリケーション
メッセー
ジング基
盤
e8 c6 … 3606...
Key-Value Store
BinaryMessage
Decoder
27
data
a
b "foo"
下流
アプリケーション
fingerprint
(説明は下記
を参照)
①データ送信時に、シリアライズに用いた
スキーマのfingerprintを計算し、スキーマ
の本体とともにKVSに登録
②データ受信時に、受け取ったfinger
printでKVSからスキーマ本体を引き、
それを用いてデシリアライズ
© 2019 NTT DATA Corporation 15
Schema Repo を用いたスキーマの共有とバージョン管理
27
3606666f6f
data
Avroスキーマ
a
b "foo"
q1 {"name":"test","type":"record","fields":...
q1 {"name":"test","type":"record","fields":...
上流アプリケーション メッセージング基
盤
Schema Repo (https://github.com/schema-repo/schema-repo)
27
data
a
b "foo"
下流
アプリケーション
①データ送信時に、シリアライズに用いたスキーマが未登録なら、
アプリケーション間であらかじめ共有できている文字列を
subject としてschema repoに登録し、ID(=バージョン情報)を
得る。ここでは投稿先のキュー名をsubjectとして使用。
②データ受信時に、subjectと受け取った
IDをキーに、Schema Repoからスキーマ
本体を引き、それを用いてデシリアライズ
Subject ID
q2
Schema
{"name":“xxxx","type":"record","fields":...
0
1
0
BinaryEncoder
DatumWriter
+
1
binary-encoded
data
ID
キュー q1
キュー q2
3606666f6f1
BinaryDecoder
DatumReader
+
同じsubjectに対して異なるバージョンの
スキーマを持つことが可能
© 2019 NTT DATA Corporation 16
(以降は、ストリーミング処理に固有の話題ではありませんが...)
© 2019 NTT DATA Corporation 17
5. ユースケースによっては、任意のバイト列を格納する必要がある
• ユースケースによっては、画像や音声、IoT デバイスや車載ネット
ワークからのセンサデータといったバイナリデータを扱う必要がある
• CSV や JSON のようなテキストベースのデータフォーマットだと、
バイナリデータを表現するには16進表記やBase64 など、冗長な表現
を用いる必要があり効率が悪い
• Avro はバイナリ形式のデータフォーマットなので、任意のバイト列
をコンパクトに格納できる
© 2019 NTT DATA Corporation 18
6. 多様な開発言語への対応
• 連携先の組織が異なると、その組織が習熟しているプログラミング言語を使って開発したい場合がある
• しかし、たとえば仕様が RFC で定められている CSV であっても、フィールド中にセパレータや改行が
含まれる場合の扱いなどが、パーサの実装によって異なる場合がある
• Avro は、コミュニティが公開している仕様 https://avro.apache.org/docs/current/spec.html に
従った実装が以下の言語で公式に提供されており、データの互換性に関する問題が少ない。
• Java
• C
• C++
• C#
• JavaScript
• Perl
• PHP
• ただし、現行バージョンである 1.9.1 までは 5.6 までの対応。1.10.0 からは 7.x 系に対応予定
(AVRO-2527). ※以降のスライドで、括弧内の赤字はNTTデータが貢献した JIRA issue の ID を示す。
• Python 2, 3
• fastavro という、高速化のために C で実装されたサードパーティ製のバインディングも存在
• Ruby
• それ以外にも、Erlang/Elixir, Go, Haskell, Julia, R, Rust 等の言語で、有志が非公式なバインディング
を開発している
© 2019 NTT DATA Corporation 19
参考: 圧縮形式の非互換性について
• Avro では、データの転送や格納を効率化するため、ファイル永続化時の圧縮をサポートしている
• 先述の Avro Specification によれば、無圧縮と deflate はどの言語でもサポート必須、snappy はオプ
ションとされている
• これに従い、ほとんどの言語では deflate (と無圧縮) をサポートしているが、PHP だけが最近まで
deflate をサポートしていなかった。→1.10.0 からサポート予定 (AVRO-2446).
• 一方で、Java では仕様に記載のない bzip2, xz, zstandard がサポートされている (1.9.1 時点).
• zstandard は利用されるケースが多いと考えたため、以下の言語でもサポートを追加した。
1.10 から利用可能になる予定。
• Perl (AVRO-2472)
• Python2 (AVRO-2426)
• Python3 (AVRO-2460)
• Ruby (AVRO-2464)
• ある言語でサポートされているからといって、適当な codec で圧縮すると、その codec をサポート
していない言語からは読めなくなってしまうので注意
• データの互換性を確認するためのテストも存在するのだが、一部の言語や圧縮形式しか実施
していなかったため、互換性テストを充実させる (AVRO-2452, AVRO-2453, AVRO-2456,
AVRO-2459, AVRO-2469, AVRO-2475) とともに、一部の言語に存在した互換性の問題を修正
した (AVRO-2468).
© 2019 NTT DATA Corporation 20
まとめ
• Apache Avro は、シリアライズ・デシリアライズにスキーマを用いるのが特徴の、豊富なデータ
型を備えた、コンパクトで高速なバイナリ形式の行指向データフォーマットです
• 以下のような理由から、ストリーミング処理に向いたデータフォーマットであると考えます
• 低レイテンシ処理向きの行指向フォーマット、高速なシリアライズ・デシリアライズ
• スキーマを用いたバリデーションによるメッセージ品質の担保
• スキーマに互換性があれば、古いスキーマでシリアライズされたメッセージを受け取って
もデシリアライズ可能
• Schema Registry の導入によるスキーマの共有や無停止での更新、バージョン管理
• それ以外にも、以下のような特徴があります
• バイナリ形式のデータフォーマットのため、任意のバイト列をコンパクトに格納できます
• バインディングが多様な言語で開発されています(ただし、ファイル永続化時の圧縮形式には注意)
• NTTデータも、Avro のデータ互換性を改善するための貢献などを、積極的に行っています
© 2019 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

More Related Content

What's hot

What's hot (20)

テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較KafkaとAWS Kinesisの比較
KafkaとAWS Kinesisの比較
 
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
Apache Kafkaによるログ転送とパフォーマンスチューニング - Bonfire Backend #2 -
 
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
ちょっと理解に自信がないな という皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)ちょっと理解に自信がないなという皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
ちょっと理解に自信がないな という皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
Google Cloud Dataflow を理解する - #bq_sushi
Google Cloud Dataflow を理解する - #bq_sushiGoogle Cloud Dataflow を理解する - #bq_sushi
Google Cloud Dataflow を理解する - #bq_sushi
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから
 

Similar to ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)

巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
Haruka Ozaki
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
Atsushi Hayakawa
 

Similar to ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05) (20)

20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
 
PostgreSQLのgitレポジトリから見える2022年の開発状況(第38回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2022年の開発状況(第38回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのgitレポジトリから見える2022年の開発状況(第38回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2022年の開発状況(第38回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
 
Dart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法について
Dart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法についてDart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法について
Dart のコード自動生成の仕組みと、コード自動生成のパッケージを自作する方法について
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
 
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
オープンソースのIoT向けスケールアウト型データベース GridDB 〜性能ベンチマーク結果とOSSを利用したビッグデータ分析環境〜
 
Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
Azure Data Box Family Overview and Microsoft Intelligent Edge Strategy
Azure Data Box Family Overview and Microsoft Intelligent Edge StrategyAzure Data Box Family Overview and Microsoft Intelligent Edge Strategy
Azure Data Box Family Overview and Microsoft Intelligent Edge Strategy
 
Qgislecture 0
Qgislecture 0Qgislecture 0
Qgislecture 0
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
 
D3js入門 - Code for Kobe 可視化勉強会資料
D3js入門 - Code for Kobe 可視化勉強会資料D3js入門 - Code for Kobe 可視化勉強会資料
D3js入門 - Code for Kobe 可視化勉強会資料
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Intoroduction of Pandas with Python
Intoroduction of Pandas with PythonIntoroduction of Pandas with Python
Intoroduction of Pandas with Python
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scio
 
Network as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSMNetwork as a Service - Data plane evolution and abstraction by NSM
Network as a Service - Data plane evolution and abstraction by NSM
 

More from NTT DATA Technology & Innovation

More from NTT DATA Technology & Innovation (20)

YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
 
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
 

Recently uploaded

2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
ssuserbefd24
 

Recently uploaded (10)

論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
2024年5月25日Serverless Meetup大阪 アプリケーションをどこで動かすべきなのか.pptx
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 

ストリーム処理におけるApache Avroの活用について(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)

  • 1. © 2019 NTT DATA Corporation 1 © 2019 NTT DATA Corporation NTTデータ テクノロジーカンファレンス 2019 ストリーミング処理における Apache Avro の活用について 2019年 9月 5日 株式会社NTTデータ 技術開発本部 先進基盤技術グループ 関 堅吾
  • 2. © 2019 NTT DATA Corporation 2 Apache Avro とは • Hadoop の生みの親である Doug Cutting が 2009年に始めたプロジェクトで、 以下の特徴を備えたデータフォーマットおよびシリアライザ/デシリアライザ (以下, http://avro.apache.org/docs/1.9.1/ から抜粋・編集) 1. データのシリアライズ・デシリアライズにスキーマを用いる 2. 豊富なデータ型、コンパクトで高速なバイナリ形式のデータフォーマット 3. ファイル永続化のサポート 4. 多様なプログラミング言語から容易に扱える • 本LTでは、上記の観点から、昨今事例が増えてきたストリーミング処理において、 Avro がデータ交換フォーマットに向いていると考える理由を説明したいと思い ます。
  • 3. © 2019 NTT DATA Corporation 3 Avro によるデータ交換の流れ a 27 b "foo" オブジェクト Avroスキーマ {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} ファイルシステム0x3606666f6f Binary-encoded Avro data BinaryEncoder DatumWriter + アプリケーションB a 27 b "foo" hash 0x3606666f6f BinaryDecoder DatumReader + 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem 61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t 65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields": 5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long" 2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"}, 7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string 22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}] 7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }............... a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo....... c0 b8 fc 78 79 71 bd a0 da | ......... DataFileWriter アプリケーションA file header file data block アプリケーションC a 27 b "foo" dictionary 0x3606666f6f BinaryDecoder DatumReader + DataFileReader ※下線は Avro が提供するクラスを示す Object container file
  • 4. © 2019 NTT DATA Corporation 4 「1. データのシリアライズ・デシリアライズにスキーマを用いる」 a 27 b "foo" オブジェクト Avroスキーマ {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} ファイルシステム0x3606666f6f Binary-encoded Avro data BinaryEncoder DatumWriter + アプリケーションB a 27 b "foo" hash 0x3606666f6f BinaryDecoder DatumReader + 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem 61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t 65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields": 5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long" 2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"}, 7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string 22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}] 7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }............... a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo....... c0 b8 fc 78 79 71 bd a0 da | ......... DataFileWriter アプリケーションA file header file data block Object container file アプリケーションC a 27 b "foo" dictionary 0x3606666f6f BinaryDecoder DatumReader + DataFileReader ※下線は Avro が提供するクラスを示す スキーマを用いてシリアライズ・デシリアライズを行うことで、 シリアライズ後のデータはフィールド名や型に関する情報を 持たずに済み、デシリアライズ時にはデータのバリデーション も行える
  • 5. © 2019 NTT DATA Corporation 5 「2. 豊富なデータ型、コンパクトで高速なバイナリ形式のデータフォーマット」 a 27 b "foo" オブジェクト Avroスキーマ {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} ファイルシステム0x3606666f6f Binary-encoded Avro data BinaryEncoder DatumWriter + アプリケーションB a 27 b "foo" hash 0x3606666f6f BinaryDecoder DatumReader + 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem 61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t 65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields": 5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long" 2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"}, 7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string 22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}] 7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }............... a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo....... c0 b8 fc 78 79 71 bd a0 da | ......... DataFileWriter アプリケーションA file header file data block Object container file アプリケーションC a 27 b "foo" dictionary 0x3606666f6f BinaryDecoder DatumReader + DataFileReader ※下線は Avro が提供するクラスを示す この例ではごく一部しか使っていないが、実際は以下のように豊富なデータ型を提供 ・単純型: null, boolean, int, long, float, double, bytes, string ・複合型: record, enum, array, map, union, fixed (固定長バイト列) 上記に加えて、単純型をベースにした各種の論理型もサポート (decimal, UUID, date, time, timestamp, duration) *durationはv1.9.1時点では仕様のみ 以下の仕様に基づき、プログラム中の変数をバイナリデータへ効率的にエンコード https://avro.apache.org/docs/current/spec.html#binary_encoding
  • 6. © 2019 NTT DATA Corporation 6 「3. ファイル永続化のサポート」 a 27 b "foo" オブジェクト Avroスキーマ {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} 0x3606666f6f Binary-encoded Avro data BinaryEncoder DatumWriter + アプリケーションB a 27 b "foo" hash 0x3606666f6f BinaryDecoder DatumReader + 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem 61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t 65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields": 5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long" 2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"}, 7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string 22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}] 7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }............... a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo....... c0 b8 fc 78 79 71 bd a0 da | ......... DataFileWriter アプリケーションA file header file data block Object container file アプリケーションC a 27 b "foo" dictionary 0x3606666f6f BinaryDecoder DatumReader + DataFileReader ※下線は Avro が提供するクラスを示す ・ファイル永続化時には、スキーマがヘッダに埋め 込まれるため、ファイル単体でデシリアライズ可能 ・また、スキーマはヘッダ中に1回しか現れないため、 1ファイルに格納するレコード数が多くなるほど、他 のデータフォーマットに比べて格納効率が良くなる
  • 7. © 2019 NTT DATA Corporation 7 「4. 多様なプログラミング言語から容易に扱える」 a 27 b "foo" オブジェクト Avroスキーマ {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} ファイルシステム0x3606666f6f Binary-encoded Avro data BinaryEncoder DatumWriter + アプリケーションB a 27 b "foo" hash 0x3606666f6f BinaryDecoder DatumReader + 4f 62 6a 01 04 14 61 76 72 6f 2e 63 6f 64 65 63 | Obj...avro.codec 08 6e 75 6c 6c 16 61 76 72 6f 2e 73 63 68 65 6d | .null.avro.schem 61 dc 01 7b 22 74 79 70 65 22 3a 20 22 72 65 63 | a..{"type": "rec 6f 72 64 22 2c 20 22 6e 61 6d 65 22 3a 20 22 74 | ord", "name": "t 65 73 74 22 2c 20 22 66 69 65 6c 64 73 22 3a 20 | est", "fields": 5b 7b 22 74 79 70 65 22 3a 20 22 6c 6f 6e 67 22 | [{"type": "long" 2c 20 22 6e 61 6d 65 22 3a 20 22 61 22 7d 2c 20 | , "name": "a"}, 7b 22 74 79 70 65 22 3a 20 22 73 74 72 69 6e 67 | {"type": "string 22 2c 20 22 6e 61 6d 65 22 3a 20 22 62 22 7d 5d | ", "name": "b"}] 7d 00 12 90 1a bb d8 2c f9 c0 b8 fc 78 79 71 bd | }............... a0 da 02 0a 36 06 66 6f 6f 12 90 1a bb d8 2c f9 | ....6.foo....... c0 b8 fc 78 79 71 bd a0 da | ......... DataFileWriter アプリケーションA file header file data block Object container file アプリケーションC a 27 b "foo" dictionary 0x3606666f6f BinaryDecoder DatumReader + DataFileReader ※下線は Avro が提供するクラスを示す 静的型付け言語向けに、スキーマから クラス定義を生成できる 動的言語向けに、プログラム中から直接スキーマを読み込み、 マップ/辞書/ハッシュのような汎用的なデータ構造に 対応づけることも可能
  • 8. © 2019 NTT DATA Corporation 8 本 LT で想定する「ストリーミング処理」の形態 本LTでは、以下のような形態の処理を想定して、上流と下流のアプリケーション間 で交換するデータ形式はどのような特性を備えていることが望ましいかを検討する。 なお、Google の Tyler Akidau 氏 (Apache Beam の作者) は、ストリーミング処理を「無限に生成されるデータセットに 対する処理」と定義している [1][2] が、本 LT では、実際にそのようなデータセットを扱う際に課題となることが多い 「データが常時流入してくる」「業務要件として低レイテンシを求められる」といった特性に着目した議論を行う。 [1]: https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101 [2]: http://streamingsystems.net/ 上流アプリケーション メッセージング基盤 下流アプリケーション
  • 9. © 2019 NTT DATA Corporation 9 ストリーミング処理でよく発生する要件・課題 実現したい業務や、メッセージング基盤 の選択にもよるが、ストリーミング処 理では以下のような要件や課題が発生することが多い。 1. 低レイテンシと十分なスループットの両立 2. 不正なメッセージに起因する問題のデバッグ・トラブルシュートの難しさ 3. メッセージの再送や配信遅延、到着順序の逆転 4. 許容されるダウンタイムの短さ
  • 10. © 2019 NTT DATA Corporation 10 1. 低レイテンシと十分なスループットの両立 • 低レイテンシ • そもそも、バッチ処理に比べて扱いにくいストリーミング処理をあえて導入するのは、業務要件上、処理 結果をできる限り即時に利用したいためであることが多い • そのためには、データが溜まるのを待ってから一斉に処理するのではなく、個々のメッセージが到着し次 第、即座に処理を行う必要がある • そういった用途には、Parquet や ORC のような列指向のフォーマットではなく、Avro のような行指向の データフォーマットの方が向いている • 十分なスループット • 一方で、データは上流から常時流れてくるため、その速度に追いつけないとシステムがダウンしてしまう • さらに、一時的なバーストへの耐性や、故障復旧時に追いつくための余力も考えると、流入速度の数倍の 処理性能は確保したい • そのため、システム全体のキャパシティプランニングやアプリケーション設計を行うと同時に、採用する データフォーマットも、高速にシリアライズ・デシリアライズできる必要がある • Avro のシリアライズ・デシリアライズは高速であり、一般的な用途には十分な性能を備えている。ベンチ マーク結果を以下に示す。 フィールド数・少 フィールド数・多 シリアライズ 314万件/秒 157万件/秒 デシリアライズ 647万件/秒 72万件/秒 AWS の m5.large インスタンス1台を使用し、Avro に付属するベンチマーク ツールを用いて、単位時間あたりに処理できるレコード数を以下の2条件で測定。 • フィールド数・少: double と int, それぞれ3フィールドからなるレコード • フィールド数・多: int, string, string[2], int[10], enum の各フィールドか らなるレコードで、各 string の長さは70字未満のランダム
  • 11. © 2019 NTT DATA Corporation 11 2.不正なメッセージに起因する問題のデバッグ・トラブルシュートの難しさ • 流入データ中に不正なメッセージが混入していると、下流での読出し時にアプリケーションが異常終了したり、 気づかないうちに誤った処理結果を出力している場合がある • しかし、以下のような理由から、不正メッセージに起因する問題のトラブルシュートは難航することが多い • メッセージング基盤によっては、メッセージのディスク永続化をサポートしない、もしくはディスクに永続化すると 著しく性能が低下するものがある。その場合、メッセージはメモリ上にのみ存在するが、メモリ上のメッセージは時 間経過や容量の逼迫によって削除されるため、問題が発覚したタイミングでは、原因となったメッセージが既に存在 しない場合がある • メッセージを取得する方法は、振り分け先のパーティション/シャードや、その中でのメッセージのオフセット/位 置を指定してアクセスするのが一般的だが、これだけでは原因となったメッセージを特定するのは難しく、だいたい の位置を起点に、しらみつぶしに調査せざるを得ないことが多い • そのため、アプリケーション設計時に、不正データ混入時の挙動を定義しておくのに加えて、データフォーマッ ト自身も、スキーマによるバリデーションの仕組みを備えていることが望ましい • Avro では、シリアライズ・デシリアライズにスキーマを使用することから、 • 上流での書込み時に、データがスキーマに従ってシリアライズされるため、少なくとも各フィールドの 型については、誤ったデータが下流に送られることはありえない。 • 下流での読込み時も、データはスキーマに従ってデシリアライズされ、スキーマに適合しないデータは エラーとなることから、不正データの検出が容易である。
  • 12. © 2019 NTT DATA Corporation 12 3. メッセージの再送や配信遅延、到着順序の逆転 • 再送や配信遅延については、アプリケーション層での対処が必要 • 再送に備えて、アプリケーションを冪等な作りにする • 配信遅延に対しては、何らかの watermark を設けて、それ以降に受信したメッセージは破棄する仕様とする、等 • 到着順序の逆転については、新旧スキーマの混在が懸念される。例えば以下のようなケースでは、新しいス キーマでシリアライズされたメッセージが、古いスキーマのものよりも先に到着しうる。 • メッセージを非同期に送信しており、何らかの理由で正常に送信できなかったものが再送に回る • 全台停止ではなく、ローリングアップグレードで上流のスキーマを段階的に更新している • 利用しているメッセージング基盤の仕様として、パーティション内やノード内での送達順序は保証されるが、それ らを跨いでの順序は保証されない • Avro では、シリアライズに用いたスキーマとデシリアライズに用いるスキーマが一致しない場合にどう解決さ れるかが明確に定義されている [3] ため、下流のアプリケーションを新しいスキーマに更新した後に、古いス キーマでシリアライズされたメッセージを受け取っても、スキーマ間で互換性があれば、安全に対処できる • 書込み側のスキーマに存在するフィールドが読込み側に存在しない→そのフィールドは無視される • 読込み側に存在するフィールドが書込み側に存在しない場合、読込み側でデフォルト値が • 定義されている→デフォルト値が使われる • 定義されていない場合→エラーになる • 同名のフィールドの型が変更された場合、互換性があればキャストされる、等 [3] : https://avro.apache.org/docs/current/spec.html#Schema+Resolution
  • 13. © 2019 NTT DATA Corporation 13 4. 許容されるダウンタイムが短い • ストリーミング処理では一般に即時性が重視されるため、長時間の停止は SLA 違反に繋がる 可能性が高い • また、データが常時流入してくるため、未処理のデータが大量に溜まってしまうと処理が追い つけなくなり、過去のデータを未処理のまま破棄せざるを得なくなる • Avro の場合、コミュニティやベンダーが提供している schema registry を使うことで、無停 止でのスキーマの更新や、上流・下流でのスキーマの連携が容易になる • Schema Repo: https://github.com/schema-repo/schema-repo (AVRO-1124 から独立) • Confluent Schema Registry: https://www.confluent.io/confluent-schema-registry • Hortonworks Schema Registry: https://github.com/hortonworks/registry • Avro 自身も、以下のような仕様や機能を用意しており、これらを利用して、自前で簡単な schema registry を実装することも可能 • Single-object encoding: http://avro.apache.org/docs/current/spec.html#single_object_encoding • Fingerprint: https://avro.apache.org/docs/current/spec.html#schema_fingerprints • Parsing Canonical form: https://avro.apache.org/docs/current/spec.html#Parsing+Canonical+Form+for+Schemas
  • 14. © 2019 NTT DATA Corporation 14 27 Avro が提供する機能を利用した schema registry の実現例 e8 c6 … 3606666f6f binary- encoded datadata Avroスキーマ C3 01 a b "foo" BinaryMessage Encoder Single-object encoding e8c6c20c615f2c47 Avroスキーマ Avroスキーマ (parsing canonical form) fingerprint {"type": "record", "name": "test", "fields" : [ {"name": "a", "type": "long"}, {"name": "b", "type": "string"}]} {"name":"test","type":"record","fiel ds":[{"name":"a","type":"long"},{"na me":"b","type":"string"}]} 不要な要素や空白・改行の除去 所定の順序による要素のソート name要素の値を完全修飾名に、等 ハッシュ値 (CRC64, MD5, SHA-256など) を計算 e8 c6 … {"name":"test","type":"record","fields":... xx xx … {"name":“xxxx","type":"record","fields":... 上流アプリケーション メッセー ジング基 盤 e8 c6 … 3606... Key-Value Store BinaryMessage Decoder 27 data a b "foo" 下流 アプリケーション fingerprint (説明は下記 を参照) ①データ送信時に、シリアライズに用いた スキーマのfingerprintを計算し、スキーマ の本体とともにKVSに登録 ②データ受信時に、受け取ったfinger printでKVSからスキーマ本体を引き、 それを用いてデシリアライズ
  • 15. © 2019 NTT DATA Corporation 15 Schema Repo を用いたスキーマの共有とバージョン管理 27 3606666f6f data Avroスキーマ a b "foo" q1 {"name":"test","type":"record","fields":... q1 {"name":"test","type":"record","fields":... 上流アプリケーション メッセージング基 盤 Schema Repo (https://github.com/schema-repo/schema-repo) 27 data a b "foo" 下流 アプリケーション ①データ送信時に、シリアライズに用いたスキーマが未登録なら、 アプリケーション間であらかじめ共有できている文字列を subject としてschema repoに登録し、ID(=バージョン情報)を 得る。ここでは投稿先のキュー名をsubjectとして使用。 ②データ受信時に、subjectと受け取った IDをキーに、Schema Repoからスキーマ 本体を引き、それを用いてデシリアライズ Subject ID q2 Schema {"name":“xxxx","type":"record","fields":... 0 1 0 BinaryEncoder DatumWriter + 1 binary-encoded data ID キュー q1 キュー q2 3606666f6f1 BinaryDecoder DatumReader + 同じsubjectに対して異なるバージョンの スキーマを持つことが可能
  • 16. © 2019 NTT DATA Corporation 16 (以降は、ストリーミング処理に固有の話題ではありませんが...)
  • 17. © 2019 NTT DATA Corporation 17 5. ユースケースによっては、任意のバイト列を格納する必要がある • ユースケースによっては、画像や音声、IoT デバイスや車載ネット ワークからのセンサデータといったバイナリデータを扱う必要がある • CSV や JSON のようなテキストベースのデータフォーマットだと、 バイナリデータを表現するには16進表記やBase64 など、冗長な表現 を用いる必要があり効率が悪い • Avro はバイナリ形式のデータフォーマットなので、任意のバイト列 をコンパクトに格納できる
  • 18. © 2019 NTT DATA Corporation 18 6. 多様な開発言語への対応 • 連携先の組織が異なると、その組織が習熟しているプログラミング言語を使って開発したい場合がある • しかし、たとえば仕様が RFC で定められている CSV であっても、フィールド中にセパレータや改行が 含まれる場合の扱いなどが、パーサの実装によって異なる場合がある • Avro は、コミュニティが公開している仕様 https://avro.apache.org/docs/current/spec.html に 従った実装が以下の言語で公式に提供されており、データの互換性に関する問題が少ない。 • Java • C • C++ • C# • JavaScript • Perl • PHP • ただし、現行バージョンである 1.9.1 までは 5.6 までの対応。1.10.0 からは 7.x 系に対応予定 (AVRO-2527). ※以降のスライドで、括弧内の赤字はNTTデータが貢献した JIRA issue の ID を示す。 • Python 2, 3 • fastavro という、高速化のために C で実装されたサードパーティ製のバインディングも存在 • Ruby • それ以外にも、Erlang/Elixir, Go, Haskell, Julia, R, Rust 等の言語で、有志が非公式なバインディング を開発している
  • 19. © 2019 NTT DATA Corporation 19 参考: 圧縮形式の非互換性について • Avro では、データの転送や格納を効率化するため、ファイル永続化時の圧縮をサポートしている • 先述の Avro Specification によれば、無圧縮と deflate はどの言語でもサポート必須、snappy はオプ ションとされている • これに従い、ほとんどの言語では deflate (と無圧縮) をサポートしているが、PHP だけが最近まで deflate をサポートしていなかった。→1.10.0 からサポート予定 (AVRO-2446). • 一方で、Java では仕様に記載のない bzip2, xz, zstandard がサポートされている (1.9.1 時点). • zstandard は利用されるケースが多いと考えたため、以下の言語でもサポートを追加した。 1.10 から利用可能になる予定。 • Perl (AVRO-2472) • Python2 (AVRO-2426) • Python3 (AVRO-2460) • Ruby (AVRO-2464) • ある言語でサポートされているからといって、適当な codec で圧縮すると、その codec をサポート していない言語からは読めなくなってしまうので注意 • データの互換性を確認するためのテストも存在するのだが、一部の言語や圧縮形式しか実施 していなかったため、互換性テストを充実させる (AVRO-2452, AVRO-2453, AVRO-2456, AVRO-2459, AVRO-2469, AVRO-2475) とともに、一部の言語に存在した互換性の問題を修正 した (AVRO-2468).
  • 20. © 2019 NTT DATA Corporation 20 まとめ • Apache Avro は、シリアライズ・デシリアライズにスキーマを用いるのが特徴の、豊富なデータ 型を備えた、コンパクトで高速なバイナリ形式の行指向データフォーマットです • 以下のような理由から、ストリーミング処理に向いたデータフォーマットであると考えます • 低レイテンシ処理向きの行指向フォーマット、高速なシリアライズ・デシリアライズ • スキーマを用いたバリデーションによるメッセージ品質の担保 • スキーマに互換性があれば、古いスキーマでシリアライズされたメッセージを受け取って もデシリアライズ可能 • Schema Registry の導入によるスキーマの共有や無停止での更新、バージョン管理 • それ以外にも、以下のような特徴があります • バイナリ形式のデータフォーマットのため、任意のバイト列をコンパクトに格納できます • バインディングが多様な言語で開発されています(ただし、ファイル永続化時の圧縮形式には注意) • NTTデータも、Avro のデータ互換性を改善するための貢献などを、積極的に行っています
  • 21. © 2019 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。