Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点

12,495 views

Published on

JJUG CCC 2015 Fall http://www.java-users.jp/?page_id=2056

Published in: Software
  • Be the first to comment

Java8 Stream APIとApache SparkとAsakusa Frameworkの類似点・相違点

  1. 1. 2015/11/28 ひしだま Java8  Stream  APIとApache  Sparkと Asakusa  Frameworkの類似点・相違点 JJUG  CCC  2015  Fall
  2. 2. 2 セッション内容  前提 l JJUGの皆さんならJava8  Stream  APIは知って いる。  Java8  Stream  APIとApache  SparkとAsakusa   Frameworkのコーディングは、DAGを利利⽤用して いるという点で似ている。  これらを⽐比較しつつAsakusa  Frameworkを紹 介する。
  3. 3. 3 ⽬目次 1. ⾃自⼰己紹介 2. Stream  API・Spark・AsakusaFWの紹介 3. Stream  API・Spark・AsakusaFWの類似点 4. Stream  API・Spark・AsakusaFWの相違点 5. まとめ
  4. 4. 4 ⾃自⼰己紹介  ひしだま  Twitter  ID:@hishidama  ホームページ – 灰⾊色なことで有名?? – http://hiroba.dqx.jp/sc/character/ 1091135261820/  最近の仕事 – AsakusaFWを使ったアプリケーション作成 – DQ10:僧侶・道具職⼈人
  5. 5. 5 (⾃自分と)各プロダクトの年年表 時期 出来事 2006年 Apache Hadoop〔Nutchから独立〕 Java6リリース 2010年 2月 (Hadoopを知る) 2010年 初頭 Spark〔OSS化〕 2011年 3月末 Asakusa Framework公開 2011年 7月 (Sparkを知る) 2012年 2月 (SIerから転職) 2012年 8月 DQ10発売 2014年 2月 Apache Spark〔トップレベル昇格〕 2014年 3月 Java8リリース
  6. 6. 6 StreamAPI・Spark・ AsakusaFWの紹介 今回の話題に関連するプロダクト
  7. 7. 7 Java8  Stream  API  「内部イテレーター」で処理理を⾏行行う為のAPI – 参考⽂文献:『現場で使える最新Java  SE  7/8速攻⼊入 ⾨門』
  8. 8. 8 Apache  Hadoop(1/3)  分散処理理フレームワーク l HDFS(分散ファイルシステム) l MapReduce(処理理⽅方式・アルゴリズム) l YARN(リソース管理理) 1. データを複数のマシン上に分散して配置する 2. MapReduceアプリケーション(jarファイル) を各マシンに転送して分散処理理する
  9. 9. 9 Apache  Hadoop(2/3) DBサーバー データ バッチサーバー app サーバー データ app Hadoopクラスター 従来型バッチ Hadoopバッチ アプリケーションのある場所に データを転送する。 サーバー データ app サーバー データ app データのある場所に アプリケーションを転送する。
  10. 10. 10 Apache  Hadoop(3/3)  Hadoopの功績 l  「ビッグデータ」はバズワード化したが、⽴立立役者で あるHadoopは分散処理理を⾝身近にした。  Hadoopの弱点 l MapReduceはシンプルだが、コーディングし づらい。 l 常にファイルを読み書きするというシンプルな 構成なので、メモリーにデータをキャッシュし て使い回すようなことが出来ない。 機械学習とかで 欲しいらしい?
  11. 11. 11 Apache  Spark  分散処理理フレームワーク l RDDを使ったコーディング(Scala) l データをメモリー上にキャッシュして使い回す ことが出来る。 l 分散ファイル⼊入出⼒力力にはHDFSを利利⽤用する。  カリフォルニア⼤大学バークレイ校のAMPLabで 開発され、現在はDatabricksがサポート l https://databricks.com/spark/about l 参考⽂文献:『Apache  Spark⼊入⾨門』
  12. 12. 12 Asakusa  Framework  分散処理理するバッチアプリケーションを作成す る為のフレームワーク l 実⾏行行基盤としてHadoopやSparkを使⽤用  ノーチラステクノロジーズが開発・サポート l  http://www.asakusafw.com/
  13. 13. 13 StreamAPI・Spark・ AsakusaFWの類似点
  14. 14. 14 Java8  Stream  API  例例 MyOperator operator = new MyOperator(); Stream<Data> s0 = 初期データ; Stream<Data> s1 = s0.filter(operator::f); Stream<Data> s2 = s1.map(operator::m); List<Data> out1 = s2.collect(Collectors.toList()); 「メソッド参照」 構文
  15. 15. 15 Java8  Stream  API  MyOperatorの例例 public class MyOperator { public boolean f(Data data) { return data.getValue() % 2 == 0; } public Data m(Data data) { return new Data(data.getValue() + 1); } }
  16. 16. 16 Java8  Stream  API  例例 MyOperator operator = new MyOperator(); Stream<Data> s0 = 初期データ; Stream<Data> s1 = s0.filter(operator::f); Stream<Data> s2 = s1.map(operator::m); List<Data> out1 = s2.collect(Collectors.toList()); これをDAGで表現してみる
  17. 17. 17 【余談】DAG(1/2)  グラフ理理論論 l ノード(頂点)とエッジ(線)で表される図(グラ フ) •  電⾞車車やバスの路路線図 •  ER図 •  フローチャート
  18. 18. 18 【余談】DAG(2/2)  有向⾮非循環グラフ(Directed  Acyclic  Graph) l 向きが有る l 閉路路(循環)が無い 向きが無い 循環が有る 向きが有る 循環が有る 向きが有る 循環が無い
  19. 19. 19 Java8  Stream  API  例例 MyOperator operator = new MyOperator(); Stream<Data> s0 = 初期データ; Stream<Data> s1 = s0.filter(operator::f); Stream<Data> s2 = s1.map(operator::m); List<Data> out1 = s2.collect(Collectors.toList()); s0 filter f map m out1
  20. 20. 20 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
  21. 21. 21 Scala  MyOperatorの例例 class MyOperator { def f(data: Data) : Boolean = data.getValue() % 2 == 0 def m(data: Data) : Data = Data(data.getValue() + 1) }
  22. 22. 22 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(”ファイル名”) ※MyOperatorは通常のScalaと全く同じ s0 filter f map m out1
  23. 23. 23 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
  24. 24. 24 Asakusa  Framework  MyOperatorFactoryの例例 public abstract class MyOperator { @Branch public Filter f(Data data) { return (data.getValue() % 2 == 0) ? Filter.OUT : Filter.MISSED; } @Update public void m(Data data) { data.setValue(data.getValue() + 1); } } コンパイルすると MyOperatorFactory が生成される
  25. 25. 25 類似点まとめ  処理理がDAG(有向⾮非循環グラフ)で表せる s0 filter f map m out1 s0 @Branch f @Update m out1
  26. 26. 26 StreamAPI・Spark・ AsakusaFWの相違点
  27. 27. 27 相違点1:複数⼊入⼒力力  合流流(union)  結合(join)  zip s0 処理 out1 s1
  28. 28. 28 相違点1:複数⼊入⼒力力(合流流) 種類 合流(union) Stream API Stream<Data> out = Stream.concat(Stream.concat(s0, s1), s2); 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
  29. 29. 29 相違点1:複数⼊入⼒力力(結合) 種類 結合(join) Stream API × Spark val out = s0.join(s1) AsakusaFW Source<Joined> out = operator.join(s0, s1).joined; // @MasterJoin 1,abc 2,def 1,foo 3,bar 結合 1,abc,foo
  30. 30. 30 相違点1:複数⼊入⼒力力(結合) 種類 結合(cogroup) Stream API × 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
  31. 31. 31 相違点1:複数⼊入⼒力力(zip) 種類 zip Stream API × Spark val out = s0.zip(s1) AsakusaFW × 1,abc 2,def 1,foo 3,bar zip 2,def,3,bar 1,abc,1,foo
  32. 32. 32 相違点2:複製  同じデータを複数箇所で使⽤用(duplicate) s0 処理2 out2 処理1 out1
  33. 33. 33 相違点2:複製(duplicate) 種類 複数箇所使用(duplicate) Stream API × Spark val out1 = s0.map(operator.m1) val out2 = s0.map(operator.m2) AsakusaFW Source<Data> out1 = operator.m1(s0).out; Source<Data> out2 = operator.m2(s0).out;
  34. 34. 34 相違点3:複数出⼒力力  分岐(branch) s0 out2 分岐 out1
  35. 35. 35 相違点3:複数出⼒力力(分岐) 種類 分岐(branch) Stream API × Spark × AsakusaFW // @Branch Branch result = operator.branch(s0); Source<Data> out1 = result.out1; Source<Data> out2 = result.out2; Source<Data> out3 = result.out3;
  36. 36. 36 根本的な相違点:使⽤用⽬目的 種類 使用目的 Stream API 処理を内部イテレーターで書ける。 (List等のコレクションはStreamに変換する必要がある) 並列Streamでマルチスレッド処理が可能。 Scalaのコレク ション コレクションの処理を内部イテレーターで書ける。 並列Streamでマルチスレッド処理が可能。 Spark (Scala本体と似たコーディングで)複数マシンで分散する処 理を書ける。(いわばマルチプロセス) AsakusaFW 複数マシンで分散して処理するバッチアプリケーションを書く。 (分散処理の実行基盤としてHadoopやSparkを利用する) テスト機構あり。 マルチスレッド・複数マシン分散 → 扱うデータ量の違い マルチスレッド処理と言っても、数十万件といったデータでないとメリットが無い。データ量 が多いと、どうやって読み込むかという問題が出る。数千万〜億件ともなれば、データ自体 を分散し、それぞれを処理する方が効率が良い→Hadoop, Spark
  37. 37. 37 Asakusa  Frameworkの⽬目的(1/4)  分散処理理するバッチアプリケーションを作成す る為のフレームワーク – 当初は実⾏行行基盤としてHadoopを使⽤用  ⼀一つのアプリケーションから複数のHadoopジョブを⽣生 成し、連携して実⾏行行 – 少量量データを扱う際のオーバーヘッドが⼤大きすぎたの で、スモールジョブ実⾏行行エンジンを実装  単体テストの実⾏行行環境としても使⽤用可能 – 最新版では実⾏行行基盤としてSparkを使⽤用可能
  38. 38. 38 Asakusa  Frameworkの⽬目的(2/4)  Asakusa  Frameworkで作ったアプリケーショ ンは、コンパイルすることで実⾏行行バイナリー (jarファイル等)を⽣生成する。 – Hadoop環境⽤用であれば、MapReduceアプリケー ションが⽣生成される。  Spark版実⾏行行バイナリーは、アプリケーション をリコンパイルするだけで⽣生成可能。  今後も有望な実⾏行行基盤が出てくれば、それもサ ポートされる可能性がある。 – 基本的にリコンパイルだけで使える(よう考慮される はず)
  39. 39. 39 Asakusa  Frameworkの⽬目的(3/4)  あるバッチの実⾏行行時間の変遷 1.  Hadoop版 l  Hadoopジョブが180個くらい l  45〜~50分くらい 2.  Hadoop+スモールジョブ実⾏行行エンジン l  10〜~15分くらい 3.  Spark版 l  3〜~4分くらい
  40. 40. 40 Asakusa  Frameworkの⽬目的(3/4)  そのバッチのDAG(の⼀一部(のイメージ)) ノード 一覧 下位 コスト @Convert 変換 上位 コスト コスト @CoGroup 配賦率算出 @Summarize 操業度集計 @CoGroup 配賦 @MJoinUpdate 操業度更新 操業度 1バッチの中に このフローが 25×5個くらい @MJoinUpdate 操業度更新 予定 操業度
  41. 41. 41 Asakusa  Frameworkの⽬目的(4/4)  分散処理理するバッチアプリケーションを作成す る為のフレームワーク – そもそも、分散処理理する必要がある=処理理対象データ が⼤大量量(実⾏行行時間が⻑⾧長い)  実⾏行行時間が⻑⾧長いなら、ジョブ起動にオーバーヘッドが あっても許容できる – 実⾏行行環境にSparkを使⽤用することで、⼩小さいデータで も充分速くなってきた – ⼊入⼒力力データサイズに依らず、バッチならAsakusaFW を使えばいいんじゃない?(※個⼈人の感想です)  ファイルの結合が必要なバッチ処理理はすごく書きやすい
  42. 42. 42 【余談】ハードウェアとソフトウェアの関係  ハードウェアが変われば、それに最適なソフト ウェアは変わる – HadoopはHDDを念念頭においた作りになっている。  ある程度度⼤大きなサイズのブロックアクセス(HDDはラ ンダムアクセスに弱い)
  43. 43. 43 【余談】ハードウェアの技術動向  ディスク – HDD – SSD(HDDより容量量が多くなるとか)  CPU – クロック数は頭打ち – メニーコア化(100コア超)  メモリー – 不不揮発性メモリー(フラッシュメモリー、MRAM等)
  44. 44. 44 【余談】メニーコア化に対する今後の予想  Java8  Stream  API – parallel()を使えばいい  ソース修正が必要(今から並列列化すると、現在は不不利利)  Apache  Spark – executorはSpark管理理下なので、実⾏行行環境の指定を変 えるだけでいけるかも  Asakusa  Framework – リコンパイルするだけで対応できる、と思われる(現 在開発中)
  45. 45. 45 まとめ
  46. 46. 46 まとめ  DAGを使⽤用してコーディングという点は類似 – AsakusaFWは、どの演算⼦子(@Updateとか @MasterJoinとか(mapやfilter等のメソッド相 当))を使えばいいのかが難しいと⾔言われてきたが、 考え⽅方はStream  APIと同じ  Stream  APIが出たことで、時代がAsakusaFWに追いつ いてきた(違  使⽤用⽬目的(扱うデータ量量と実⾏行行基盤)の違い – AsakusaFWはリコンパイルだけで実⾏行行基盤を切切り替 えられる  SparkはAsakusaFWの為に⽣生まれてきた(違
  47. 47. 47 おわり  アドベントカレンダー – http://www.adventar.org/calendars/1166 – 「AsakusaFWを調べてみた」とか「試してみた」と かでも書いてもらえると嬉しいです。  DQ10フレンド募集中

×