rabbit-slide-kou-apache-arrow-tokyo-meetup-2018 2018.12.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +44 -0
- data/Rakefile +27 -0
- data/apache-arrow.rab +855 -0
- data/code-party.rab +77 -0
- data/config.yaml +25 -0
- data/images/columnar.svg +641 -0
- data/images/data-processing-system.svg +2498 -0
- data/images/simd-null.svg +286 -0
- data/introduction.rab +95 -0
- data/pdf/apache-arrow-tokyo-meetup-2018-apache-arrow.pdf +0 -0
- data/theme.rb +1 -0
- metadata +85 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1c364ad9045aeb16d3fc15d11d57420034d4497a89bc05443f9fab2266bb03b5
|
4
|
+
data.tar.gz: cf06b8ebf4321f99adf3bf382dcdcfc57914f17a23cc54be8608d72308b9f81f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f2725c7ba6c85ab2fd3a64e857ac661af7f32a2ac4e260b12cd0ee7d88f9c334fda792696f4ee6c1a55aea6cb8a6f7ff008ac7c32d2e125415c4e9819134f2b
|
7
|
+
data.tar.gz: 2903790590b4cba8396fc358dfdb434fbe2a8e0fe51e10abd92612fee1aa2157f430e55509bb020720ee5058595ceee9d9278acce661d7d7a745a7bef3141fbc
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--size 800,450 apache-arrow.rab
|
data/README.rd
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
= Apache Arrow
|
2
|
+
|
3
|
+
Apache Arrowの開発に参加したい人のためにApache Arrowの情報を紹介します。
|
4
|
+
|
5
|
+
== ライセンス
|
6
|
+
|
7
|
+
=== スライド
|
8
|
+
|
9
|
+
CC BY-SA 4.0
|
10
|
+
|
11
|
+
原著作者名は以下の通りです。
|
12
|
+
|
13
|
+
* 須藤功平(またはKouhei Sutou)
|
14
|
+
|
15
|
+
=== 画像
|
16
|
+
|
17
|
+
==== クリアコードのロゴ
|
18
|
+
|
19
|
+
CC BY-SA 4.0
|
20
|
+
|
21
|
+
原著作者:株式会社クリアコード
|
22
|
+
|
23
|
+
ページヘッダーで使っています。
|
24
|
+
|
25
|
+
== 作者向け
|
26
|
+
|
27
|
+
=== 表示
|
28
|
+
|
29
|
+
rake
|
30
|
+
|
31
|
+
=== 公開
|
32
|
+
|
33
|
+
rake publish
|
34
|
+
|
35
|
+
== 閲覧者向け
|
36
|
+
|
37
|
+
=== インストール
|
38
|
+
|
39
|
+
gem install rabbit-slide-kou-apache-arrow-tokyo-meetup-2018
|
40
|
+
|
41
|
+
=== 表示
|
42
|
+
|
43
|
+
rabbit rabbit-slide-kou-apache-arrow-tokyo-meetup-2018.gem
|
44
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
spec.files += Dir.glob("images/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
spec.add_runtime_dependency("rabbit-theme-clear-code")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Show introduction slide"
|
20
|
+
task :introduction do
|
21
|
+
Rabbit::Command::Rabbit.run("--size", "800,450", "introduction.rab")
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Show code-party slide"
|
25
|
+
task :code_party do
|
26
|
+
Rabbit::Command::Rabbit.run("--size", "800,450", "code-party.rab")
|
27
|
+
end
|
data/apache-arrow.rab
ADDED
@@ -0,0 +1,855 @@
|
|
1
|
+
= Apache Arrow
|
2
|
+
|
3
|
+
: author
|
4
|
+
須藤功平
|
5
|
+
: institution
|
6
|
+
株式会社クリアコード
|
7
|
+
: content-source
|
8
|
+
Apache Arrow東京ミートアップ2018
|
9
|
+
: date
|
10
|
+
2018-12-08
|
11
|
+
: start-time
|
12
|
+
2018-12-08T13:40:00+09:00
|
13
|
+
: end-time
|
14
|
+
2018-12-08T14:20:00+09:00
|
15
|
+
: theme
|
16
|
+
.
|
17
|
+
|
18
|
+
= 自己紹介:名前
|
19
|
+
|
20
|
+
* 須藤功平(すとうこうへい)\n
|
21
|
+
(('note:「と」はにごらない!'))
|
22
|
+
* よく使うアカウント名:kou\n
|
23
|
+
(('note:KOUhei'))
|
24
|
+
* ↑を使えないときのアカウント名:ktou\n
|
25
|
+
(('note:Kouhei suTOU'))
|
26
|
+
|
27
|
+
= 自己紹介:プログラミング
|
28
|
+
|
29
|
+
* Rubyが好き
|
30
|
+
* 2004-01からコミッター
|
31
|
+
* 130くらいのライブラリーをメンテナンス\n
|
32
|
+
(('note:詳細は((<RubyKaigi 2018でのキーノート|URL:https://rubykaigi.org/2018/presentations/ktou.html>))を参照'))
|
33
|
+
* Rubyでプレゼンツールも作っている(('note:(このツール)'))
|
34
|
+
* C/C++を書いている時間も結構ある
|
35
|
+
|
36
|
+
= 自己紹介:C/C++を書く理由
|
37
|
+
|
38
|
+
* RubyでC/C++のライブラリーを使うため!\n
|
39
|
+
(('note:Rubyを書くためにC/C++を書く'))
|
40
|
+
* Apache ArrowをC++で開発しているのもそう
|
41
|
+
* テストはRubyで書いている
|
42
|
+
|
43
|
+
= 自己紹介:Apache Arrowの開発
|
44
|
+
|
45
|
+
* 2016-12-21に最初のコミット
|
46
|
+
* 2017-03-16にGLibバインディングを寄贈
|
47
|
+
* 2017-05-10にコミッター
|
48
|
+
* 2017-09-15にPMCメンバー
|
49
|
+
* 2018-12-06現在コミット数3位(224人中)
|
50
|
+
|
51
|
+
= 自己紹介:仕事
|
52
|
+
|
53
|
+
* ((<株式会社クリアコード|URL:https://www.clear-code.com/>))の代表取締役
|
54
|
+
* 自由なソフトウェアでビジネスをする会社\n
|
55
|
+
(('note:自由なソフトウェア:OSSが参考にしたやつ'))
|
56
|
+
* 私の最近の業務内容
|
57
|
+
* 自由なソフトウェアの推進
|
58
|
+
* 例:SpeeeさんがOSSを開発することをサポート
|
59
|
+
* ((<データ処理ツールの開発事業立ち上げ|URL:https://www.clear-code.com/blog/2018/7/11.html>))((*(New!)*))
|
60
|
+
|
61
|
+
= データ処理ツールの開発事業
|
62
|
+
|
63
|
+
* データ分析をする事業じゃない
|
64
|
+
* データ分析をする人たちが使うツールを\n
|
65
|
+
開発する事業
|
66
|
+
* Apache Arrowはそのために有用なツール\n
|
67
|
+
(('note:Apache Arrowの開発に参加し始めたのはRubyで使いたかったから'))\n
|
68
|
+
(('note:事業立ち上げのためにApache Arrowの開発に参加し始めたわけではない'))\n
|
69
|
+
(('note:Apache Arrowの開発に参加していたら面白そうと思えてきた'))
|
70
|
+
* 募集:開発して欲しい・開発したい(('note:(転職したい)'))
|
71
|
+
|
72
|
+
= Apache Arrow
|
73
|
+
|
74
|
+
各種言語で使える\n
|
75
|
+
インメモリー\n
|
76
|
+
データ処理\n
|
77
|
+
プラットフォーム
|
78
|
+
|
79
|
+
= 実現すること
|
80
|
+
|
81
|
+
データ処理の効率化\n
|
82
|
+
(大量データが対象)
|
83
|
+
|
84
|
+
= 効率化のポイント
|
85
|
+
|
86
|
+
* 速度
|
87
|
+
* 速いほど効率的
|
88
|
+
* 実装コスト
|
89
|
+
* 低いほど効率的
|
90
|
+
|
91
|
+
= 速度向上方法
|
92
|
+
|
93
|
+
* 遅い部分を速く
|
94
|
+
* 高速化できる部分を最適化
|
95
|
+
|
96
|
+
= 遅い部分
|
97
|
+
|
98
|
+
データ交換
|
99
|
+
|
100
|
+
= データ交換
|
101
|
+
|
102
|
+
* データ処理ツール間で必要
|
103
|
+
* データ処理システム
|
104
|
+
* 複数ツールを組み合わせて実現
|
105
|
+
* データ処理システムではデータ交換が必須
|
106
|
+
|
107
|
+
= データ処理システム例
|
108
|
+
|
109
|
+
# img
|
110
|
+
# src = images/data-processing-system.svg
|
111
|
+
# relative_width = 100
|
112
|
+
|
113
|
+
== スライドプロパティー
|
114
|
+
|
115
|
+
: enable-title-on-image
|
116
|
+
false
|
117
|
+
|
118
|
+
= データ交換処理
|
119
|
+
|
120
|
+
(1) シリアライズ\n
|
121
|
+
(('note:データをバイト列へ変換'))
|
122
|
+
(2) 転送\n
|
123
|
+
(('note:バイト列を別ツールに渡す'))
|
124
|
+
(3) デシリアライズ\n
|
125
|
+
(('note:バイト列からデータを復元'))
|
126
|
+
|
127
|
+
= データ交換処理:必要なリソース
|
128
|
+
|
129
|
+
(1) シリアライズ:CPU
|
130
|
+
(2) 転送:I/O(('note:(ネットワーク・ストレージ・メモリー)'))
|
131
|
+
(3) デシリアライズ:CPU
|
132
|
+
|
133
|
+
= Ruby+JSONでデータ交換
|
134
|
+
|
135
|
+
# rouge ruby
|
136
|
+
|
137
|
+
# 1000要素の数値配列
|
138
|
+
n = 1000
|
139
|
+
numbers = n.times.collect {rand}
|
140
|
+
# シリアライズ
|
141
|
+
JSON.dump(numbers, output)
|
142
|
+
# デシリアライズ
|
143
|
+
JSON.load(input)
|
144
|
+
|
145
|
+
= Ruby+JSONの速度の傾向
|
146
|
+
|
147
|
+
# RT
|
148
|
+
|
149
|
+
n, シリアライズ, デシリアライズ
|
150
|
+
|
151
|
+
1000, 0.011秒, 0.004秒
|
152
|
+
10000, 0.093秒, 0.037秒
|
153
|
+
100000, 0.798秒, 0.369秒
|
154
|
+
|
155
|
+
(('note:注:ストレージI/Oなしで計測'))
|
156
|
+
|
157
|
+
データ量の増加と同じくらいの比率で遅くなる
|
158
|
+
|
159
|
+
= データ交換の高速化
|
160
|
+
|
161
|
+
* データ量が増加すると\n
|
162
|
+
シリアライズ・デシリアライズ速度が劣化
|
163
|
+
* 速度劣化を抑えられれば高速化可能
|
164
|
+
|
165
|
+
= Apache Arrowのアプローチ
|
166
|
+
|
167
|
+
* データフォーマットを定義
|
168
|
+
* シリアライズ・デシリアライズが速い
|
169
|
+
* データ量増加に影響を受けにくい
|
170
|
+
* このフォーマットの普及
|
171
|
+
* 各種言語で読み書き処理を実装
|
172
|
+
|
173
|
+
= Ruby+Apache Arrowでデータ交換
|
174
|
+
|
175
|
+
# rouge ruby
|
176
|
+
|
177
|
+
# 1000要素の数値配列
|
178
|
+
n = 1000
|
179
|
+
numbers = Arrow::Int32Array.new(n.times.collect {rand})
|
180
|
+
table = Arrow::Table.new("number" => numbers)
|
181
|
+
# シリアライズ
|
182
|
+
table.save(output)
|
183
|
+
# デシリアライズ
|
184
|
+
Arrow::Table.load(input)
|
185
|
+
|
186
|
+
= Ruby+Apache Arrowの速度の傾向
|
187
|
+
|
188
|
+
# RT
|
189
|
+
|
190
|
+
n, シリアライズ, デシリアライズ
|
191
|
+
|
192
|
+
1000, 0.0003秒, 0.0004秒
|
193
|
+
10000, 0.0004秒, 0.0004秒
|
194
|
+
100000, 0.0015秒, 0.0004秒
|
195
|
+
|
196
|
+
(('note:注:ストレージI/Oなしで計測'))
|
197
|
+
|
198
|
+
全体的に速い+デシリアライズ速度が一定
|
199
|
+
|
200
|
+
= Apache Sparkでの高速化事例
|
201
|
+
|
202
|
+
* Spark⇔PySpark間でデータ交換
|
203
|
+
* 従来:pickleでシリアライズ\n
|
204
|
+
(('note:pickle:Python標準のシリアライズ方法'))
|
205
|
+
* ((<Apache Arrowを使うことで数十倍レベルの高速化|URL:https://arrow.apache.org/blog/2017/07/26/spark-arrow/>))
|
206
|
+
* 詳細は上新さんの話で!
|
207
|
+
|
208
|
+
= Apache Arrowフォーマットの特徴
|
209
|
+
|
210
|
+
* メモリー上でのフォーマットを変換しない
|
211
|
+
* JSONは「数値」を「数字」に変換
|
212
|
+
* 例:(({29}))(1バイト整数)→(({"29"}))(2バイト文字列)
|
213
|
+
* シリアライズ時:変換不要
|
214
|
+
* デシリアライズ時:パース不要
|
215
|
+
|
216
|
+
= メモリーマップの活用
|
217
|
+
|
218
|
+
* メモリーマップ機能
|
219
|
+
* ファイルの内容をメモリー上のデータのように\n
|
220
|
+
アクセスできる機能
|
221
|
+
* (({read}))せずにデータを使える(データコピー不要)
|
222
|
+
* パース不要+メモリーマップ
|
223
|
+
* デシリアライズ時にメモリー確保不要
|
224
|
+
* 「転送」コスト削減
|
225
|
+
|
226
|
+
= 遅い部分の高速化まとめ
|
227
|
+
|
228
|
+
* 遅い部分を速く
|
229
|
+
* ((*データ交換*))を速く
|
230
|
+
* 高速化できる部分を最適化
|
231
|
+
|
232
|
+
= 高速化できる部分
|
233
|
+
|
234
|
+
大量データの計算
|
235
|
+
|
236
|
+
= 大量データの計算の高速化
|
237
|
+
|
238
|
+
* 各データの計算を高速化
|
239
|
+
* まとまったデータの計算を高速化
|
240
|
+
|
241
|
+
= 各データの計算の高速化
|
242
|
+
|
243
|
+
* データを局所化
|
244
|
+
* CPUのキャッシュメモリーを活用できる
|
245
|
+
* 局所化に必要な知識
|
246
|
+
* データの使われ方
|
247
|
+
* 局所化:一緒に使うデータを近くに置く
|
248
|
+
|
249
|
+
= 想定ユースケース
|
250
|
+
|
251
|
+
* OLAP(('note:(OnLine Analytical Processing)'))
|
252
|
+
* データから探索的に知見を探し出すような処理
|
253
|
+
* 列単位の処理が多い
|
254
|
+
* 集計処理・グループ化・ソート…
|
255
|
+
|
256
|
+
= OLAP向きのデータの持ち方
|
257
|
+
|
258
|
+
# img
|
259
|
+
# src = images/columnar.svg
|
260
|
+
# relative_height = 100
|
261
|
+
|
262
|
+
== スライドプロパティー
|
263
|
+
|
264
|
+
: enable-title-on-image
|
265
|
+
false
|
266
|
+
|
267
|
+
= まとまったデータの計算を高速化
|
268
|
+
|
269
|
+
* SIMDを活用\n
|
270
|
+
(('note:Single Instruction Multiple Data'))
|
271
|
+
* スレッドを活用
|
272
|
+
|
273
|
+
= SIMDを活用
|
274
|
+
|
275
|
+
* CPU:データをまとめてアライン\n
|
276
|
+
(('note:アライン:データの境界を64の倍数とかに揃える'))
|
277
|
+
* GPUの活用
|
278
|
+
* 条件分岐をなくす
|
279
|
+
* null/NA用の値は用意せずビットマップで表現\n
|
280
|
+
(('note:((<"Is it time to stop using sentinel values for null / NA values?"|URL:http://wesmckinney.com/blog/bitmaps-vs-sentinel-values/>))'))
|
281
|
+
|
282
|
+
= 条件分岐とnull
|
283
|
+
|
284
|
+
# img
|
285
|
+
# src = images/simd-null.svg
|
286
|
+
# relative_height = 100
|
287
|
+
|
288
|
+
== スライドプロパティー
|
289
|
+
|
290
|
+
: enable-title-on-image
|
291
|
+
false
|
292
|
+
|
293
|
+
= スレッド活用時のポイント
|
294
|
+
|
295
|
+
* 競合リソースを作らない
|
296
|
+
* リソースロックのオーバーヘッドで遅くなりがち
|
297
|
+
* アプローチ
|
298
|
+
* リソースを参照するだけ
|
299
|
+
* 各スレッドにコピー
|
300
|
+
|
301
|
+
= Apache Arrowとスレッド
|
302
|
+
|
303
|
+
* データはリードオンリー
|
304
|
+
* スレッド間でオーバーヘッドなしで共有可能
|
305
|
+
* データコピーは極力避けたい
|
306
|
+
* データ交換時もスレッド活用時も
|
307
|
+
|
308
|
+
= 高速化のまとめ
|
309
|
+
|
310
|
+
* 速度
|
311
|
+
* 遅い処理(((*データ交換処理*)))を高速化
|
312
|
+
* 速くできる処理(((*大量データの計算*)))を最適化
|
313
|
+
* 実装コスト
|
314
|
+
* 低いほど効率的
|
315
|
+
|
316
|
+
= 実装コストを下げる
|
317
|
+
|
318
|
+
* 共通で使いそうな機能をライブラリー化
|
319
|
+
* メリットを受ける人たちみんなで協力して開発
|
320
|
+
* 最適化もがんばる
|
321
|
+
* Apache Arrowの実装コストは下がらない
|
322
|
+
* Apache Arrowを使うツールの実装コストが下がる\n
|
323
|
+
(('note:実装コストが下がる:ツール開発者のメリット'))
|
324
|
+
|
325
|
+
= 共通で使いそうな機能
|
326
|
+
|
327
|
+
* 高速なデータフォーマット
|
328
|
+
* フォーマット変換機能
|
329
|
+
* 効率的なデータ交換処理
|
330
|
+
* 高速なデータ処理ロジック
|
331
|
+
|
332
|
+
= 実装コストのまとめ
|
333
|
+
|
334
|
+
* 速度
|
335
|
+
* 実装コスト
|
336
|
+
* 共通で使いそうな機能を((*ライブラリー化*))
|
337
|
+
* ((*みんなで協力*))して開発
|
338
|
+
|
339
|
+
= Apache Arrowが扱えるデータ
|
340
|
+
|
341
|
+
* 表・データフレーム
|
342
|
+
* 多次元配列
|
343
|
+
|
344
|
+
= 表・データフレーム
|
345
|
+
|
346
|
+
* 行と列で管理する2次元データ\n
|
347
|
+
(('note:RDBMSでいう表'))
|
348
|
+
* すべての行は同じ列を持つ
|
349
|
+
* 各列は異なる型にできる
|
350
|
+
* すべての型でnullをサポート
|
351
|
+
* 2次元配列との違い
|
352
|
+
* 2次元配列はすべての値が同じ型
|
353
|
+
|
354
|
+
= 扱える型:真偽値・数値
|
355
|
+
|
356
|
+
* 真偽値(1ビット)
|
357
|
+
* 整数({8,16,32,64}ビット{非負,}整数)
|
358
|
+
* 浮動小数点数({16,32,64}ビット)
|
359
|
+
* 128ビット小数
|
360
|
+
|
361
|
+
リトルエンディアンのみ対応\n
|
362
|
+
(('note:ビッグエンディアンに対応させようという動きもある:((<ARROW-3476|URL:https://issues.apache.org/jira/browse/ARROW-3476>))'))
|
363
|
+
|
364
|
+
= 真偽値・数値:データの配置
|
365
|
+
|
366
|
+
固定長データなので連続して配置
|
367
|
+
|
368
|
+
32ビット整数:[1, 2, 3]
|
369
|
+
0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 ...
|
370
|
+
|
371
|
+
= 扱える型:文字列・バイト列
|
372
|
+
|
373
|
+
* UTF-8文字列
|
374
|
+
* バイナリーデータ({可変,固定}長)
|
375
|
+
|
376
|
+
= 文字列・バイト列:データの配置
|
377
|
+
|
378
|
+
実データバイト列+長さ配列に配置
|
379
|
+
|
380
|
+
UTF-8文字列:["Hello", "", "!"]
|
381
|
+
実データバイト列:"Hello!'
|
382
|
+
長さ配列:[0, 5, 5, 6]
|
383
|
+
i番目の長さ:長さ配列[i+1] - 長さ配列[i]
|
384
|
+
i番目のデータ:
|
385
|
+
実データバイト列[長さ配列[i]..長さ配列[i+1]]
|
386
|
+
|
387
|
+
= 扱える型:日付・タイムスタンプ
|
388
|
+
|
389
|
+
* 日付
|
390
|
+
* UNIXエポックからの経過日数(32bit)
|
391
|
+
* UNIXエポックからの経過ミリ秒数(64bit)
|
392
|
+
* タイムスタンプ(64ビット整数)
|
393
|
+
* UNIXエポックからの経過{,ミリ}秒数
|
394
|
+
* UNIXエポックからの経過{マイクロ,ナノ}秒数
|
395
|
+
|
396
|
+
= 扱える型:時間
|
397
|
+
|
398
|
+
* 時間
|
399
|
+
* 深夜0時からの経過{,ミリ}秒数\n
|
400
|
+
(32bit整数)
|
401
|
+
* 深夜0時からの経過{マイクロ,ナノ}秒数\n
|
402
|
+
(64bit整数)
|
403
|
+
|
404
|
+
= 扱える型:リスト
|
405
|
+
|
406
|
+
* 0個以上の同じ型の値を持つ
|
407
|
+
* 例:32ビット整数のリスト
|
408
|
+
* 👍0要素:(({[]}))
|
409
|
+
* 👍2要素:(({[2, 3]}))
|
410
|
+
* 👎型が違う:(({[1, "X"]}))
|
411
|
+
|
412
|
+
= リスト:データの配置
|
413
|
+
|
414
|
+
実データの配列+長さ配列に配置
|
415
|
+
|
416
|
+
32bit整数:[[1, 2], null, [3]]
|
417
|
+
実データの配列:[1, 2, 3]
|
418
|
+
長さ配列:[0, 2, 2, 3]
|
419
|
+
i番目の長さ:長さ配列[i+1] - 長さ配列[i]
|
420
|
+
i番目のデータ:
|
421
|
+
実データの配列[長さ配列[i]..長さ配列[i+1]]
|
422
|
+
|
423
|
+
= 扱える型:構造体
|
424
|
+
|
425
|
+
* 1個以上のフィールドを持つ
|
426
|
+
* 各フィールドは別の型にできる
|
427
|
+
* 例:aは32ビット整数、bはUTF-8文字列
|
428
|
+
* 👍全部ある:(({{a: 1, b: "X"}}))
|
429
|
+
* 👍nullもOK:(({{a: 1, b: null}}))
|
430
|
+
* 👎bがない:(({{a: 1}}))
|
431
|
+
|
432
|
+
= 構造体:データの配置
|
433
|
+
|
434
|
+
フィールド分のデータを個別に持つ
|
435
|
+
|
436
|
+
[{a : 1, b: "X"}, {a: 2, b: null}]
|
437
|
+
a:[1, 2]
|
438
|
+
b:["X", null]
|
439
|
+
|
440
|
+
= 扱える型:{疎,密}共用体
|
441
|
+
|
442
|
+
* 1個以上のフィールドを持つ
|
443
|
+
* 各フィールドは別の型にできる
|
444
|
+
* どれかひとつのフィールドの値のみ設定
|
445
|
+
* 例:aは32ビット整数、bはUTF-8文字列
|
446
|
+
* 👍aだけある:(({{a: 1}}))
|
447
|
+
* 👎2つある:(({{a: 1, b: "X"}}))
|
448
|
+
|
449
|
+
= 疎共用体:データの配置
|
450
|
+
|
451
|
+
フィールドと整数を対応付ける配列を持つ
|
452
|
+
どのフィールドを使うか配列を持つ
|
453
|
+
フィールド分のデータを個別に持つ
|
454
|
+
各データはすべての要素を持つ
|
455
|
+
|
456
|
+
[{a : 1}, {b: "X"}, {b: "Y"}]
|
457
|
+
フィールドID配列:[2, 9] aは2、bは9
|
458
|
+
使用フィールド配列:[2, 9, 9]
|
459
|
+
a:[1, null, null]
|
460
|
+
b:[null, "X", "Y"]
|
461
|
+
|
462
|
+
= 密共用体:データの配置
|
463
|
+
|
464
|
+
フィールドと整数を対応付ける配列を持つ
|
465
|
+
どのフィールドを使うか配列を持つ
|
466
|
+
フィールド分のデータを個別に持つ
|
467
|
+
各データは必要な要素だけを持つ
|
468
|
+
各データの何番目の要素を使うか配列を持つ
|
469
|
+
|
470
|
+
[{a : 1}, {b: "X"}, {b: "Y"}]
|
471
|
+
フィールドID配列:[2, 9] aは2、bは9
|
472
|
+
使用フィールド配列:[2, 9, 9]
|
473
|
+
要素オフセット配列:[0, 0, 1] a[0], b[0], b[1]
|
474
|
+
a:[1]
|
475
|
+
b:["X", "Y"]
|
476
|
+
|
477
|
+
= 扱える型:辞書
|
478
|
+
|
479
|
+
* 名義尺度なカテゴリーデータ\n
|
480
|
+
(('note:(統計っぽい説明)'))
|
481
|
+
* 各値にIDを割り当て、そのIDで値を表現\n
|
482
|
+
(('note:(実装よりの説明)'))
|
483
|
+
* 例:(({["X","X","Y"]}))を辞書型の列にした場合
|
484
|
+
* 値:(({[0, 0, 1]}))
|
485
|
+
* IDの割り当て:(({{"X": 0, "Y": 1}}))
|
486
|
+
|
487
|
+
= 辞書:データの配置
|
488
|
+
|
489
|
+
データの配列と何番目のデータを使うかの配列を持つ
|
490
|
+
|
491
|
+
["X", "X", "Y"]
|
492
|
+
データ配列:["X", "Y"]
|
493
|
+
インデックス配列:[0, 0, 1]
|
494
|
+
|
495
|
+
= 表・データフレームのまとめ
|
496
|
+
|
497
|
+
* 表・データフレーム
|
498
|
+
* 2次元データ
|
499
|
+
* 各列は異なる型にできる
|
500
|
+
* 型はたくさんある
|
501
|
+
* 多次元配列
|
502
|
+
|
503
|
+
= 多次元配列
|
504
|
+
|
505
|
+
* n次元のデータを扱う
|
506
|
+
* 要素はすべて同じ型
|
507
|
+
* 型は整数・浮動小数点数のみ
|
508
|
+
* 密・疎ともに対応\n
|
509
|
+
(('note:疎は対応中:((<ARROW-854 [Format] Support sparse tensor|URL:https://issues.apache.org/jira/browse/ARROW-854>))'))
|
510
|
+
* 詳細は村田さんの話で!
|
511
|
+
|
512
|
+
= 多次元配列のまとめ
|
513
|
+
|
514
|
+
* データフレーム
|
515
|
+
* 多次元配列
|
516
|
+
* n次元データ
|
517
|
+
* すべての要素は((*同じ型*))の値
|
518
|
+
* 型は((*整数・浮動小数点数*))のみ
|
519
|
+
* ((*疎・密*))両方サポート
|
520
|
+
|
521
|
+
= Apache Arrowが提供する機能
|
522
|
+
|
523
|
+
* 高速なデータフォーマット
|
524
|
+
* フォーマット変換機能
|
525
|
+
* 効率的なデータ交換処理
|
526
|
+
* 高速なデータ処理ロジック
|
527
|
+
|
528
|
+
= フォーマット変換機能
|
529
|
+
|
530
|
+
* Apache Arrowフォーマット
|
531
|
+
* インメモリー用のフォーマット
|
532
|
+
* 永続化向きではない
|
533
|
+
* 永続化されたデータを使う場合
|
534
|
+
* 永続化に適したフォーマットで保存
|
535
|
+
* 読み込み時にApache Arrowに変換して\n
|
536
|
+
インメモリーでの処理にApache Arrowを使う
|
537
|
+
|
538
|
+
= 対応フォーマット:CSV
|
539
|
+
|
540
|
+
* よく使われているフォーマット
|
541
|
+
* 亜種が多くてパースが大変
|
542
|
+
|
543
|
+
= 対応フォーマット:Apache Parquet
|
544
|
+
|
545
|
+
* 永続化用フォーマット
|
546
|
+
* 列単位でデータ保存:Apache Arrowと相性がよい
|
547
|
+
* 小さい
|
548
|
+
* 列単位の圧縮をサポート
|
549
|
+
* 速い
|
550
|
+
* 必要な部分のみ読み込める(('note:(I/Oが減る)'))
|
551
|
+
|
552
|
+
= 対応フォーマット:Apache ORC
|
553
|
+
|
554
|
+
* 永続化用フォーマット
|
555
|
+
* 列単位でデータ保存:Apache Arrowと相性がよい
|
556
|
+
* Apache Parquetに似ている
|
557
|
+
* Apache Hive用に開発
|
558
|
+
* 今はHadoopやSparkでも使える
|
559
|
+
|
560
|
+
= 対応フォーマット:Feather
|
561
|
+
|
562
|
+
* 永続化用フォーマット
|
563
|
+
* 列単位でデータ保存:Apache Arrowと相性がよい
|
564
|
+
* データフレームを保存
|
565
|
+
* PythonとR間のデータ交換用
|
566
|
+
* ((*今は非推奨!*))
|
567
|
+
* Apache Arrowを使ってね
|
568
|
+
|
569
|
+
= 対応中フォーマット:JSON
|
570
|
+
|
571
|
+
* よく使われているフォーマット
|
572
|
+
|
573
|
+
= 対応中フォーマット:Apache Avro
|
574
|
+
|
575
|
+
* RPCフレームワーク
|
576
|
+
* データフォーマットも提供
|
577
|
+
* 永続化にも使えるフォーマット
|
578
|
+
* ((<ARROW-1209|URL:https://issues.apache.org/jira/browse/ARROW-1209>))
|
579
|
+
* ちょっと止まっている
|
580
|
+
|
581
|
+
= 非公式対応フォーマット:MDS
|
582
|
+
|
583
|
+
* ((<Multiple-Dimension-Spread|URL:https://www.slideshare.net/techblogyahoo/multiple-dimension-spread>))
|
584
|
+
* ((<紹介スライド|URL:https://www.slideshare.net/techblogyahoo/multiple-dimension-spread>))
|
585
|
+
* スキーマレスな永続化用フォーマット
|
586
|
+
* Yahoo! Japan開発
|
587
|
+
* 詳細は井島さんの話で!
|
588
|
+
|
589
|
+
= フォーマット変換機能まとめ
|
590
|
+
|
591
|
+
* 高速なデータフォーマット
|
592
|
+
* フォーマット変換機能
|
593
|
+
* ((*永続化データ*))を処理するために必要
|
594
|
+
* 効率的なデータ交換処理
|
595
|
+
* 高速なデータ処理ロジック
|
596
|
+
|
597
|
+
= 効率的なデータ交換処理
|
598
|
+
|
599
|
+
* Plasma
|
600
|
+
* 同一ホスト上のプロセス間でのデータ共有
|
601
|
+
* Apache Arrow Flight
|
602
|
+
* Apache ArrowベースのRPC
|
603
|
+
* DB連携
|
604
|
+
* 各種DBのレスポンスをApache Arrowに変換
|
605
|
+
|
606
|
+
= Plasma
|
607
|
+
|
608
|
+
* 同一ホストでのデータ共有システム
|
609
|
+
* サーバー:データ管理
|
610
|
+
* クライアント:データ登録・参照
|
611
|
+
* Apache Arrowフォーマットは使っていない
|
612
|
+
* 任意のバイト列を共有
|
613
|
+
* ユースケース:マルチプロセス連携
|
614
|
+
* もともと((<Ray|URL:https://ray.readthedocs.io/en/latest/>))(分散計算システム)用に開発
|
615
|
+
|
616
|
+
= Apache Arrow Flight
|
617
|
+
|
618
|
+
* Apache ArrowベースのRPCフレームワーク
|
619
|
+
* クライント:リクエストデータフレームを送信
|
620
|
+
* サーバー:レスポンスデータフレームを返信
|
621
|
+
* gRPCベース
|
622
|
+
|
623
|
+
= DB連携
|
624
|
+
|
625
|
+
* DBのレスポンスをApache Arrowに変換
|
626
|
+
* 対応済み
|
627
|
+
* Apache Hive, Apache Impala
|
628
|
+
* 対応予定
|
629
|
+
* MySQL/MariaDB, PostgreSQL, SQLite\n
|
630
|
+
MySQLは畑中さんの話の中にPoCが!
|
631
|
+
* SQL Server, ClickHouse
|
632
|
+
|
633
|
+
= 効率的なデータ交換処理のまとめ
|
634
|
+
|
635
|
+
* 高速なデータフォーマット
|
636
|
+
* フォーマット変換機能
|
637
|
+
* 効率的なデータ交換処理
|
638
|
+
* ((*同一ホスト内*))での高速なデータ交換
|
639
|
+
* ((*異なるホスト間*))での高速なデータフレーム交換
|
640
|
+
* ((*DBのレスポンス*))をApache Arrowに変換
|
641
|
+
* 高速なデータ処理ロジック
|
642
|
+
|
643
|
+
= 高速なデータ処理ロジック
|
644
|
+
|
645
|
+
* 高速なデータフレーム処理
|
646
|
+
* CPU:コンパイラーの最適化でベクトル化
|
647
|
+
* GPU:RAPIDSが((<cuDF|URL:https://github.com/rapidsai/cudf>))を開発
|
648
|
+
* 高速なクエリー処理エンジン
|
649
|
+
* Gandiva
|
650
|
+
|
651
|
+
= Gandiva
|
652
|
+
|
653
|
+
* SQLレベルのクエリーの実行エンジン
|
654
|
+
* 四則演算だけではない
|
655
|
+
* 集計・フィルター・結合などもカバー\n
|
656
|
+
(('note:(({GROUP BY})), (({WHERE})), (({JOIN}))'))
|
657
|
+
* 実行時に最適化
|
658
|
+
|
659
|
+
= Gandiva:実行時に最適化
|
660
|
+
|
661
|
+
* クエリーを解析して最適化
|
662
|
+
* 不要な処理を削除・処理順番を入れ替え\n
|
663
|
+
(('note:Gandivaでやるようになるんじゃないかな'))
|
664
|
+
* クエリーをJITコンパイルして実行
|
665
|
+
* インタプリターが実行、ではない
|
666
|
+
* 最適化済みネイティブコードにして実行\n
|
667
|
+
(('note:実行環境のCPUに合わせてベクトル化とか'))
|
668
|
+
|
669
|
+
= 高速なデータ処理ロジックのまとめ
|
670
|
+
|
671
|
+
* 高速なデータフォーマット
|
672
|
+
* フォーマット変換機能
|
673
|
+
* 効率的なデータ交換処理
|
674
|
+
* 高速なデータ処理ロジック
|
675
|
+
* CPUでもGPUでも((*最適化*))
|
676
|
+
* ((*クエリーレベル*))の高速な実行エンジン
|
677
|
+
|
678
|
+
= 対応言語
|
679
|
+
|
680
|
+
* C, C#, C++, Go, Java, JavaScript, Lua
|
681
|
+
* MATLAB, Python, R, Ruby, Rust
|
682
|
+
|
683
|
+
非公式実装:
|
684
|
+
|
685
|
+
* Julia (((<Arrow.jl|URL:https://github.com/ExpandingMan/Arrow.jl>)))
|
686
|
+
|
687
|
+
= 実装方法
|
688
|
+
|
689
|
+
* ネイティブ実装
|
690
|
+
* C#, C++, Go, Java, JavaScript, Julia, Rust
|
691
|
+
* その言語になじむ
|
692
|
+
* C++バインディング
|
693
|
+
* C, Lua, MATLAB, Python, R, Ruby
|
694
|
+
* ホスト言語が遅めでも速い実装になる
|
695
|
+
|
696
|
+
= C#の実装状況
|
697
|
+
|
698
|
+
* 未対応の型
|
699
|
+
* 16bit浮動小数点数・小数・構造体・共用体・辞書
|
700
|
+
* 多次元配列未対応
|
701
|
+
* 計算未対応
|
702
|
+
* Plasma・Flight未対応
|
703
|
+
|
704
|
+
= C++の実装状況
|
705
|
+
|
706
|
+
* すべて実装済み
|
707
|
+
* 一番実装が進む
|
708
|
+
* C++実装のバインディングとして\n
|
709
|
+
開発する言語があるため開発者が多い
|
710
|
+
* Apache Parquet実装も取り込んだ
|
711
|
+
|
712
|
+
= Goの実装状況
|
713
|
+
|
714
|
+
* 未対応の型
|
715
|
+
* 16ビット浮動小数点数・小数・共用体
|
716
|
+
* 計算対応(Gandivaは未対応)
|
717
|
+
* フォーマット変換はCSVのみ対応
|
718
|
+
* Plasma・Flight未対応
|
719
|
+
|
720
|
+
= Javaの実装状況
|
721
|
+
|
722
|
+
* 未対応の型
|
723
|
+
* 16ビット浮動小数点数
|
724
|
+
* 多次元配列未対応
|
725
|
+
* 計算対応(Gandivaも対応)
|
726
|
+
* フォーマット変換未対応
|
727
|
+
* JDBCを使ったDB連携対応
|
728
|
+
|
729
|
+
= JavaScriptの実装状況
|
730
|
+
|
731
|
+
* TypeScript実装
|
732
|
+
* Webブラウザー上でもNode.js上でも動く
|
733
|
+
* 多次元配列未対応
|
734
|
+
* 計算対応(Gandivaは未対応)
|
735
|
+
* フォーマット変換未対応
|
736
|
+
* Plasma・Flight未対応
|
737
|
+
|
738
|
+
= Juliaの実装状況
|
739
|
+
|
740
|
+
* 未対応の型
|
741
|
+
* 16bit浮動小数点数・小数・構造体・共用体
|
742
|
+
* 多次元配列未対応
|
743
|
+
* 計算未対応
|
744
|
+
* フォーマット変換未対応
|
745
|
+
* Plasma・Flight未対応
|
746
|
+
|
747
|
+
= Rustの実装状況
|
748
|
+
|
749
|
+
* 未対応の型
|
750
|
+
* 小数・バイナリーデータ・共用体・辞書
|
751
|
+
* 計算対応(Gandivaは未対応)
|
752
|
+
* フォーマット変換はCSV・Parquet対応
|
753
|
+
* Plasma・Flight未対応
|
754
|
+
|
755
|
+
= C・Lua・Rubyの実装状況
|
756
|
+
|
757
|
+
* C++バインディング
|
758
|
+
* 計算対応(Gandivaも対応)
|
759
|
+
* Plasma対応・Flight未対応
|
760
|
+
* Ruby関連は畑中さん・橋立さんの話で!
|
761
|
+
|
762
|
+
= MATLABの実装状況
|
763
|
+
|
764
|
+
* C++バインディング
|
765
|
+
* Featherの読み込みのみ対応
|
766
|
+
|
767
|
+
= Pythonの実装状況
|
768
|
+
|
769
|
+
* C++バインディング
|
770
|
+
* pandas・NumPy相互変換対応
|
771
|
+
* 計算対応(Gandivaも対応)
|
772
|
+
* Plasma対応・Flight未対応
|
773
|
+
* Python関連は堀越さんの話で!
|
774
|
+
|
775
|
+
= Rの実装状況
|
776
|
+
|
777
|
+
* C++バインディング
|
778
|
+
* 未対応の型:小数・共用体
|
779
|
+
* 計算対応(Gandivaは未対応)
|
780
|
+
* フォーマット変換はFeatherのみ対応
|
781
|
+
* Plasma・Flight未対応
|
782
|
+
* R関連は湯谷さんの話で!
|
783
|
+
|
784
|
+
= 対応言語まとめ
|
785
|
+
|
786
|
+
* 基本的な型はすべての言語で対応済み
|
787
|
+
* すでに((*データ交換用途に使える*))
|
788
|
+
* データの高速な計算は一部言語で対応
|
789
|
+
* フォーマット変換も各言語の対応は様々
|
790
|
+
|
791
|
+
= Apache Arrowの今後案
|
792
|
+
|
793
|
+
(('tag:small'))
|
794
|
+
((<Thoughts about 2019 Arrow development focus areas|URL:https://lists.apache.org/thread.html/497dfdaba3a63a9c87a5f7842c72fb35de6d8c4a4f82ad7bd53eb99e@%3Cdev.arrow.apache.org%3E>))
|
795
|
+
|
796
|
+
* クラウドストレージ対応
|
797
|
+
* データセット対応
|
798
|
+
* プッシュダウン対応
|
799
|
+
* 演算グラフ対応強化
|
800
|
+
* 計算結果のキャッシュ用途対応
|
801
|
+
|
802
|
+
= クラウドストレージ対応
|
803
|
+
|
804
|
+
* クラウドストレージ
|
805
|
+
* Amazon S3、Google Cloud Storageとか
|
806
|
+
* HDFS(Hadoop File System)は対応済み
|
807
|
+
* ストレージ上のデータの読み書きを簡単に
|
808
|
+
|
809
|
+
= データセット対応
|
810
|
+
|
811
|
+
* データセット
|
812
|
+
* 複数ファイルに分かれたデータ群
|
813
|
+
* データセットの読み書きを簡単に
|
814
|
+
|
815
|
+
= データセット例
|
816
|
+
|
817
|
+
a_1/0.parquet # a=1のデータのみ
|
818
|
+
a_1/1.parquet # a=1のデータのみ
|
819
|
+
a_2/2.parquet # a=2のデータのみ
|
820
|
+
a_3/3.parquet # a=3のデータのみ
|
821
|
+
a_3/4.parquet # a=3のデータのみ
|
822
|
+
|
823
|
+
= プッシュダウン対応
|
824
|
+
|
825
|
+
* 下位レイヤーに情報を渡して\n
|
826
|
+
不要な処理をごっそりすっ飛ばす
|
827
|
+
* 例:必要な部分のみファイルから読む
|
828
|
+
* データベースはよくやっている
|
829
|
+
* MySQL/PostgreSQLもやっている
|
830
|
+
|
831
|
+
= プッシュダウン例
|
832
|
+
|
833
|
+
WHERE a = 1のとき
|
834
|
+
a_1/0.parquet # 読む
|
835
|
+
a_1/1.parquet # 読む
|
836
|
+
a_2/2.parquet # 読まない
|
837
|
+
a_3/3.parquet # 読まない
|
838
|
+
a_3/4.parquet # 読まない
|
839
|
+
|
840
|
+
= 演算グラフ対応強化
|
841
|
+
|
842
|
+
* 演算グラフ
|
843
|
+
* SQLの(({SELECT}))でできるような処理をグラフで表現
|
844
|
+
* Gandivaがすでに作っている
|
845
|
+
* Ibisやdplyrぐらいリッチにする
|
846
|
+
* 演算グラフのシリアライズ対応
|
847
|
+
* 実行をもっと速く
|
848
|
+
|
849
|
+
= まとめ
|
850
|
+
|
851
|
+
* Apache Arrowが言語を超えて実現すること
|
852
|
+
* データ交換・データ処理の高速化
|
853
|
+
* 実装の共有(共同開発・ライブラリー化)
|
854
|
+
* Apache Arrowを使いたくなった人は\n
|
855
|
+
Apache Arrowの開発にも参加しよう!
|