rabbit-slide-kou-rubydata-tokyo-meetup-2018 2018.11.17.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: 5725fafe1f68e884a9ff6d4b547e431ca6872596926dcaf1d0b668d077292375
4
+ data.tar.gz: e5465eb7fb251817676421825f3a5d2fad9f2893e361a34178fae8c650dcdf4f
5
+ SHA512:
6
+ metadata.gz: 60d59e073782bbf8205e99c5e1ef81e54c38ba5b8fa25110c5aca535dbf3353f7aaf5afb8ccfa9f5528bfe3d6d59779deadd4a5a7f144ee27d9ff75cfeca913a
7
+ data.tar.gz: c13f9436de54dd49b1e225438611d118c23ab87ba61befdcf439e7573e20775a22bfd6985077043b2a841f00ae13736322efc8934fb9bd60338f34e4ce6f0c71
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ --size 800,450 apache-arrow.rab
@@ -0,0 +1,44 @@
1
+ = Apache Arrow
2
+
3
+ Apache Arrowの2018年11月現在の最新情報を紹介します。特に、Ruby関連の部分を紹介します。
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-rubydata-tokyo-meetup-2018
40
+
41
+ === 表示
42
+
43
+ rabbit rabbit-slide-kou-rubydata-tokyo-meetup-2018.gem
44
+
@@ -0,0 +1,17 @@
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
@@ -0,0 +1,397 @@
1
+ = Apache Arrow
2
+
3
+ : author
4
+ 須藤功平
5
+ : institution
6
+ 株式会社クリアコード
7
+ : content-source
8
+ RubyData Tokyo Meetup
9
+ : date
10
+ 2018-11-17
11
+ : start-time
12
+ 2018-11-17T14:00:00+09:00
13
+ : end-time
14
+ 2018-11-17T14:25:00+09:00
15
+
16
+ : theme
17
+ .
18
+
19
+ = Apache Arrow
20
+
21
+ 各種言語で使える\n
22
+ インメモリー\n
23
+ データ処理\n
24
+ プラットフォーム
25
+
26
+ = 提供するもの
27
+
28
+ * 高速なデータフォーマット
29
+ * 高速なデータ処理ロジック
30
+ * 各プロダクトで個別に実装するより\n
31
+ 一緒にいいものを実装して共有しよう!
32
+ * 効率的なデータ交換処理
33
+ * ...
34
+
35
+ = 利用例
36
+
37
+ # img
38
+ # src = images/overview.svg
39
+ # relative_width = 100
40
+
41
+ == スライドプロパティー
42
+
43
+ : enable-title-on-image
44
+ false
45
+
46
+ = 大事にすること1
47
+
48
+ 効率的なデータ交換
49
+
50
+ = 前提
51
+
52
+ イマドキの\n
53
+ データ処理システムは\n
54
+ 単一コンポーネントで\n
55
+ 完結しない
56
+
57
+ = 複数コンポーネント
58
+
59
+ * メリット:
60
+ * コンポーネント毎に適した言語を使える
61
+ * デメリット:
62
+ * データ交換が増える(オーバーヘッド)
63
+
64
+ = データ交換コスト
65
+
66
+ * シリアライズコスト
67
+ * 転送コスト
68
+ * デシリアライズコスト
69
+
70
+ = コスト例:JSON
71
+
72
+ シリアライズコスト
73
+ [1] -#to_json-> "[1]"
74
+ 転送コスト
75
+ -output#write->
76
+ -input#read->
77
+ デシリアライズコスト
78
+ "[1]" -JSON.parse-> [1]
79
+
80
+ = コスト比較例:JSON
81
+
82
+ # rouge ruby
83
+
84
+ n = 1000000
85
+ numbers = n.times.to_a
86
+ JSON.dump(numbers, json_file)
87
+ JSON.load(json_file)
88
+
89
+ = コスト比較例:Apache Arrow
90
+
91
+ # rouge ruby
92
+
93
+ n = 1000000
94
+ numbers = Arrow::Int32Array.new(numbers)
95
+ arrow_table = Arrow::Table.new("number" => numbers)
96
+ arrow_table.save(arrow_path)
97
+ Arrow::Table.load(arrow_path)
98
+
99
+ = コスト比較例
100
+
101
+ # RT
102
+
103
+ , 実行時間, JSON比
104
+
105
+ JSON, 0.099秒, 1
106
+ Apache Arrow, 0.002秒, 1/50
107
+
108
+ = データ交換コストの影響
109
+
110
+ * コンポーネント数と正の相関
111
+ * コンポーネントが増えると無視できない
112
+ * データ量と正の相関
113
+ * データが多くなると無視できない
114
+
115
+ = まとめ
116
+
117
+ * イマドキのデータ処理システムで\n
118
+ 大量データを処理するなら\n
119
+ データ交換コストを無視できない
120
+ * Apache Arrowはデータ交換コストが低い
121
+ * 仕組みは後述
122
+
123
+ = 大事にすること2
124
+
125
+ 各種言語で使えること
126
+
127
+ = 各種言語
128
+
129
+ Java, C++, Python, C, ((*Ruby*)), Lua, JavaScript, Go, Rust, MATLAB, R, C#
130
+
131
+ = イマドキのデータ処理システム
132
+
133
+ * コンポーネント毎に適した言語を採用
134
+ * 採用言語でApache Arrowを使えないと\n
135
+ システムでApache Arrowを使えない
136
+ * Apache Arrowに対応していれば\n
137
+ コンポーネントでその言語を採用しやすい
138
+ * Railsが活きるコンポーネントでRubyを使うとか
139
+
140
+ = 実現方法
141
+
142
+ * ネイティブ実装
143
+ * Java, C++, JavaScript, Go, Rust, C#
144
+ * メリット:扱いやすい(インストールが楽とか)
145
+ * C++実装のバインディング
146
+ * Python, C, ((*Ruby*)), Lua, MATLAB, R
147
+ * メリット:高速・実装の共有
148
+
149
+ = まとめ
150
+
151
+ * Apache Arrowは各種言語で使える
152
+ * Rubyと他の言語でのデータ交換が楽になる
153
+ * Ruby実装はC++実装のバインディング
154
+ * 速い・豊富な機能(C++実装はすごく進んでいる)
155
+
156
+ = 大事にすること3
157
+
158
+ 速いこと
159
+
160
+ = 速さが必要な理由
161
+
162
+ 大量のデータを\n
163
+ 処理するため\n
164
+ (('note:ポイント:大量データ前提の設計'))
165
+
166
+ = 速いデータフォーマット
167
+
168
+ * パースせずに使えるデータフォーマット
169
+ * メモリー上で効率よく扱える並びでデータを配置
170
+ * パースしなくてよいし、そのまま使っても速い
171
+ * 既存のデータの並びと互換性あり
172
+ * 例:NumPyの数値配列と互換
173
+ * 互換性があると((*ゼロコピー*))で使える
174
+
175
+ = 速いデータ処理
176
+
177
+ * SIMD・キャッシュメモリー・マルチコアで\n
178
+ 高速化
179
+ * データをアライン・局所化・リードオンリーに
180
+ * 高速な式評価器
181
+ * 式:(({column1 + column2}))みたいなやつ\n
182
+ (('note:(({if}))とかも使える'))
183
+ * Gandiva:式をJITコンパイルして実行
184
+
185
+ = データ処理例:Ruby
186
+
187
+ # rouge ruby
188
+
189
+ n = 100000
190
+ ruby_table = n.times.collect do
191
+ {
192
+ "number1" => rand,
193
+ "number2" => rand,
194
+ }
195
+ end
196
+ ruby_table.collect do |record|
197
+ record["number1"] + record["number2"]
198
+ end
199
+
200
+ = データ処理例:Numo::NArray
201
+
202
+ # rouge ruby
203
+
204
+ n = 100000
205
+ numo_number1 = Numo::DFloat.new(n).rand
206
+ numo_number2 = Numo::DFloat.new(n).rand
207
+ numo_number1 + numo_number2
208
+
209
+ = データ処理例:Gandiva
210
+
211
+ # rouge ruby
212
+
213
+ n = 100000
214
+ arrow_number1 = Arrow::DoubleArray.new(n.times.collect {rand})
215
+ arrow_number2 = Arrow::DoubleArray.new(n.times.collect {rand})
216
+ arrow_table = Arrow::Table.new("number1" => arrow_number1,
217
+ "number2" => arrow_number2)
218
+
219
+ = データ処理例:Gandiva
220
+
221
+ # rouge ruby
222
+
223
+ # 次のリリースまでにいい感じに書けるようにする予定
224
+ schema = arrow_table.schema
225
+ expression =
226
+ Gandiva::Expression.new("add",
227
+ [schema[:number1], schema[:number2]],
228
+ Arrow::Field.new("sum", :double))
229
+ projector = Gandiva::Projector.new(schema, [expression])
230
+ arrow_table.each_record_batch do |record_batch|
231
+ projector.evaluate(record_batch)
232
+ end
233
+
234
+ = データ処理例
235
+
236
+ # RT
237
+
238
+ , 実行時間, Ruby比
239
+
240
+ Ruby, 0.010247秒, 1
241
+ Numo::NArray, 0.000158秒, 1/67
242
+ Gandiva, 0.000459秒, 1/25
243
+
244
+ (('note:Numo::NArrayがすごくがんばっている'))
245
+
246
+ = 速いデータ交換
247
+
248
+ * 同一マシン上での交換
249
+ * メモリーファイルシステム上に置いてmmap
250
+ * Plasma:データ共有サーバーを動かしてIPC\n
251
+ (('note:Inter-Process Communication'))
252
+ * 別マシン上での交換
253
+ * Arrow Flight:gRPCベースのRPCフレームワーク
254
+
255
+ = GPUで速い
256
+
257
+ * Plasma:GPU対応
258
+ * RAPIDS:NVIDIAのGPUをデータサイエンスで\n
259
+ 活用するためのプロジェクト
260
+ * libgdf:Apache Arrowフォーマットのデータを\n
261
+ GPUで扱うデータフレームライブラリー\n
262
+ (('note:Rubyバインディングはまだない'))
263
+
264
+ = まとめ
265
+
266
+ * Apache Arrowは速い
267
+ * 速いデータフォーマット
268
+ * 速いデータ処理(もっと速くなるはず)
269
+ * 速いデータ交換
270
+ * 今後、GPUももっと活用していく
271
+
272
+ = Apache Arrowのこれから例
273
+
274
+ データフォーマットの相互変換強化
275
+
276
+ = 相互変換:Apache Parquet
277
+
278
+ # rouge ruby
279
+
280
+ # Apache Arrow→Apache Parquet
281
+ arrow_table.save("data.parquet")
282
+ # Apache Parquet→Apache Arrow
283
+ Arrow::Table.load("data.parquet")
284
+
285
+ = 相互変換:Feather
286
+
287
+ # rouge ruby
288
+
289
+ # Apache Arrow→Feather
290
+ arrow_table.save("data.feather")
291
+ # Feather→Apache Arrow
292
+ Arrow::Table.load("data.feather")
293
+
294
+ = 相互変換:Apache ORC
295
+
296
+ # rouge ruby
297
+
298
+ # Apache ORC→Apache Arrow
299
+ Arrow::Table.load("data.orc")
300
+
301
+ = 相互変換:CSV
302
+
303
+ # rouge ruby
304
+
305
+ # Apache Arrow→CSV
306
+ arrow_table.save("data.csv")
307
+ # CSV→Apache Arrow
308
+ Arrow::Table.load("data.csv")
309
+
310
+ = CSV読み込み例
311
+
312
+ # rouge ruby
313
+
314
+ # 標準ライブラリー(Ruby実装)
315
+ CSV.foreach(path) {|row| row}
316
+ # 拡張ライブラリー
317
+ Ccsv.foreach(path) {|row| row}
318
+ # C++実装
319
+ Arrow::Table.load(path, use_threads: true)
320
+
321
+ = CSV読み込み時間
322
+
323
+ # RT
324
+
325
+ , 実行時間, csv比
326
+
327
+ csv, 0.818315秒, 1
328
+ ccsv, 0.064988秒, 1/13
329
+ Apache Arrow, 0.009030秒, 1/90
330
+
331
+ = 相互変換:Rubyオブジェクト\n(('note:Rubyバインディング限定'))
332
+
333
+ # rouge ruby
334
+
335
+ # Active Record→Apache Arrow
336
+ User.all.to_arrow
337
+ # Numo::NArray→Apache Arrow
338
+ narray.to_arrow
339
+ # NMatrix→Apache Arrow
340
+ matrix.to_arrow
341
+
342
+ = 相互変換の今後
343
+
344
+ * JSON→Apache Arrow
345
+ * Apache Avro→Apache Arrow
346
+
347
+ = Apache Arrowのこれから(もっと)
348
+
349
+ * RDBMS連携強化
350
+ * PostgreSQL・MySQLでの実行結果を\n
351
+ Apache Arrowフォーマットで返す
352
+ * テンソルサポート強化
353
+ * ...
354
+
355
+ = Rubyバインディングの今後
356
+
357
+ * Plasma対応
358
+ * GandivaバインディングのAPIをいい感じに
359
+ * バインディングフレームワークの高速化
360
+
361
+ (('tag:center'))
362
+ 一緒に開発しようぜ!
363
+
364
+ = Apache ArrowとRubyまわりの今後
365
+
366
+ * libgdfのRubyバインディング開発
367
+ * gumath/xnd/ndtypesとの連携
368
+
369
+ (('tag:center'))
370
+ 一緒に開発しようぜ!
371
+
372
+ = おしらせ1
373
+
374
+ * コード懇親会(今日の懇親会)
375
+ * 興味がでてきたプロダクトのコードを\n
376
+ 一緒に触ってみよう!
377
+ * 開発に参加したくなるかも!
378
+
379
+ ((<URL:https://github.com/speee/code-party/tree/master/rubydata-tokyo-meetup-2018>))
380
+
381
+ = おしらせ2
382
+
383
+ * OSS Gate東京ミートアップ\n
384
+ for Red Data Tools in Speee
385
+ * 2018-11-20 19:30-(来週の火曜日)
386
+ * Red Data Toolsメンバーが開発する集まり
387
+
388
+ ((<URL:https://speee.connpass.com/event/105237/>))
389
+
390
+ = おしらせ3
391
+
392
+ * Apache Arrow東京ミートアップ2018
393
+ * 2018-12-08 13:30-
394
+ * 目的:開発者を増やす
395
+ * 対象プロダクト:Apache Arrow、Red Data Tools、Ruby/Numo、SciRubyなど
396
+
397
+ ((<URL:https://speee.connpass.com/event/103514/>))