Weitere ähnliche Inhalte Ähnlich wie Asakusa FrameworkとScalaの密かな関係 (20) Asakusa FrameworkとScalaの密かな関係4. 4
(⾃自分と)各プロダクトの年年表
時期
出来事
2004年
Scala公開
2006年
Apache Hadoop・Java6リリース
2010年 2月
(Hadoop・HBaseを知る)
2010年 初頭
Spark〔OSS化〕
2010年 8月
(Scalaを知る)
2011年 3月末
Asakusa Framework公開
2011年 7月
(Sparkを知る)
2012年 2月
(SIerから転職)
2012年 8月
DQ10発売
2014年 2月
Apache Spark〔トップレベル昇格〕
2014年 3月
Java8リリース
19. 19
Scala
例例
val
operator
=
new
MyOperator
val
s0
:
Stream[Data]
=
初期データ
val
s1
=
s0.filter(operator.f)
val
s2
=
s1.map(operator.m)
val
out1
=
s2.toSeq
21. 21
Scala
例例
val
operator
=
new
MyOperator
val
s0
:
Stream[Data]
=
初期データ
val
s1
=
s0.filter(operator.f)
val
s2
=
s1.map(operator.m)
val
out1
=
s2.toSeq
これをDAGで表現してみる
24. 24
Scala
例例
val
operator
=
new
MyOperator
val
s0
:
Stream[Data]
=
初期データ
val
s1
=
s0.filter(operator.f)
val
s2
=
s1.map(operator.m)
val
out1
=
s2.toSeq
s0
filter
f
map
m
out1
25. 25
Apache Spark
例例
val
sc
=
new
SparkContext(…)
val
operator
=
new
MyOperator
val
s0
:
RDD[Data]
=
sc.初期データ
val
s1
=
s0.filter(operator.f)
val
s2
=
s1.map(operator.m)
s2.saveAsTextFile(”out1”)
※MyOperatorは通常のScalaと全く同じ
s0
filter
f
map
m
out1
26. 26
Asakusa Framework
フローの例例(概要)
In<Data>
s0
=
入力元;
//ファイル
Out<Data>
out1
=
出力先;
//ファイル
MyOperatorFactory
operator
=
new
MyOperatorFactory();
Source<Data>
s1
=
operator.f(s0).out;
Source<Data>
s2
=
operator.m(s1).out;
out1.add(s2);
s0
@Branch
f
@Update
m
out1
30. 30
相違点1:複数⼊入⼒力力(合流流)
種類
合流(union)
Java8
Stream API
Stream<Data>
out
=
Stream.concat(Stream.concat(s0,
s1),
s2);
Scala
Spark
val
out
=
s0
++
s1
++
s2
AsakusaFW
Source<Data>
out
=
core.confluent(s0,
s1,
s2);
1,abc
2,def
1,foo
3,bar
合流
1,abc
2,def
1,foo
3,bar
32. 32
相違点1:複数⼊入⼒力力(結合)
種類
結合(cogroup)
Java8
Stream API
×
Scala ×
Spark val
out
=
s0.cogroup(s1)
AsakusaFW
Source<Joined>
out
=
operator.group(s0,
s1).out;
//
@CoGroup
1,abc
2,def
1,foo
3,bar
結合
2,def,null
1,abc,foo
3,null,bar
33. 33
相違点1:複数⼊入⼒力力(zip)
種類
zip
Java8
Stream API
×
Scala
Spark
val
out
=
s0.zip(s1)
AsakusaFW
×
1,abc
2,def
1,foo
3,bar
zip
2,def,3,bar
1,abc,1,foo
42. 42
M3 for Batch Processing(M3BP)
単⼀一ノードでの処理理に特化したフレームワーク
– https://github.com/fixstars/m3bp
– OSネイティブのスレッドを使ったマルチスレッド
– 完全にオンメモリー
メモリーに乗り切切らなかったら潔く落落ちる
(Sparkなら⼀一応スピルアウトする。また、シャッフル
処理理後にファイル出⼒力力する)
– (単⼀一ノードなので)複数サーバー間のハートビート
確認等は無い
CPU数⼗十コア・メモリー数百GBのマシンを想定
45. 45
実⾏行行基盤ごとのコンパイル⽅方法
Asakusa on
MapReduce
Asakusa on
Spark
Asakusa on
M3BP
使用コンパイラー
javac
javac
javac
CMake
gcc/g++
生成するファイル
MapReduceの
javaソースを生成
してコンパイルする
Spark部分には
ASMを使って直接
classファイルを生
成する
(scalacは使用し
ない)
実行サーバー用の
ネイティブライブラ
リーが必要となる
ので、C++ソース
を生成してクロスコ
ンパイルする
備考
スモールジョブ実
行エンジンは、実
行時の入力データ
量に応じて自動的
に使われる
ソースが無いので、
例外発生時にス
タックトレースが出
ても調査しづらい
ネイティブなので、
実行時のデータ量
によってはSEGV
が起きることがある
46. 46
Asakusaバッチの実⾏行行時間の例例
Asakusa on
MapReduce
Asakusa on
Spark
Asakusa on
M3BP
抽出・結合(標準的なバッチ)
(入力約1.2GB・561万件)
(出力約60MB・69万件)
約110秒
約85秒
8秒弱
抽出・結合(最小バッチ)
(入力約29kB・900件)
(出力約280B・1件)
約15秒
約60秒
3秒弱
集計
(入力約11GB・2億1700万件)
(出力約940MB・783万件)
約380秒
約700秒
約260秒
データ量が増えるバッチ
(入力約74MB・53万件)
(出力約81GB・1084万件)
約3400秒
約2030秒
約400秒
(メモリ256〜
270GB使用)
色々やってるバッチ
(入力約76GB・2420万件)
(出力約153MB・89万件)
約670秒
約360秒
約92秒
51. 51
Asakusa DSLのホスト⾔言語
1. AsakusaFWでは、Asakusa DSL(Javaをホ
スト⾔言語とする内部DSL)でアプリケーショ
ンを記述する。
2. 内部DSLのホスト⾔言語と⾔言えばScalaでは?
3. Asakusa DSLのホスト⾔言語をScalaとする案
もあったらしい。
– AsakusaFWを主に使うのはSIerという想定なので、
SIerで⼀一番使われているJavaが採⽤用された。
– Asakusa Scala DSLも検討されたことがある。
『Asakusa Scala DSLデザインレビューの勉強会』
https://atnd.org/events/13174