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 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の開発にも参加しよう!