Apache Arrow 2019n#ArrowTokyo

: author

須藤功平

: institution

株式会社クリアコード

: content-source

Apache Arrow東京ミートアップ2019

: date

2019-12-11

: start-time

2019-12-11T19:10:00+09:00

: end-time

2019-12-11T19:25: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 1.0.0がでるぞ!

* たぶん2020年1月か2月あたり
* 使い始めるなら今!
  * 普通のユーザー:リリースされたら試そう
  * 先進的なみなさん:リリースされたら本格使用!

今日の目的

Apache Arrown ユーザーをn 増やす

今日のチャレンジ

(('tag:center')) (('tag:margin-bottom * 5')) こんな人たちもフォローしてユーザーに!

* 使ってみたい!
* でも、自分たちだけじゃ不安…

対策:みんなで力を合わせる!

(('tag:center')) こんな布陣ならいけるかも!なら相談して!n (('note:((<URL:www.clear-code.com/contact/>))'))

* クリアコード:技術提供(('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間でデータ交換
  * ((<Apache Arrowを使うことで数十倍レベルの高速化|URL:https://arrow.apache.org/blog/2017/07/26/spark-arrow/>))
* Spark⇔R間でデータ交換
  * ((<sparklyrでは10倍以上の高速化|URL:https://arrow.apache.org/blog/2019/01/25/r-spark-improvements/>))
  * 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ベース
* 詳細:((<Apache Arrow Flightの紹介|URL:https://arrow.apache.org/blog/2019/10/13/introducing-arrow-flight-japanese/>))

効率的なデータ交換処理のまとめ

* 高速なデータフォーマット
* 効率的なデータ交換処理
  * ((*同一ホスト内*))での高速なデータ交換
  * ((*異なるホスト間*))での高速なデータフレーム交換

速度向上方法

* 遅い部分を速く
  * ((*データ交換*))を速く
* 高速化できる部分を最適化

高速化できる部分

大量データの計算

大量データの計算の高速化

* 各データの計算を高速化
* まとまったデータの計算を高速化

各データの計算の高速化

* データを局所化
  * 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++実装:詳細は村田さんが紹介!
  * ((<Apache Arrow C++ Datasets|URL:https://docs.google.com/document/d/1bVhzifD38qDypnSjtf8exvpP3sSB5x_Kw9m-n66FB2c/edit?usp=sharing>)):データ読み込み
  * ((<Apache Arrow C++ Query Engine|URL:https://docs.google.com/document/d/10RoUZmiMQRi_J1FcPeVAUAMJ6d_ZuiEbaM2Y33sNPu4/edit?usp=sharing>)):データ処理
  * ((<Apache Arrow C++ Data Frame|URL:https://docs.google.com/document/d/1XHe_j87n2VHGzEbnLe786GHbbcbrzbjgG8D0IXWAeHg/edit?usp=sharing>)):高レベル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 (((<Arrow.jl|URL:https://github.com/ExpandingMan/Arrow.jl>)))

実装方法

* ネイティブ実装
  * 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
* フォーマット変換も各言語の対応は様々

ユースケース(1)

* PostgreSQLの高速化
  * 海外さんがPG-Stromの事例を紹介!
* TensorFlow・BigQuery Storage APIが\n
  Apache Arrowをサポート
  * 石崎さんと漆山さんが紹介!

ユースケース(2)

* FluentdでログデータをApache Arrow化
  * プラグインあり
* Groongaに高速データロード
  * Groonga:全文検索エンジン
  * Fluentdで集めたログデータを\n
    Apache Arrowで流し込んで高速検索

今日の目的

Apache Arrown ユーザーをn 増やす

今日のチャレンジ

(('tag:center')) (('tag:margin-bottom * 5')) こんな人たちもフォローしてユーザーに!

* 使ってみたい!
* でも、自分たちだけじゃ不安…

対策:みんなで力を合わせる!

(('tag:center')) こんな布陣ならいけるかも!なら相談して!n (('note:((<URL:www.clear-code.com/contact/>))'))

* クリアコード:技術提供(('note:(すごく詳しいよ!)'))
* A社:データ提供(('note:(うちのデータでApache Arrowは効くかな?)'))
* B社:インフラ提供(('note:(どんな構成が適切かな?)'))
* C社:お金・人的リソース提供(('note:(知見を貯めたい)'))
* ...