Rabbit Slide Show

Apache Arrowフォーマットはなぜ速いのか

2020-12-08

Description

2020年代、ビッグデータをどう扱えばよいか。今は各プロダクト毎に効率的な扱い方を実装していますが、2020年代はそんな時代ではありません!ビッグデータの扱いでも、共通で必要なものはプロダクトを超えて協力して開発して共有する、そんな時代です!ビッグデータのための共通基盤、それがオープンソースのApache Arrowです。AmazonもGoogleもNVIDIAも開発に参加しています。 このセッションではApache Arrow開発チームの主要メンバーがApache Arrowフォーマットがなぜ速いのかを説明します。

Text

Page: 1

Apache Arrowフォーマットは
なぜ速いのか
須藤功平
株式会社クリアコード
db tech showcase ONLINE 2020
2020-12-08
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 2

Apache Arrowと私
✓ 2016-12-21に最初のコミット
✓ 2017-05-10にコミッター
✓ 2017-09-15にPMCメンバー
✓ 2020-11-25現在コミット数2位(508人中)
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 3

Apache Arrow
✓ データ分析ツールの基盤を提供
✓ ツールで必要になるやつ全部入り
✓ 各種プログラミング言語をサポート
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 4

全部ってなに!?
データフォーマットとかそのデータ
を高速処理する機能とか他の各種
データフォーマットと変換する機能
とかローカル・リモートにあるデー
タを透過的に読み書きする機能とか
高速RPCとかなんだけど、全部を説
明すると「すごそうだけどよくわか
らないね!」と言われる!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 5

今日のトピック
Apache Arrow
フォーマット
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 6

Apache Arrowフォーマット
✓ データフォーマット
✓ 通信用とインメモリー用の両方
✓ 表形式のデータ用
✓ =データフレーム形式のデータ用
✓ 速い!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 7

速い!
✓ データ交換が速い!
✓ データ処理が速い!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 8

データ交換が速い!
Apache Arrowフォーマットにすると高速化!
CSV
データソース
データ処理
など
高速化
データソース
データ処理
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 9

利用事例:Apache Spark
Spark
pickle
PySpark
高速化
Spark
PySpark
0s
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
20s
実行時間
(短いほど高速)
Data at https://arrow.apache.org/blog/2017/07/26/spark-arrow/
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 10

利用事例:Amazon Athena
CSV
S3
Athena
組込クエリーより
高速
Federated
Query
S3
Athena
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
0s
4s
8s
1億 行 の 処 理 に か か っ た 時 間
(短いほど高速)
Data at https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk#performance
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 11

利用事例:RAPIDS
RAPIDS
End-to-End GPU Accelerated Data Science
Data Preparation
Model Training
Visualization
Dask
cuDF cuIO
Analytics
cuML
Machine Learning
cuGraph
Graph Analytics
PyTorch,
TensorFlow, MxNet
Deep Learning
cuxfilter, pyViz,
plotly
Visualization
GPU Memory
https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=3
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 12

利用事例:RAPIDS
Data Processing Evolution
Faster Data Access, Less Data Movement
Hadoop Processing, Reading from Disk
HDFS
Read
HDFS
Write
Query
HDFS
Read
ETL
HDFS
Write
Spark In-Memory Processing
HDFS
Read
ETL
Query
Traditional GPU Processing
HDFS
Read
GPU
CPU
Query
Read
Write
RAPIDS
Arrow
Read
Query
ETL
ML
Train
GPU
Read
ETL
CPU
Write
GPU
Read
ML
Train
ML Train
HDFS
Read
ML Train
25-100x Improvement
Less Code
Language Flexible
Primarily In-Memory
5-10x Improvement
More Code
Language Rigid
Substantially on GPU
50-100x Improvement
Same Code
Language Flexible
Primarily on GPU
https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=8
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 13

どうして速いの?
✓ シリアライズコストが低い
✓ すぐに送れるようになる
✓ デシリアライズコストが低い
✓ 受け取ったデータをすぐに使えるようになる
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 14

シリアライズ処理
1. メタデータを用意
2. メタデータ+元データそのものを送信
✓ 元データを加工しないから速い!
✓ なにもしないのが最速!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 15

元データを加工する例:JSON
0x01 0x02(8bit数値の配列)
↓
"[1,2]"(JSON)
0x01→0x49(数値→ASCIIの文字:'1')
0x02→0x50(数値→ASCIIの文字:'2')
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 16

元データそのものを使うと…
✓ 変換処理にCPUを使わなくてよい
✓ 速い
✓ 変換後のデータ用のメモリー確保ゼロ
✓ 大きなメモリー確保はコストが高い
✓ 一定の作業領域を使い回すとかしなくてよい
✓ 速い
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 17

デシリアライズ処理
1. メタデータをパース
2. メタデータを基に元データを取り出す
✓ 元データをそのまま使えるから速い!
✓ なにもしないのが最速!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 18

元データを元に戻す例:JSON
"[1,2]"(JSON)
↓
0x01 0x02(8bit数値の配列)
0x49→0x01(ASCIIの文字:'1'→数値)
0x50→0x02(ASCIIの文字:'2'→数値)
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 19

元データを取り出せると…
✓ 変換処理にCPUを使わなくてよい
✓ 速い
✓ 変換後のデータ用のメモリー確保ゼロ
✓ すでにあるデータをそのまま使うのでゼロコピー
✓ 速い
✓ メモリーマップで直接データを使える
✓ ディスク上のメモリー以上のデータを扱える
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 20

{,デ}シリアライズコスト
✓ Apache Arrowフォーマット
✓ ほぼメタデータのパースコストだけ
✓ それ以外の多くのフォーマット
✓ データ変換処理(CPU)
✓ 作業用メモリー確保処理(メモリー)
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 21

データ交換が速い!
Apache Arrowフォーマットにすると高速化!
CSV
データソース
データ処理
など
高速化
データソース
データ処理
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 22

利用事例:Apache Spark
Spark
pickle
PySpark
高速化
Spark
PySpark
0s
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
20s
実行時間
(短いほど高速)
Data at https://arrow.apache.org/blog/2017/07/26/spark-arrow/
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 23

利用事例:Amazon Athena
CSV
S3
Athena
組込クエリーより
高速
Federated
Query
S3
Athena
Apache Arrow logo is licensed under Apache License 2.0 © 2016-2020 The Apache Software Foundation
0s
4s
8s
1億 行 の 処 理 に か か っ た 時 間
(短いほど高速)
Data at https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-federation-sdk#performance
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 24

利用事例:RAPIDS
Data Processing Evolution
Faster Data Access, Less Data Movement
Hadoop Processing, Reading from Disk
HDFS
Read
HDFS
Write
Query
HDFS
Read
ETL
HDFS
Write
Spark In-Memory Processing
HDFS
Read
ETL
Query
Traditional GPU Processing
HDFS
Read
GPU
CPU
Query
Read
Write
RAPIDS
Arrow
Read
Query
ETL
ML
Train
GPU
Read
ETL
CPU
Write
GPU
Read
ML
Train
ML Train
HDFS
Read
ML Train
25-100x Improvement
Less Code
Language Flexible
Primarily In-Memory
5-10x Improvement
More Code
Language Rigid
Substantially on GPU
50-100x Improvement
Same Code
Language Flexible
Primarily on GPU
https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=8
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 25

データサイズは?
✓ CPU・メモリーにやさしくて速いんだね!
✓ じゃあ、データサイズはどうなの?
✓ 大きいとネットワーク・IOがボトルネック
✓ 本来のデータ処理を最大限リソースを使いたい
✓ データ交換をボトルネックにしたくない
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 26

データサイズ
✓ 別に小さくない
✓ 元データそのままなのでデータ量に応じて増加
✓ Zstandard・LZ4での圧縮をサポート
✓ ゼロコピーではなくなるがサイズは数分の1
✓ 圧縮・展開が必要→元データそのものを使えない
✓ CPU・メモリー負荷は上がるが
ネットワーク・IO負荷は下がる
✓ ネットワーク・IOがボトルネックになるなら効く
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 27

圧縮時のデータサイズと読み込み速度
https://ursalabs.org/blog/2020-feather-v2/
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 28

データ交換が速い!のまとめ
✓ {,デ}シリアライズが速い
✓ 元データをそのまま使うので処理が少ない
✓ CPU・メモリーにやさしい
✓ 圧縮もサポート
✓ ネットワーク・IOがボトルネックならこれ
✓ CPU・メモリー負荷は上がるが
データ交換のボトルネックを解消できるかも
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 29

交換したデータの扱い
✓ データ分析はデータ交換だけじゃない
✓ データ交換だけ速くしても基盤とは言えない
✓ データ処理も速くしないと!
✓ データ処理を速くするにはデータ構造が大事
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 30

高速処理のためのデータ構造
✓ 基本方針:
✓ 関連するデータを近くに置く
✓ 効果:
✓ CPUキャッシュミスを減らす
✓ SIMDを活用できる
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 31

データ分析時の関連データ
✓ 分析時はカラムごとの処理が多い
✓ 集計・ソート・絞り込み…
✓ 同じカラムのデータを近くに置く
✓ カラムナーフォーマット
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 32

カラムナーフォーマット
列
a
b
c
Apache
Arrow
RDBMS
a
1 値 値 値
2 値 値 値
列
3 値 値 値
b
1 値 値 値
2 値 値 値
3 値 値 値
列ごと 値の管理単位 行ごと
列 高速なアクセス単位 行
Apache Arrowフォーマットはなぜ速いのか
c
Powered by Rabbit 3.0.1

Page: 33

各カラムでのデータの配置
✓ 関連するデータを近くに置く
✓ 定数時間でアクセスできるように置く
✓ SIMDできるように置く
✓ アラインする
アライン:データの境界を64の倍数とかに揃える
✓ 条件分岐をなくす
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 34

真偽値・数値のデータの配置
固定長データなので連続して配置
32ビット整数:[1, 2, 3]
0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 ...
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 35

文字列・バイト列:データの配置
実データバイト列+長さ配列に配置
UTF-8文字列:["Hello", "", "!"]
実データバイト列:"Hello!"
長さ配列:[0, 5, 5, 6]
i番目の長さ:長さ配列[i+1] - 長さ配列[i]
i番目のデータ:
実データバイト列[長さ配列[i]..長さ配列[i+1]]
注:長さ→データ→長さ→データ→…で置くと
定数時間でi番目にアクセスできない
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 36

nullと条件分岐
✓ null対応のアプローチ:
✓ null値:Julia: missing, R: NA
✓ 別途ビットマップを用意:Apache Arrow
✓ ビットマップを使うと条件分岐をなくせる
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 37

nullと条件分岐とSIMD
[1, null, 3] + [null, 2, 5]
null
data
1 0 1
1 X 3
ビット単位の&
null
data
0 0 1
X X 8
0 1 1
X 2 5
nullのところも
気にせずSIMDで+
[null, null, 8]
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 38

nullと条件分岐とSIMD
https://wesmckinney.com/blog/bitmaps-vs-sentinel-values/
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 39

高速なデータ処理のまとめ
✓ 高速なデータ処理にはデータ構造が重要
✓ データ分析にはカラムナーフォマットが適切
✓ 定数時間でアクセス可能なデータの配置
✓ SIMDにやさしいデータの持ち方
✓ アライン・null用のビットマップ
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 40

まとめ
✓ Apache Arrow
✓ なんかデータ分析に便利そうなすごいやつ!
✓ 「よくわからん」と言われるからといって
全体像を説明してもらえなかった!
✓ 使い方も説明してもらえなかった!
✓ Apache Arrowフォーマット
✓ これだけ説明してもらえた!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 41

まとめ:Apache Arrowフォーマット
✓ Apache Arrowフォーマット
✓ 通信用・インメモリー用のデータフォーマット
✓ 表形式のデータ用
✓ Apache Arrowフォーマットは速い
✓ データ交換が速い
✓ データ処理が速い
✓ データ交換してすぐに高速処理できるフォーマット
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 42

まとめ:なぜデータ交換が速いのか
✓ 元データをそのままやりとりできるから
✓ {,デ}シリアライズコストが低い
✓ CPU・メモリーにやさしい
✓ ネットワーク・IOの負荷を下げたい
✓ Zstandard・LZ4による圧縮
✓ CPU・メモリー負荷は上がるが
ネットワーク・IO負荷は下がる
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 43

まとめ:なぜデータ処理が速いのか
✓ 最適化されたデータ構造
✓ カラムナーフォーマット
✓ SIMDを使えるデータの持ち方
✓ 最適化された実装
✓ 今回は紹介していない!!!
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 44

次回予告!
✓ 案1:Apache Arrowデータの高速処理
✓ 案2:Apache Arrowデータの高速RPC
✓ 案3:○○言語でApache Arrowを使う方法
✓ ...
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Page: 45

次のステップ
✓ もっと詳しく知りたくなったから
イベント・社内・…で紹介して!
✓ https://www.clear-code.com/contact/
✓ 使いたくなったから技術サポートして!
✓ https://www.clear-code.com/contact/
✓ Apache Arrowの開発に参加したい!
✓ https://arrow.apache.org/community/
Apache Arrowフォーマットはなぜ速いのか
Powered by Rabbit 3.0.1

Other slides

Apache Arrow Apache Arrow
2018-12-08
Apache Arrow Apache Arrow
2018-11-17
Apache Arrow Apache Arrow
2017-06-13
Apache Arrow Apache Arrow
2017-05-28
Mroonga! Mroonga!
2015-10-30