rabbit-slide-kou-scipy-japan-2020 2020.10.30.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1694fdea5323a6d70724de9d565454a124a4aa7e6dd9c57541520d4e38c96492
4
+ data.tar.gz: ef1149e86ba6b9b01dc4a5cef715332e6b24ccacc92204877400eaa879a4e50e
5
+ SHA512:
6
+ metadata.gz: 0b804458fc70fde526d34bd4c4cbce0e429648b55133438a0605538c6db384a6e5408ebb8190b510b93651d70356c9c48fc294a8928599f7ca10bc8dc8cc0139
7
+ data.tar.gz: 5fa28e3aa3a2ca589c24ce239aec89a0de1c9d0a7a5a950dcff112e1ed90434a8d90673c14fdab931cf071aa57807fd7adec8f33b81de4a5bc704cd3fdb580c0
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ --size=1920,1080 apache-arrow-1.0.rab
@@ -0,0 +1,65 @@
1
+ = Apache Arrow 1.0 - A cross-language development platform for in-memory data
2
+
3
+ Apache Arrow is a cross-language development platform for in-memory
4
+ data. You can use Apache Arrow to process large data effectively in
5
+ Python and other languages such as R. Apache Arrow is the future of
6
+ data processing. Apache Arrow 1.0, the first major version, was
7
+ released at 2020-07-24. It's a good time to know Apache Arrow and
8
+ start using it.
9
+
10
+ == License
11
+
12
+ === Slide
13
+
14
+ CC BY-SA 4.0
15
+
16
+ Use the followings for notation of the author:
17
+
18
+ * Sutou Kouhei
19
+
20
+ ==== ClearCode Inc. logo
21
+
22
+ CC BY-SA 4.0
23
+
24
+ Author: ClearCode Inc.
25
+
26
+ It is used in page header and some pages in the slide.
27
+
28
+ ==== Apache Arrow and Apache Parquet logos
29
+
30
+ Apache License 2.0
31
+
32
+ Author: The Apache Software Foundation
33
+
34
+ ==== File icon
35
+
36
+ CC BY 4.0
37
+
38
+ Author: Muhammad Yafinuha
39
+
40
+ ==== Memory icon
41
+
42
+ CC BY 4.0
43
+
44
+ Author: Philip Sheffield
45
+
46
+ == For author
47
+
48
+ === Show
49
+
50
+ rake
51
+
52
+ === Publish
53
+
54
+ rake publish
55
+
56
+ == For viewers
57
+
58
+ === Install
59
+
60
+ gem install rabbit-slide-kou-scipy-japan-2020
61
+
62
+ === Show
63
+
64
+ rabbit rabbit-slide-kou-scipy-japan-2020.gem
65
+
@@ -0,0 +1,18 @@
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("tools/**/*.*")
10
+ # spec.files -= Dir.glob("private/**/*.*")
11
+ spec.add_runtime_dependency("rabbit-theme-clear-code")
12
+ end
13
+
14
+ desc "Tag #{spec.version}"
15
+ task :tag do
16
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
17
+ sh("git", "push", "--tags")
18
+ end
Binary file
@@ -0,0 +1,921 @@
1
+ = Apache Arrow 1.0
2
+
3
+ : subtitle
4
+ A cross-language development platform\nfor in-memory data
5
+ : author
6
+ Sutou Kouhei
7
+ : institution
8
+ ClearCode Inc.
9
+ : content-source
10
+ SciPy Japan 2020
11
+ : date
12
+ 2020-10-30
13
+ : start-time
14
+ 2020-10-30T15:00:00+09:00
15
+ : end-time
16
+ 2020-10-30T15:25:00+09:00
17
+ : theme
18
+ .
19
+
20
+ == Note
21
+
22
+ みなさん、こんにちは。\n
23
+ クリアコードの須藤です。\n
24
+ 今日は最近1.0がリリースされたApache Arrowを紹介します。\n
25
+ まだApache Arrowをよく知らない人向けに紹介します。
26
+
27
+ = Me
28
+
29
+ * Apache Arrow PMC member
30
+ * #2 Apache Arrow contributor
31
+
32
+ # image
33
+ # src = images/contributor.png
34
+ # relative-width = 70
35
+
36
+ == Note
37
+
38
+ 私はApache Arrowプロジェクトの開発メンバーです。\n
39
+ コミット数は2番目に多いです。\n
40
+ Apache Arrowに詳しそうですよね。\n
41
+ そんな私が紹介することなので信用できる情報なはずです。
42
+
43
+ = Apache Arrow and You
44
+
45
+ Your data size is ...\n
46
+ (('note:データサイズが…'))
47
+
48
+ * small:\n
49
+ (('note:小さい'))
50
+ * (('wait'))You don't need Apache Arrow\n
51
+ (('note:Apache Arrowを使う必要はない'))
52
+ * large:\n
53
+ (('note:大きい'))
54
+ * (('wait'))Apache Arrow will help you!\n
55
+ (('note:Apache Arrowを使うといいよ!'))
56
+
57
+ == Note
58
+
59
+ これまでいろいろなところでApache Arrowを紹介してきました。\n
60
+ そのときによく聞かれるのが「私はApache Arrowを使った方がよいでしょうか?」ということです。\n
61
+ そこで、最初にどういうときにApache Arrowを使った方がよくてどういうときに使わなくてよいのかを説明します。\n
62
+ まず注目することはデータサイズです。\n
63
+ データサイズが小さい場合はApache Arrowを使う必要はありません。\n
64
+ データサイズが大きい場合はApache Arrowを使うといいことがあるはずです。
65
+
66
+ = How does Apache Arrow help you?\n(('note:どうしてApache Arrowを使うといいの?'))
67
+
68
+ (('tag:center'))
69
+ (('tag:margin-bottom * -0.5'))
70
+ Improves ((*data interchange*)) performance\n
71
+ (('note:((*データ交換*))のパフォーマンス改善'))
72
+
73
+ # image
74
+ # src = images/apache-arrow-and-data-interchange.svg
75
+ # relative-height = 100
76
+
77
+ == Note
78
+
79
+ どうして大規模データでApache Arrowを使った方がよいかというとCSVなど
80
+ Apache Arrow以外のデータフォーマットに比べてApache Arrowフォーマットは
81
+ 高速にデータ交換できるからです。\n
82
+ ここまでApache Arrowはなにかについて説明していませんでした。\n
83
+ Apache Arrowとはなにかがわからなくてモヤモヤしていた人もいたかもしれません。\n
84
+ ここの説明でApache Arrowはファイルフォーマットのことなのだとわかったはずです。
85
+
86
+ = Why does Apache Arrow focus on data interchange?\n(('note:どうしてApache Arrowはデータ交換に注力しているの?'))
87
+
88
+ (('tag:center'))
89
+ (('tag:xx-large'))
90
+ Because it's a bottleneck\n
91
+ (('note:ボトルネックだから'))
92
+
93
+ (('tag:right'))
94
+ (('wait'))...Really?\n
95
+ (('note:…本当?'))
96
+
97
+ == Note
98
+
99
+ それでは、どうしてApache Arrowはデータ交換に注力しているのでしょうか。\n
100
+ それは、大規模データではデータ交換がボトルネックになるからです。\n
101
+ でも、それは本当でしょうか?
102
+
103
+ = Large data transfer case\n(('note:大規模データを転送するケース'))
104
+
105
+ # image
106
+ # src = https://hannes.muehleisen.org/p852-muehleisen.pdf
107
+ # page = 1
108
+ # relative-width = 50
109
+ # relative-clip-y = 8
110
+ # relative-clip-height = 17
111
+ # align = center
112
+ # vertical-align = top
113
+
114
+ # image
115
+ # src = https://hannes.muehleisen.org/p852-muehleisen.pdf
116
+ # page = 1
117
+ # relative-width = 90
118
+ # relative-clip-x = 50
119
+ # relative-clip-y = 25
120
+ # relative-clip-height = 25
121
+ # align = left
122
+ # vertical-align = bottom
123
+ # relative-margin-top = 1.5
124
+ # relative-margin-left = -20
125
+
126
+ # image
127
+ # src = https://hannes.muehleisen.org/p852-muehleisen.pdf
128
+ # page = 2
129
+ # relative-width = 100
130
+ # relative-clip-x = 50
131
+ # relative-clip-height = 29
132
+ # align = right
133
+ # vertical-align = bottom
134
+ # relative-margin-top = 23
135
+ # relative-margin-right = -18
136
+
137
+ (('tag:right'))
138
+ (('tag:margin-top * 22.5'))
139
+ (('note:((<URL:https://hannes.muehleisen.org/p852-muehleisen.pdf>))'))
140
+
141
+ == Slide properties
142
+
143
+ : enable-clear-blue-slide-body-vertical-centering
144
+ false
145
+
146
+ : enable-title-on-image
147
+ false
148
+
149
+ == Note
150
+
151
+ 大規模データを転送するケースについて計測した結果があるので紹介します。\n
152
+ 左の図は各データベースで大規模データを転送したときの時間を示しています。\n
153
+ 左側にあるNetcatと書かれた点線がCSVフォーマットのデータとしてそのまま転送したときの時間です。\n
154
+ 一番速いMySQLから大規模データを取得した場合でも単にCSVを転送したときに比べて10倍時間がかかっています。\n
155
+ 右の図はデータ取得にかかる時間の内訳を示しています。\n
156
+ Result Set SerializationとResult Set Deserizationの時間が大半を占めています。\n
157
+ ここがまさにApache Arrowが高速化しているデータ交換処理です。\n
158
+ なおこの論文の詳細はページの下にあるURLのPDFを参照してください。
159
+
160
+ = Use case: Apache Spark
161
+
162
+ # image
163
+ # src = images/apache-arrow-and-apache-spark.svg
164
+ # relative-height = 100
165
+
166
+ == Slide properties
167
+
168
+ : enable-title-on-image
169
+ false
170
+
171
+ == Note
172
+
173
+ それでは実際にApache Arrowを使ってデータ交換を高速化したケースを紹介します。\n
174
+ Apache Sparkは従来はpickleでSparkとPySpark間のデータを交換していました。\n
175
+ これをApache Arrowにすることで20倍以上の高速化に成功しました。\n
176
+ 右のグラフはApache Arrowの公式ブログで紹介されているデータを使っています。\n
177
+ 実行時間なので棒が短いほうが速いです。\n
178
+ pickleを使った場合は20秒ほどかかっていた処理がApache Arrowを使うことで1秒弱で終わっています。
179
+
180
+ = Use case: Amazon Athena
181
+
182
+ # image
183
+ # src = images/apache-arrow-and-amazon-athena.svg
184
+ # relative-height = 100
185
+
186
+ == Slide properties
187
+
188
+ : enable-title-on-image
189
+ false
190
+
191
+ == Note
192
+
193
+ 次の高速化例はAmazon Athenaです。\n
194
+ Amazon Athenaはユーザーが任意のデータソースからデータを取得できる機能を提供し始めました。\n
195
+ その機能の名前がFederated Queryです。\n
196
+ Federated Queryを使うとAmazon Athenaが組み込みで提供するデータ取得機能より遅くなりがちです。\n
197
+ しかし、Apache Arrowを使うことでできるだけ高速に実現できるようになっています。\n
198
+ たとえば、Amazon AthenaにはAmazon S3からデータを取得する組み込み機能があります。\n
199
+ 普通に考えれば組み込み機能なのでFederated Queryより速くなりそうです。\n
200
+ 右のグラフはFederated QueryのSDKのリポジトリー内にあるデータです。\n
201
+ スループットなので棒が長い方が高速です。\n
202
+ 先程のApache Sparkのグラフとは読み方が異なるので注意してください。\n
203
+ この結果ではAmazon S3からCSVデータを取得するよりもFederated Queryを使ってAmazon S3からApache Arrowデータを取得する方が10倍以上高速でした。\n
204
+ このように大規模データの転送はボトルネックになりうるのです。
205
+
206
+ = Why is Apache Arrow fast?\n(('note:どうしてApache Arrowは速いの?'))
207
+
208
+ # image
209
+ # src = https://slide.rabbit-shocker.org/authors/kou/scipy-japan-2019/apache-arrow.pdf
210
+ # relative-height = 90
211
+
212
+ (('tag:right'))
213
+ (('note:((<URL:https://slide.rabbit-shocker.org/authors/kou/scipy-japan-2019/>))'))
214
+
215
+ == Slide properties
216
+
217
+ : enable-clear-blue-slide-body-vertical-centering
218
+ false
219
+
220
+ : enable-title-on-image
221
+ false
222
+
223
+ == Note
224
+
225
+ どうしてApache Arrowが速いのか気になる人もいるでしょう。\n
226
+ しかし、今日は紹介しません。\n
227
+ 気になる人は去年のSciPy Japanで紹介した資料を参考にしてみてください。
228
+
229
+ = Wow! Awesome!\n(('note:すごいじゃん!'))
230
+
231
+ (('tag:center'))
232
+ (('tag:x-large'))
233
+ Should I always use Apache Arrow?\n
234
+ (('note:いつもApache Arrowを使うべき?'))
235
+
236
+ (('tag:right'))
237
+ (('wait'))...No\n
238
+ (('note:…いやいや'))
239
+
240
+ == Note
241
+
242
+ Apache Arrowすごいじゃん!という気持ちになってきましたよね?\n
243
+ いつもApache Arrowを使っちゃおうかな!と思っている人もいるかもしれません。\n
244
+ でもちょっと待ってください。\n
245
+ 常にApache Arrowが最適とは限りません。
246
+
247
+ = Apache Arrow is designed for\n(('note:Apache Arrowの設計方針'))
248
+
249
+ * In-memory analytics\n
250
+ (('note:メモリー内での分析'))
251
+ * Cross-language
252
+ * Can be used from all languages\n
253
+ (('note:プログラミング言語に依存せずに使えること'))
254
+ * Large data\n
255
+ (('note:大規模データ'))
256
+ * Fast data transfer\n
257
+ (('note:高速なデータ転送'))
258
+
259
+ == Note
260
+
261
+ どういうときにApache Arrowが適切かを理解するためにはApache Arrowの設計方針が参考になります。\n
262
+ 設計方針にマッチしたケースではApache Arrowが向いているはずです。\n
263
+ Apache Arrowはメモリー内での分析、プログラミング言語に依存せずに使えること、大規模データ、高速なデータ転送をいい感じに実現するために設計されています。\n
264
+ それぞれもう少し詳しく説明します。
265
+
266
+ = In-memory analytics\n(('note:メモリー内での分析'))
267
+
268
+ * For in-memory: not for storage\n
269
+ (('note:メモリー内用:保管用ではない'))
270
+ * For storage: Apache Parquet, ...\n
271
+ (('note:保管用にはApache Parquetなどいろいろある'))
272
+ * For analytics: not for transaction\n
273
+ (('note:分析用:トランザクション用ではない'))
274
+ * Not for OLTP use\n
275
+ (('note:OLTP用ではない'))
276
+
277
+ == Note
278
+
279
+ まず、メモリー内での分析についてです。\n
280
+ Apache Arrowは保管用のフォーマットではありません。\n
281
+ 保管用にはApache Parquetなど保管に向いたフォーマットの方が適切です。\n
282
+ また、トランザクション用のフォーマットではありません。\n
283
+ OLTP用途には向いていません。
284
+
285
+ = In-memory(('note:(メモリー内)'))
286
+
287
+ * Apache Arrow format means:\n
288
+ (('note:Apache Arrowフォーマットは↓ということ'))
289
+ * File format: *.arrow files(('note:(ファイルフォーマット)'))
290
+ * Memory layout(('note:(メモリー上のデータの配置方法)'))
291
+ * With Apache Parquet (for storage):\n
292
+ (('note:(保管用の)Apache Parquetと一緒に使う場合:'))
293
+ * Reading Apache Parquet data (file format)\n
294
+ (('note:Apache Parquetデータ(ファイルフォーマット)を読む'))
295
+ * as Apache Arrow data (memory layout)\n
296
+ (('note:読んだデータはApache Arrowデータ(メモリー上の配置)にする'))
297
+
298
+ == Note
299
+
300
+ Apache Arrowはファイルフォーマットであると説明しましたが、実は正確な説明ではありませんでした。\n
301
+ びっくりしましたか?\n
302
+ これまでApache Arrowを説明する機会がいろいろあったのですが、最初からアレもできるコレもできると説明すると説明された人は混乱するということがわかりました。\n
303
+ そのため、今回はできるだけ限定された説明から徐々により正確な説明に広げています。\n
304
+ ではApache Arrowはなにかというと、ファイルフォーマットでもあるのですが、メモリー上のデータの配置方法でもあります。\n
305
+ ファイルフォーマットとメモリー上のデータの配置方法ではなにが違うかは実例で説明します。\n
306
+ Apache Parquetという保管用のフォーマットとApache Arrowを一緒に使う場合を考えます。\n
307
+ まず、ファイルフォーマットとしてApache Parquetデータを読み込みます。\n
308
+ 読み込んだデータはApache Arrowデータとしてメモリー上に配置します。
309
+
310
+ = Apache Parquet and Apache Arrow
311
+
312
+ # image
313
+ # src = images/apache-arrow-and-apache-parquet.svg
314
+ # relative-height = 100
315
+
316
+ == Slide properties
317
+
318
+ : enable-title-on-image
319
+ false
320
+
321
+ == Note
322
+
323
+ 図にするとこんな感じです。\n
324
+ ファイル上ではApache Parquetフォーマットですが、メモリー上ではApache Arrowフォーマットです。\n
325
+ ファイル上でもメモリー上でもApache Arrowフォーマットを使えますが、このように適切なファイルフォーマットを使い分けた方が適切な場合が多いです。\n
326
+ Apache Arrowフォーマットはメモリー上で分析する場合に使いやすいように設計されています。
327
+
328
+ = Analytics\n(('note:分析'))
329
+
330
+ * Column based operations are important\n
331
+ (('note:カラム単位の操作が重要'))
332
+ * Aggregate, sort, filter, ...\n
333
+ (('note:集約、ソート、絞り込み…'))
334
+ * For fast column based operations\n
335
+ (('note:高速なカラム単位の操作に必要なもの'))
336
+ * Columnar layout(('note:(カラムごとにまとまった配置)'))
337
+ * Contiguous data for vectorization\n
338
+ (('note:ベクトル化用に連続して配置したデータ'))
339
+
340
+ == Note
341
+
342
+ どうなっていると分析するときに使いやすいでしょうか。\n
343
+ まず分析するときにどのような操作が重要かを確認します。\n
344
+ 分析するときはカラム単位での集約・ソート・絞り込みといった操作を高速に実行できることが重要です。\n
345
+ これらの操作をしながらデータから知見を得るからです。\n
346
+ 高速にこれらの操作を実行するためにはカラムごとにデータをまとめたり、ベクトル化しやすいように連続してデータを配置します。
347
+
348
+ = Columnar layout\n(('note:カラムごとにまとまった配置'))
349
+
350
+ * Type per column\n
351
+ (('note:カラムごとに型がある'))
352
+ * Data frame is suitable\n
353
+ (('note:データフレームは適切'))
354
+ * Mixed type column data aren't suitable\n
355
+ (('note:カラム内で型が混在しているデータは不向き'))
356
+ * Like data in MongoDB(('note:(MongoDBに入っているようなデータ)'))
357
+ * Union can be used for it but ...\n
358
+ (('note:unionを使って表現できなくはないだろうけど…'))
359
+
360
+ == Note
361
+
362
+ カラムごとにデータがまとめる場合、カラムごとに型を決めます。\n
363
+ データフレームはこのような構造になっているのでカラムごとにデータをまとめやすいです。\n
364
+ 一方、カラム内で型が混在しているデータは向いていません。\n
365
+ たとえば、MongoDBに入っているようなデータは向いていません。\n
366
+ Apache Arrowにはunionという機能があり、それを使えば表現できますが実用的ではないでしょう。
367
+
368
+ = Cross-language
369
+
370
+ * All your modules use only NumPy\n
371
+ (('note:すべてのモジュールでNumPyしか使っていない場合'))
372
+ * NumPy format is enough(('note:(NumPyフォーマットで十分)'))
373
+ * Your system uses multiple languages\n
374
+ (('note:複数のプログラミング言語を使っている場合'))
375
+ * Apache Arrow will be useful(('note:(Apache Arrowの出番)'))
376
+ * Apache Spark, Python and R, ...
377
+
378
+ == Note
379
+
380
+ Apache Arrowはプログラミング言語に依存せずに使えるように設計されています。\n
381
+ これは、大規模データを扱う分析システムはさまざまなプログラミング言語で実装された複数のモジュールで構成されていることが多いからです。\n
382
+ もし、すべてのモジュールでNumPyしか使っていない場合はApache ArrowではなくNumPyフォーマットで十分でしょう。\n
383
+ しかし、前に紹介したApache SparkのようなケースやPythonとRを一緒に使っている場合はApache Arrowで効いてきます。
384
+
385
+ = Use case: RAPIDS
386
+
387
+ # image
388
+ # src = https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf
389
+ # page = 3
390
+ # relative-height = 130
391
+ # relative-clip-y = 15
392
+ # relative-clip-height = 70
393
+
394
+ (('tag:right'))
395
+ (('tag:margin-top * 6'))
396
+ (('note:((<URL:https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=3>))'))
397
+
398
+ == Slide properties
399
+
400
+ : enable-clear-blue-slide-body-vertical-centering
401
+ false
402
+
403
+ : enable-title-on-image
404
+ false
405
+
406
+ == Note
407
+
408
+ 大規模データを扱う分析システムの例を見てみましょう。\n
409
+ RAPIDSはすべてGPU上でデータ分析をするためのツール一式を提供しています。\n
410
+ GPUのメモリー上ではデータをApache Arrowフォーマットで持っていて、すべてのモジュールはApache Arrowフォーマットを扱います。\n
411
+ この構成にすることで劇的に分析処理を高速化できます。
412
+
413
+ = Use case: RAPIDS
414
+
415
+ # image
416
+ # src = https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf
417
+ # page = 8
418
+ # relative-height = 120
419
+ # relative-clip-y = 15
420
+ # relative-clip-height = 80
421
+
422
+ (('tag:right'))
423
+ (('tag:margin-top * 5'))
424
+ (('note:((<URL:https://docs.rapids.ai/overview/RAPIDS%200.15%20Release%20Deck.pdf#page=8>))'))
425
+
426
+ == Slide properties
427
+
428
+ : enable-clear-blue-slide-body-vertical-centering
429
+ false
430
+
431
+ : enable-title-on-image
432
+ false
433
+
434
+ == Note
435
+
436
+ これはどのように高速化されるかを示した図です。\n
437
+ 1番上がApache Hadoopを使ったケースです。\n
438
+ 各処理の前後にHDFSからデータを読み書きする処理が入っています。\n
439
+ 2番目がApache Sparkを使ったケースです。\n
440
+ 最初にHDFSからデータを読み込んだら後はHDFSのデータを読み書きをしないのでApache Hadoopのケースより高速になっています。\n
441
+ 3番目がGPUを活用したケースです。\n
442
+ HDFSからのデータ読み込みは1度だけですが、各処理の間にCPUとGPU間でのデータの読み書きが増えています。\n
443
+ 1番下がApache Arrowを活用したケースです。\n
444
+ すべての処理でGPU上のApache Arrowデータを使うので、CPUとGPU間でのデータの読み書きがなくなります。\n
445
+ これでApache Hadoopのケースよりも10000倍速くなることもあるということです。
446
+
447
+ = Data size\n(('note:データサイズ'))
448
+
449
+ * If you have only small data\n
450
+ (('note:小さなデータの場合'))
451
+ * Any format will work well\n
452
+ (('note:なにを使ってもいい'))
453
+ * We need something to process large data\n
454
+ (('note:大規模データを処理するには工夫が必要'))
455
+
456
+ == Note
457
+
458
+ データサイズについてもう一度考えてみましょう。\n
459
+ データが小さい場合はなにを使っても力技でなんとかなります。\n
460
+ しかし、大規模データではそうもいきません。
461
+
462
+ = Large data with Apache Arrow\n(('note:Apache Arrowで大規模データ'))
463
+
464
+ * Memory mapping(('note:(メモリーマップ)'))
465
+ * can process large data without loading all data on memory at once\n
466
+ (('note:大規模データを一度にすべてメモリー上に載せなくても処理できる'))
467
+ * Record batch(('note:(レコードバッチ)'))
468
+ * can process large data with batches\n
469
+ (('note:大規模データをバッチに分割して処理できる'))
470
+ * can process large data as stream\n
471
+ (('note:大規模データをストリームとして処理できる'))
472
+
473
+ == Note
474
+
475
+ Apache Arrowは大規模データを前提に設計されているので大規模データを扱うための仕組みがあります。\n
476
+ 1つはメモリーマップという仕組みに対応していることです。\n
477
+ メモリーマップを使うと1度にすべてのデータをメモリー上に載せなくても処理できます。\n
478
+ レコードバッチは大規模データを小さく分割して処理する仕組みです。\n
479
+ レコードバッチ単位で処理が完結するならストリームとして大規模データを処理できます。
480
+
481
+ = Memory mapping\n(('note:メモリーマップ'))
482
+
483
+ # image
484
+ # src = images/memory-mapping.svg
485
+ # relative-height = 100
486
+
487
+ == Slide properties
488
+
489
+ : enable-title-on-image
490
+ false
491
+
492
+ == Note
493
+
494
+ メモリーマップについて図にしてみました。\n
495
+ ファイルシステム上にあるデータを一部だけメモリー上に載せて処理できます。\n
496
+ どのデータをメモリー上に載せるかはOSが管理してくれるのでプログラムはシンプルになります。
497
+
498
+ = Record batch\n(('note:レコードバッチ'))
499
+
500
+ # image
501
+ # src = images/record-batch.svg
502
+ # relative-height = 100
503
+
504
+ == Slide properties
505
+
506
+ : enable-title-on-image
507
+ false
508
+
509
+ == Note
510
+
511
+ レコードバッチについて図にしてみました。\n
512
+ 大規模データでも複数のレコードバッチに分割すればメモリー上で分析できます。
513
+
514
+ = Fast data transfer\n(('note:高速データ転送'))
515
+
516
+ * Enough network bandwidth case:\n
517
+ (('note:十分なネットワーク帯域がある場合'))
518
+ * Fast {,de}serialize improves performance\n
519
+ (('note:高速なシリアライズ機能で高速転送が可能'))
520
+ * Network bottleneck case:\n
521
+ (('note:ネットワーク帯域がボトルネックになるケース'))
522
+ * Other small size format may be better\n
523
+ (('note:よりサイズが小さくなる別のフォーマットの方がいいかも'))
524
+
525
+ == Note
526
+
527
+ Apache Arrowは高速にデータ転送できるように設計されています。\n
528
+ ネットワーク帯域が十分にある場合はシリアライズ・デシリアライズを高速化してデータ転送を高速化しています。\n
529
+ シリアライズ・デシリアライズが遅いというデータがあることは最初の方で示しましたが覚えていますか?\n
530
+ 一方、ネットワーク帯域がボトルネックになる場合はシリアライズ・デシリアライズの高速化だけでは対応できません。\n
531
+ より小さなデータになるフォーマットのほうが高速になるでしょう。
532
+
533
+ = Network bottleneck\n(('note:ネットワーク帯域がボトルネック'))
534
+
535
+ * The Amazon Athena use case:\n
536
+ (('note:前述のAmazon Athenaの事例'))
537
+ * Apache Parquet is faster than Apache Arrow\n
538
+ (('note:Apache ArrowよりApache Parquetの方が高速'))
539
+ * Because run-length encoding works well\n
540
+ (('note:ランレングス圧縮がすごく効いていたから'))
541
+ * Apache Arrow supports compression\n
542
+ (('note:Apache Arrowは圧縮をサポートしている'))
543
+ * (('note:Maybe, the Amazon Athena use case doesn't use it'))\n
544
+ (('note:たぶん前述のAmazon Athena事例では使っていない'))
545
+
546
+ == Note
547
+
548
+ たとえば、最初の方で紹介したAmazon AthenaのケースはCSVからApache Arrowにすることでシリアライズ・デシリアライズを高速化してデータ転送が高速になり、ボトルネックがネットワーク帯域に移っていました。\n
549
+ このケースではApache Parquetの方が高速でした。\n
550
+ 理由はApache Parquetのランレングス圧縮ですごくデータサイズが小さくなったからです。\n
551
+ 実は、最近のApache ArrowはLZ4とZstandardを使ったデータ圧縮をサポートしています。\n
552
+ おそらく、Amazon Athenaのデータではこの機能を使っていないと思いますが、この機能を使うとApache Parquetよりも速くなるかもしれません。
553
+
554
+ = Apache Arrow and compression
555
+
556
+ # image
557
+ # src = https://ursalabs.org/20200414_file_sizes.png
558
+ # align = left
559
+ # vertical-align = top
560
+ # relative-width = 75
561
+
562
+ # image
563
+ # src = https://ursalabs.org/20200414_read_py.png
564
+ # align = right
565
+ # vertical-align = bottom
566
+ # relative-width = 75
567
+ # relative-clip-y = 12
568
+ # relative-margin-top = 12
569
+ # relative-margin-left = -3.8
570
+
571
+ (('tag:right'))
572
+ (('tag:margin-top * 15'))
573
+ (('note:((<URL:https://ursalabs.org/blog/2020-feather-v2/>))'))
574
+
575
+ == Slide properties
576
+
577
+ : enable-clear-blue-slide-body-vertical-centering
578
+ false
579
+
580
+ : enable-title-on-image
581
+ false
582
+
583
+ == Note
584
+
585
+ 参考までにApache Arrowの圧縮機能の傾向を紹介します。\n
586
+ 上のグラフはファイルサイズを示しています。\n
587
+ Feather V2と書いているのがApache Arrowフォーマットのことです。\n
588
+ 圧縮することで1/10弱までファイルサイズが小さくなっていて、Apache Parquetよりも少し大きいくらいになっています。\n
589
+ 下のグラフは読み込み速度を示しています。\n
590
+ 圧縮したほうが高速に読み込めています。\n
591
+ Apache Parquetよりも2倍ほど高速です。\n
592
+ ネットワーク帯域のボトルネックが解消されればApache Arrowの方が高速になる可能性は十分にありそうです。
593
+
594
+ = When should I use Apache Arrow\n(('note:いつApache Arrowを使えばよいか'))
595
+
596
+ * In-memory analytics\n
597
+ (('note:メモリー内での分析'))
598
+ * Not for storage(('note:(保管用ではない)'))
599
+ * Not for transaction(('note:(トランザクション用ではない)'))
600
+ * Columnar layout data\n
601
+ (('note:カラムごとにまとまったデータ'))
602
+ * Not for data in document DB\n
603
+ (('note:ドキュメント指向DBに入っているようなデータは向いていない'))
604
+
605
+ == Note
606
+
607
+ ここまででApache Arrowの設計方針を確認しながらどのようなケースに向いていてどのようなケースに向いていないかをみてきました。\n
608
+ おさらいしましょう。\n
609
+ Apache Arrowはメモリー上での分析用に設計されているので保管用途やトランザクション用途には向いていません。\n
610
+ カラムごとにデータをまとめるように設計されているのでドキュメント指向データベースに入っているようなデータは向いていません。
611
+
612
+ = When should I use Apache Arrow\n(('note:いつApache Arrowを使えばよいか'))
613
+
614
+ * Cross-language system\n
615
+ (('note:複数のプログラミング言語を使うシステム'))
616
+ * Many data analytics system use multiple languages\n
617
+ (('note:多くのデータ分析システムは複数のプログラミング言語を使っている'))
618
+ * Large data(('note:(大規模データ)'))
619
+ * Fast data transfer(('note:(高速データ転送)'))
620
+ * Compression may resolve network bottleneck\n
621
+ (('note:ネットワーク帯域がボトルネックになるときは圧縮するといいかも'))
622
+
623
+ == Note
624
+
625
+ 多くのデータ分析システムは複数のプログラミング言語を使っているはずなので、プログラミング言語に依存しないように設計されているApache Arrowは多くの分析システムで使えるはずです。\n
626
+ Apache Arrowは大規模データを扱えるように設計されています。\n
627
+ 高速なデータ転送のための工夫もあります。\n
628
+ ネットワーク帯域がボトルネックになるケースでは圧縮機能も試してみましょう。\n
629
+ どんなときにApache Arrowが向いていてどんなときに向いていないかわかりましたか?
630
+
631
+ = Current\n&\nFuture
632
+
633
+ == Note
634
+
635
+ それではApache Arrowの現状と将来について説明します。
636
+
637
+ = Apache Arrow 1.0.0
638
+
639
+ 2020-07-24
640
+
641
+ == Note
642
+
643
+ 2020-07-24にApache Arrow1.0.0がリリースされました。
644
+
645
+ = What does 1.0.0 mean?\n(('note:1.0.0になったということはどういうこと?'))
646
+
647
+ Start following Semantic Versioning\n
648
+ (('note:セマンティックバージョン開始'))
649
+
650
+ == Note
651
+
652
+ 1.0.0というと安定性が気になると思います。\n
653
+ ということで、セマンティックバージョンに準じたバージョンをつけることになりました。
654
+
655
+ = Semantic Versioning\n(('note:セマンティックバージョン'))
656
+
657
+ * Backward compatible(('note:(後方互換)'))
658
+ * In the same major version(('note:(メジャーバージョンが同じ間)'))
659
+ * Newer can be used with older\n
660
+ (('note:新しいバージョンは古いバージョンと一緒に使える'))
661
+ * Forward compatible(('note:(前方互換)'))
662
+ * In the same major.minor version\n
663
+ (('note:メジャー・マイナーバージョンが同じ間'))
664
+ * Older can be used with newer w/o new features\n
665
+ (('note:古いバージョンは新機能を使わないなら新しいバージョンと一緒に使える'))
666
+
667
+ == Note
668
+
669
+ セマンティックバージョンはバージョンで互換性を担保する仕組みです。\n
670
+ メジャーバージョンが同じ時は後方互換性があり、マイナーバージョンまで同じ場合は前方互換性があります。
671
+
672
+ = Versions in Apache Arrow\n(('note:Apache Arrowのバージョン'))
673
+
674
+ * Apache Arrow format(('note:(Apache Arrowフォーマット)'))
675
+ * File format(('note:(ファイルフォーマット)'))
676
+ * Memory layout(('note:(メモリー上でのデータの配置方法)'))
677
+ * Apache Arrow libraries such pyarrow\n
678
+ (('note:pyarrowのようなApache Arrowライブラリー'))
679
+ * Read/write Apache Arrow file format\n
680
+ (('note:Apache Arrowファイルフォーマットを読み書き'))
681
+ * Process Apache Arrow memory layout data\n
682
+ (('note:メモリー内のApache Arrowデータの処理'))
683
+
684
+ == Note
685
+
686
+ Aapche Arrowのバージョンには2つあります。\n
687
+ 1つはApache Arrowフォーマットのバージョンです。\n
688
+ これはこれまでの説明で「Apache Arrow」と言っていたもののことです。\n
689
+ 実は「Apache Arrow」はフォーマットのことだけを指すものではありません。\n
690
+ つまり、これまでの説明は正確な説明ではありませんでした。\n
691
+ Apache Arrowフォーマットを扱うライブラリーのことも指します。
692
+
693
+ = Release cycle\n(('note:リリースサイクル'))
694
+
695
+ Per 3-4 months\n
696
+ (('note:3-4ヶ月ごと'))
697
+
698
+ == Note
699
+
700
+ Aapche Arrowは3-4ヶ月ごとにリリースされています。
701
+
702
+ = Release and version\n(('note:リリースとバージョン'))
703
+
704
+ * Apache Arrow format's version
705
+ * It's bumped only when needed\n
706
+ (('note:必要なときだけバージョンアップ'))
707
+ * Apache Arrow libraries' version
708
+ * Major version is always bumped\n
709
+ (('note:常にメジャーバージョンアップ'))
710
+ * 2020-07: 1.0.0
711
+ * 2020-10: 2.0.0
712
+
713
+ == Note
714
+
715
+ フォーマットのバージョンは必要なときだけあがります。\n
716
+ 一方、ライブラリーのバージョンは常にメジャーバージョンがあがります。
717
+
718
+ = Major version up\n(('note:メジャーバージョンアップ'))
719
+
720
+ It may break compatibility\n
721
+ (('note:互換性がなくなるかもしれない'))
722
+
723
+ == Note
724
+
725
+ メジャーバージョンがあがるということは互換性が保証されないということです。
726
+
727
+ = You should pin pyarrow version\n(('note:pyarrowのバージョンは固定するべき'))
728
+
729
+ requirements.txt:
730
+
731
+ pyarrow~=1.0.*
732
+
733
+ == Note
734
+
735
+ pyarrowを使うときはバージョンを固定してください。
736
+
737
+ = You may not use pyarrow directly\n(('note:直接pyarrowを使わないかもしれない'))
738
+
739
+ * Your dependencies may use pyarrow internally instead\n
740
+ (('note:依存しているモジュールが内部で使っているかも'))
741
+ * pandas uses pyarrow to read Apache Parquet\n
742
+ (('note:pandasはApache Parquetを読み込むためにpyarrowを使っている'))
743
+ * PySpark uses pyarrow to communicate Spark\n
744
+ (('note:PySparkはSparkと通信するためにpyarrowを使っている'))
745
+ * Modules use pyarrow will be increased\n
746
+ (('note:pyarrowを使うモジュールは増えていくはず'))
747
+
748
+ == Note
749
+
750
+ ただ、みなさんが直接pyarrowを使うことは少ないかもしれません。\n
751
+ というのは、各種モジュールがpyarrowを使って、みなさんは各種モジュール経由で暗黙のうちに使うことのほうが多いだろうからです。
752
+
753
+ = Ecosystem\n(('note:エコシステム'))
754
+
755
+ * The more many modules support Arrow,\n
756
+ the more we can improve performance\n
757
+ (('note:Apache Arrow対応モジュールが増えるほど性能アップ'))
758
+ * Because we don't need to convert to Arrow\n
759
+ (('note:Apache Arrowフォーマットに変換する必要がなくなるから'))
760
+ * Many modules start supporting Arrow!\n
761
+ (('note:多くのモジュールがApache Arrowの対応を始めている!'))
762
+ * Because 1.0.0 was released\n
763
+ (('note:1.0.0がリリースされたから'))
764
+
765
+ == Note
766
+
767
+ より多くのモジュールがApache Arrowを使うとよりApache Arrowの恩恵を受けやすくなります。\n
768
+ Apache Arrowフォーマットに変換する処理が減るからです。\n
769
+ 多くのモジュールがApache Arrowに対応し始めていてエコシステムが動き始めています。
770
+
771
+ = BigQuery Storage API
772
+
773
+ # rouge python
774
+
775
+ from google.cloud import bigquery_storage_v1
776
+
777
+ client = bigquery_storage_v1.BigQueryReadClient()
778
+ ...
779
+ stream = client.read_rows(...)
780
+ arrow_table = stream.to_arrow(...)
781
+
782
+ (('note:See also: ((<URL:https://medium.com/google-cloud/announcing-google-cloud-bigquery-version-1-17-0-1fc428512171>))'))
783
+
784
+ == Note
785
+
786
+ たとえば、BigQuery内のデータを取得するAPIであるBigQuery Storage APIはApache Arrowフォーマットでデータを返す機能を追加しました。
787
+
788
+ = pandas, Dask and Vaex
789
+
790
+ * Use pyarrow to RW Apache Parquet\n
791
+ (('note:Apache Parquetフォーマットを読み書きするためにpyarrowを使用'))
792
+ * Not use Apache Arrow for internal memory layout\n
793
+ (('note:内部のデータの持ち方はApache Arrowではない'))
794
+ * cuDF does but not use pyarrow to process data\n
795
+ (('note:cuDFはApache Arrowデータとして持っているがpyarrowでは処理していない'))
796
+
797
+ == Note
798
+
799
+ pandas, Dask, VaexといったデータフレームライブラリーはApache Parquetフォーマットを読み書きするためにparrowを使っています。\n
800
+ ただ、内部のデータの持ち方はApache Arrowフォーマットではありません。
801
+
802
+ = Current pyarrow use cases\n(('note:現時点でのpyarrowの利用例'))
803
+
804
+ * Apache Parquet reader/writer
805
+ * Apache Arrow data representation\n
806
+ (('note:Apache Arrowデータの表現'))
807
+ * Not used for internal memory layout\n
808
+ (('note:内部のデータ表現としては使われていない'))
809
+ * (('note:NumPy's memory layout is used for numeric'))
810
+ * (('note:Apache Arrow's memory layout is compatible with NumPy's one'))
811
+ * Why?(('note:(どうして?)'))
812
+
813
+ == Note
814
+
815
+ 現在のpyarrowの使い方で多いのはApache Parquetフォーマットの読み書きのためと、メモリー上のApache Arrowデータを表現のためです。\n
816
+ 処理対象のデータをApache Arrowデータとしては使っていません。\n
817
+ どうしてでしょうか。
818
+
819
+ = Apache Arrow native\ndata processing\n(('note:Apache Arrowデータの処理'))
820
+
821
+ Work In Progress\n
822
+ (('note:実装中'))
823
+
824
+ == Note
825
+
826
+ それはメモリー上のApache Arrowデータの処理機能がまだ実装中だからです。
827
+
828
+ = Data processing\n(('note:データ処理'))
829
+
830
+ * Current:(('note:(現在)'))
831
+ * Gandiva and compute functions\n
832
+ (('note:((<URL:https://arrow.apache.org/docs/cpp/api/compute.html>))'))\n
833
+ (('note:Gandivaと計算関数がある'))
834
+ * Missing some features such as sort related\n
835
+ (('note:ソート関連などまだ機能が足りない'))
836
+ * Future:(('note:(将来)'))
837
+ * Apache Arrow native data frame\n
838
+ (('note:Apache Arrowデータ用データフレーム'))
839
+
840
+ == Note
841
+
842
+ 現在は、Gandivaと計算関数で実装されているデータ処理機能がありますが、ソート関連機能など足りない機能があります。\n
843
+ 将来は、メモリー上のApache Arrowデータに対して動くデータフレームライブラリーを提供する予定です。
844
+
845
+ = Apache Arrow native data frame\n(('note:Apache Arrowデータ用データフレーム'))
846
+
847
+ * File system module(('note:(ファイルシステムモジュール)'))
848
+ * Read/write files with the same API\n
849
+ (('note:同じAPIでファイル操作'))
850
+ * Current: Local, HDFS and S3
851
+ * Dataset module(('note:(データセットモジュール)'))
852
+ * Read/write semantic datasets stored in different locations and formats\n
853
+ (('note:様々な場所・フォーマットのデータを論理的なデータセットとして読み書き'))
854
+ * Current: Apache Arrow, Apache Parquet and CSV
855
+
856
+ == Note
857
+
858
+ Apache Arrow用のデータフレームライブラリーのためにサブモジュールを開発しているのが現状です。\n
859
+ ファイルシステムモジュールとデータセットモジュールはすべての機能はまだ揃っていませんが動きます。
860
+
861
+ = Apache Arrow native data frame\n(('note:Apache Arrowデータ用データフレーム'))
862
+
863
+ * Query engine module(('note:(クエリーエンジンモジュール)'))
864
+ * Process query against dataset\n
865
+ (('note:データセットに対してクエリー実行'))
866
+ * Current: Not started(('note:(現在:未着手)'))
867
+ * Data frame module(('note:(データフレームモジュール)'))
868
+ * Provide higher level API for these modules\n
869
+ (('note:これらのモジュールを使う高レベルのAPI'))
870
+ * Current: Not started(('note:(現在:未着手)'))
871
+
872
+ == Note
873
+
874
+ クエリーエンジンモジュールとデータフレームモジュールは未着手です。
875
+
876
+ = Wrap up\n(('note:まとめ'))
877
+
878
+ * Apache Arrow 1.0.0 was released!\n
879
+ (('note:Apache Arrow 1.0.0がリリースされた!'))
880
+ * Semantic versioning(('note:(セマンティックバージョン)'))
881
+ * You will use Apache Arrow implicitly\n
882
+ (('note:知らないうちにApache Arrowを使うことが増えるはず'))
883
+ * You can't use pyarrow for data processing yet\n
884
+ (('note:pyarrowでデータ処理をするにはまだ機能不足'))
885
+ * (('wait'))But I want to use ASAP!\n
886
+ (('note:でも、すぐに使いたい!'))
887
+
888
+ == Note
889
+
890
+ 今回はどのようなときにApache Arrowが向いていてどのようなときに向いていないかを説明しました。\n
891
+ Apache Arrow 1.0.0がリリースされたことでユーザーは増え始めています。\n
892
+ pandas経由などすでに知らないうちにApache Arrowを使っていることもあるでしょう。\n
893
+ ただ、まだpyarrowでデータを処理できません。\n
894
+ でも、早く使いたいですよね!
895
+
896
+ = Join us!\n(('note:おいでよ!'))
897
+
898
+ * The Apache Arrow project welcomes all!\n
899
+ (('note:((<URL:https://arrow.apache.org/community/>))'))\n
900
+ (('note:Apache Arrowプロジェクトは歓迎するよ!'))
901
+ * You can get features what you want quickly if you join developing them\n
902
+ (('note:開発に参加すると欲しい機能がより早く手に入るよ!'))
903
+ * Community in Japanese: Red Data Tools\n
904
+ (('note:((<URL:https://gitter.im/red-data-tools/ja>))'))\n
905
+ (('note:日本語で相談したい人はRed Data Toolsへ'))
906
+ * ClearCode Inc. supports it:\n
907
+ (('note:((<URL:https://www.clear-code.com/services/apache-arrow.html>))'))\n
908
+ (('note:クリアコードは商用サポートを提供しているよ'))
909
+
910
+ == Note
911
+
912
+ そう思ったみなさんはぜひApache Arrowの開発に参加してください!\n
913
+ 開発に参加すると欲しい機能をより早く実現できます。\n
914
+ 開発に参加する方法は公式サイトに説明があります。\n
915
+ 日本語で相談したい人はRed Data Toolsというプロジェクトに来てください。\n
916
+ 私が始めたプロジェクトで、私をはじめApache Arrowの開発に参加している人が数人います。\n
917
+ 日本語で相談できます。\n
918
+ もし、仕事で取り組みたい場合はクリアコードという私たちの会社がApache Arrowのコンサルティングサポートを提供しています。\n
919
+ 成果をできるだけApache Arrow本体に還元するように進めます。\n
920
+ どのような方法でも大丈夫です。\n
921
+ ぜひApache Arrowの開発に参加してください!