= Apache Arrow 2019\n#ArrowTokyo
: author
須藤功平
: institution
株式会社クリアコード
: content-source
Apache Arrow東京ミートアップ2019
: date
2019-12-11
: start-time
2019-12-11T19:05:00+09:00
: end-time
2019-12-11T19:20:00+09:00
: theme
.
= Apache Arrowと私
* 2016-12-21に最初のコミット
* 2017-05-10にコミッター
* 2017-09-15にPMCメンバー
* 2018-12-06現在コミット数3位(224人中)
* 2019-12-09現在コミット数2位(348人中)
= 今日の目的
Apache Arrow\n
ユーザーを\n
増やす
= 今日のチャレンジ
(('tag:center'))
(('tag:margin-bottom * 5'))
こんな人たちもフォローしてユーザーに!
* 使ってみたい!
* でも、自分たちだけじゃ不安…
= 対策:みんなで力を合わせる!
(('tag:center'))
(('tag:margin-bottom'))
こんな布陣ならいけるかも!なら相談して!
* クリアコード:技術提供(('note:(すごく詳しいよ!)'))
* A社:データ提供(('note:(うちのデータでApache Arrowは効くかな?)'))
* B社:インフラ提供(('note:(どんな構成が適切かな?)'))
* C社:お金・人的リソース提供(('note:(知見を貯めたい)'))
* ...
= Apache Arrow
各種言語で使える\n
インメモリー\n
データ処理\n
プラットフォーム
= 実現すること
データ処理の効率化\n
(大量データが対象)
= 効率化のポイント
* 速度
* 速いほど効率的
* 実装コスト
* 低いほど効率的
= 速度向上方法
* 遅い部分を速く
* 高速化できる部分を最適化
= 遅い部分
データ交換
= データ交換
* データ処理ツール間で必要
* データ処理システム
* 複数ツールを組み合わせて実現
* データ処理システムではデータ交換が必須
= データ処理システム例
# img
# src = images/data-processing-system.svg
# relative_width = 100
== スライドプロパティー
: enable-title-on-image
false
= データ交換処理
(1) シリアライズ\n
(('note:データをバイト列へ変換'))
(2) 転送\n
(('note:バイト列を別ツールに渡す'))
(3) デシリアライズ\n
(('note:バイト列からデータを復元'))
= データ交換処理:必要なリソース
(1) シリアライズ:CPU
(2) 転送:I/O(('note:(ネットワーク・ストレージ・メモリー)'))
(3) デシリアライズ:CPU
= データ交換の高速化
* データ量が増加すると\n
シリアライズ・デシリアライズ速度が劣化
* 速度劣化を抑えられれば高速化可能
= Apache Arrowのアプローチ
(('tag:center'))
(('tag:margin-bottom'))
なにもしなければ最速!
* データフォーマットを定義
* ほぼパースいらずなので速い!
* シリアライズ・デシリアライズが高速化!
* このフォーマットの普及
* 各種言語で読み書き処理を実装
* みんなが使えばフォーマット変換いらずで速い!
= Apache Sparkでの高速化事例
* Spark⇔PySpark間でデータ交換
* (())
* Spark⇔R間でデータ交換
* (())
* Spark 3.0からはSparkRでも使える
(('tag:center'))
Spark関連は山室さんが紹介!
= Apache Arrowのさらなるアプローチ
(1) シリアライズ\n
(('note:データをバイト列へ変換'))
(2) 転送←ここも高速化\n
(('note:バイト列を別ツールに渡す'))
(3) デシリアライズ\n
(('note:バイト列からデータを復元'))
= 同一ホスト時のデータ転送の高速化
* メモリーマップ機能
* ファイルの内容をメモリー上のデータのように\n
アクセスできる機能
* (({read}))せずにデータを使える(データコピー不要)
* パース不要+メモリーマップ
* デシリアライズ時にメモリー確保不要
* 「転送」コスト削減
= 複数ホスト時のデータ転送の高速化
* RPCフレームワークを提供
* Apache Arrow Flight
* gRPCベース
* 詳細:(())
= 効率的なデータ交換処理のまとめ
* 高速なデータフォーマット
* 効率的なデータ交換処理
* ((*同一ホスト内*))での高速なデータ交換
* ((*異なるホスト間*))での高速なデータフレーム交換
= 速度向上方法
* 遅い部分を速く
* ((*データ交換*))を速く
* 高速化できる部分を最適化
= 高速化できる部分
大量データの計算
= 大量データの計算の高速化
* 各データの計算を高速化
* まとまったデータの計算を高速化
= 各データの計算の高速化
* データを局所化
* CPUのキャッシュメモリーを活用できる
* 局所化に必要な知識
* データの使われ方
* 局所化:一緒に使うデータを近くに置く
= 想定ユースケース
* OLAP(('note:(OnLine Analytical Processing)'))
* データから探索的に知見を探し出すような処理
* 列単位の処理が多い
* 集計処理・グループ化・ソート…
= OLAP向きのデータの持ち方
# img
# src = images/columnar.svg
# relative_height = 100
== スライドプロパティー
: enable-title-on-image
false
= まとまったデータの計算を高速化
* SIMDを活用\n
(('note:Single Instruction Multiple Data'))
* スレッドを活用
* ストリームで処理
= SIMDを活用
* CPU:データをまとめてアライン\n
(('note:アライン:データの境界を64の倍数とかに揃える'))
* GPUの活用
* 条件分岐をなくす
* null/NA用の値は用意せずビットマップで表現\n
(('note:((<"Is it time to stop using sentinel values for null / NA values?"|URL:http://wesmckinney.com/blog/bitmaps-vs-sentinel-values/>))'))
= 条件分岐とnull
# img
# src = images/simd-null.svg
# relative_height = 100
== スライドプロパティー
: enable-title-on-image
false
= スレッド活用時のポイント
* 競合リソースを作らない
* リソースロックのオーバーヘッドで遅くなりがち
* アプローチ
* リソースを参照するだけ
* 各スレッドにコピー
= Apache Arrowとスレッド
* データはリードオンリー
* スレッド間でオーバーヘッドなしで共有可能
* データコピーは極力避けたい
* データ交換時もスレッド活用時も
= ストリームで処理
* CPUを遊ばせない
* データ読み込み中にすでに読んだデータを処理
* C++実装:詳細は村田さんが紹介!
* (()):データ読み込み
* (()):データ処理
* (()):高レベルAPI
* Gandiva:高速な式コンパイラー
= 高速化のまとめ
* 速度
* 遅い処理(((*データ交換処理*)))を高速化
* 速くできる処理(((*大量データの計算*)))を最適化
* 実装コスト
* 低いほど効率的
= 実装コストを下げる
* 共通で使いそうな機能をライブラリー化
* メリットを受ける人たちみんなで協力して開発
* 最適化もがんばる
* Apache Arrowの実装コストは下がらない
* Apache Arrowを使うツールの実装コストが下がる\n
(('note:実装コストが下がる:ツール開発者のメリット'))
= 共通で使いそうな機能
* 高速なデータフォーマット(説明済み)
* 効率的なデータ交換処理(説明済み)
* 高速なデータ処理ロジック(説明済み)
* フォーマット変換機能
= 実装コストのまとめ
* 速度
* 遅い処理(データ交換処理)を高速化
* 速くできる処理(大量データの計算)を最適化
* 実装コスト
* 共通で使いそうな機能を((*ライブラリー化*))
* ((*みんなで協力*))して開発
= フォーマット変換機能
* Apache Arrowフォーマット
* インメモリー用のフォーマット
* データ交換・処理向きで永続化向きではない
* 永続化されたデータを使う場合
* 永続化に適したフォーマットで保存
* 読み込み時にApache Arrowに変換して\n
インメモリーでの処理にApache Arrowを使う
= 対応フォーマット:CSV
* よく使われているフォーマット
* 亜種が多くてパースが大変
* C++実装はすごく速い!
* ((*CSV読み込みの高速化でも使える!*))
= 対応フォーマット:Apache Parquet
* 永続化用フォーマット
* 列単位でデータ保存:Apache Arrowと相性がよい
* 小さい
* 列単位の圧縮をサポート
* 速い
* 必要な部分のみ読み込める(('note:(I/Oが減る)'))
= 対応フォーマット:Apache ORC
* 永続化用フォーマット
* 列単位でデータ保存:Apache Arrowと相性がよい
* Apache Parquetに似ている
* Apache Hive用に開発
* 今はHadoopやSparkでも使える
= 対応フォーマット:Feather
* 永続化用フォーマット
* 列単位でデータ保存:Apache Arrowと相性がよい
* データフレームを保存
* PythonとR間のデータ交換用
* ((*今は非推奨!*))
* Apache Arrowを使ってね
= 豆知識:Feather 2
* 名前を再利用するかも
* ((<[ARROW-5512] Feather V2|URL:https://issues.apache.org/jira/browse/ARROW-5510>))
* Feather 2: Apche Arrow IPC File Format
* Apache Arrow IPC Format:FileまたはStreaming
* Fileの方をFeather 2と呼んじゃう?
= 対応フォーマット:JSON
* よく使われているフォーマット
* これまではテストのために内部使用
* 正式機能になった
= フォーマット変換機能まとめ
* 高速なデータフォーマット
* 効率的なデータ交換処理
* 高速なデータ処理ロジック
* フォーマット変換機能
* ((*永続化データ*))を処理するために必要
= 対応言語
* C, C#, C++, Go, Java, JavaScript, Lua
* MATLAB, Python, R, Ruby, Rust
非公式実装:
* Julia ((()))
= 実装方法
* ネイティブ実装
* C#, C++, Go, Java, JavaScript, Julia, Rust
* その言語になじむ
* C++バインディング
* C, Lua, MATLAB, Python, R, Ruby\n
R関連は湯谷さんが紹介!
* ホスト言語が遅めでも速い実装になる
= 各言語のデータ交換対応状況
* 基本的な型はすべての言語で対応済み
* すでに((*データ交換用途に使える*))
* 複雑な型は未対応の言語あり\n
(('note:List, Structなど'))
* 例:C#のList実装は((<網屋|URL:https://www.amiya.co.jp/>))の((<橋田さん|URL:https://github.com/HashidaTKS>))が改良中
= 各言語のデータ処理対応状況
* データの高速な計算は一部言語で対応
* C++ベース、Java、Rust(DataFusion)、Go
* フォーマット変換も各言語の対応は様々
= ユースケース
* PostgreSQLの高速化
* 海外さんがPG-Stromの事例を紹介!
* TensorFlow・BitQuery Storage APIが\n
Apache Arrowをサポート
* 石崎さんと漆山さんが紹介!
* FluentdでログデータをApache Arrow化
= 今日の目的
Apache Arrow\n
ユーザーを\n
増やす
= 今日のチャレンジ
(('tag:center'))
(('tag:margin-bottom * 5'))
こんな人たちもフォローしてユーザーに!
* 使ってみたい!
* でも、自分たちだけじゃ不安…
= 対策:みんなで力を合わせる!
(('tag:center'))
(('tag:margin-bottom'))
こんな布陣ならいけるかも!なら相談して!
* クリアコード:技術提供(('note:(すごく詳しいよ!)'))
* A社:データ提供(('note:(うちのデータでApache Arrowは効くかな?)'))
* B社:インフラ提供(('note:(どんな構成が適切かな?)'))
* C社:お金・人的リソース提供(('note:(知見を貯めたい)'))
* ...