Más contenido relacionado
La actualidad más candente (20)
Similar a Apache Sparkの紹介 (20)
Más de Ryuji Tamagawa (20)
Apache Sparkの紹介
- 10. Hadoop 0.x
• 分散ファイルシステム:HDFS
• 分散コンピューティングフレー
ムワーク:MapReduce
• 生MapReduceでプログラムを書
くのは非常に大変
HadoopRDB
OS
ファイルI/O
メモリバッファ
クエリ実行エンジン
SQL
ドライバ
OS
HDFS
MapReduce
注:この対比はちょっと無理矢理です
- 14. Hadoop 2.x
• クラスタのリソースマネージャー
としてYARN(Yet Another
Resource Manager)が登場、
MapReduce以外の分散コンピュー
ティングフレームワークの誕生の
素地となる
• そして新たに登場したのがSpark
• 別のトレンドとして、インメモリ
系のSQLエンジンが増えてきた
OS
HDFS
Hive e.t.c.
HBaseMapReduce
YARN
Spark
(Spark Streaming, MLlib,
GraphX, Spark SQL)
注:この階層図は技術的に正確ではありません。
複雑すぎて正確に描くことはたぶん無理・・・
Impalaなど
(インメモ
リ系SQL)
「Hadoopって何?」という問いに対する答はどんどん難しく
なっていて、狭義ではHDFS+YARN+MapReduceあたりで
す。ただ、全部ひっくるめて「エコシステム」と表現するこ
とが多くなりました。
- 20. 開発の容易性
public void map(….) … {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
public void reduce(…) … {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
val textFile = spark.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
Spark
MapReduce
シェルから
直接実行可能
- 27. RDD(Resilient Distributed Dataset)
• 論理的にはコレクション
• 物理的にはクラスタ内のノードに分散配置される
• RDDに対して「変換」をかけて、新たなRDDを生成する。その際に生
成されるのはRDD間の系統グラフであり、まだ演算処理は行われない
• RDDに対して「アクション」を行うと、系統グラフをさかのぼって計
算が実行される
# テキストを読んでRDDを生成
rmRDD = sc.textfile(‘readme.md’)
#フィルタをかけて次のRDDを生成
spRDD = rmRDD.filter(…)
#もう1つフィルタ。
sp10RDD = spRDD.filter(…)
#この時点ではまだテキストファイルも読まれていない
#行数のカウント。この時点ですべての処理が走る
count = sp10RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
- 28. RDD(Resilient Distributed Dataset)
• アクションを実行すると、各エクゼキュータ内で一気に系統グラフの計算が行われる。
• JVMの再起動は伴わず、ディスクへのアクセスも少ない。
• CPUのI/O待ちが少なく、使用効率が上がる
# テキストを読んでRDDを生成
rmRDD = sc.textfile(‘readme.md’)
#フィルタをかけて次のRDDを生成
spRDD = rmRDD.filter(…)
#もう1つフィルタ。
sp10RDD = spRDD.filter(…)
#この時点ではまだテキストファイルも読まれていない
#行数のカウント。この時点ですべての処理が走る
count = sp10RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
- 29. RDD(Resilient Distributed Dataset)
• 計算されたRDDの内容は、メモリもしくはディスクにキャッシュできる
• 初回のアクション実行時にキャッシュが行われ、それ以降のアクション実行時
には、キャッシュされたところまでしか系統グラフはさかのぼらない
rmRDD = sc.textfile(‘readme.md’)
spRDD = rmRDD.filter(…)
#キャッシュの指示。この時点ではまだキャッシュされない
spRDD.persist()
sp10RDD = spRDD.filter(…)
sp20RDD = spRDD.filter(…)
#行数のカウント。この時点でspRDDがキャッシュされる
count10 = sp10RDD.count()
#行数のカウント。spRDDの再計算は走らない
count20 = sp20RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
- 30. RDD(Resilient Distributed Dataset)
• 計算されたRDDの内容は、メモリもしくはディスクにキャッシュできる
• 初回のアクション実行時にキャッシュが行われ、それ以降のアクション実行時には、キャッシュされ
たところまでしか系統グラフはさかのぼらない
• 繰り返しの処理を伴うアルゴリズムを効率的に実行できるため、機械学習との相性がいい
rmRDD = sc.textfile(‘readme.md’)
spRDD = rmRDD.filter(…)
#キャッシュの指示。この時点ではまだキャッシュされない
spRDD.persist()
sp10RDD = spRDD.filter(…)
sp20RDD = spRDD.filter(…)
#行数のカウント。この時点でspRDDがキャッシュされる
count10 = sp10RDD.count()
#行数のカウント。spRDDの再計算は走らない
count20 = sp20RDD.count()
元のファイル
rmRDD
spRDD
sp10RDD
123
sp20RDD
456