Sparkコアコンセプト-フレキシブル分散データセットの概要
2440 ワード
Resilient Distribute DataSet
RDDはSparkの最も核心的な理念であり、Sparkを掌握するには、まずRDDという概念を理解しなければならない.次にRDDの概念を説明してみます.
Scalaの集合クラスライブラリを使用したことがある場合は、RDDとそのAPIが非常に一致していることがわかります.Scalaではmap,foreach,flatMapなどの関数をよく使いますが、RDDと付き合っているのは、これらの関数にほかならない.技は同じだ.この面から、RDDはScalaの非変動集合(immutable collection)と見なすことができます.
RDDがScalaの集合と異なる場所は、名前の最初の2文字のdistributeとresilientにある.冗談ですが、Scala集合とRDDの技は一致していますが(いずれもMonadに由来しています)、RDDの内功はScala集合より何倍も深いです.では、先ほどお話ししたRDDの最も重要な2つの特性を見てみましょう.Distribute、この特性はRDDが複数のマシンに分散して実行できることを示している.Resilientには復元可能、復元可能という意味がある、これはRDDが再構築可能であり、フォールトトレランス性を備えることを示す.
まとめると、RDDはフォールトトレランス性と並列実行可能なデータ構造である.次にRDDがどのようにしてこの2点を達成したのかを見てみましょう.
Distribute
まず、単語の数を簡単に統計する例を書きます.
textFile関数は2つのパラメータを携帯することができ、1つ目は入力するファイルで、2つ目はpartitionsの個数です.partitionというパラメータはdistributeと密接に関連している.RDDは実行時にパーティションを基本単位とし、各パーティションは一定数のデータを保有する、各パーティションは実行時に互いに独立して並列に実行する.RDDのパーティション化可能な特性は、並列実行を前提とする.
Resilient
Resilientと言う前に少し敷く.RDDは2種類のAPI:transformation(変換)&action(実行)を提供する.map,flatMap,filterなどのAPIは変換動作である.また、RDDは実行遅延(lazy evaluate)であり、変換操作は実際の計算をトリガーするものではなく、RDDに実行計画を提出するだけである.RDDの実際の実行はaction関数によってトリガされ、action関数にはreduce、take、countなどがある.変換および実行関数には、APIの詳細な参照ドキュメントも多数存在する.
もう一つ、各RDDは読み取り専用です.これはどういう意味ですか.すなわち、RDDは可変である、作成されるといつ読んでも、どこで読んでも、結果は同じである.では、RDDが読み取り専用である以上、mapを作っているのに、filterはいったい何をしているのでしょうか.前述したRDD上のtransformationは実行計画を構築している.もう1つは、RDD間の依存関係を確立することである.(この2点は密接に関連しており、Spark内部の実行プロセスを後続で分析する文章で言及されますが、今は大体このようなことを知っていればいいです.)RDDが提供する
RDDはどのようにしてフォールトトレランスをしますか?タスクが実行中にクラスタ内のノードがダウンタイムし、そのマシン上で実行するタスクとデータがすべて失われると仮定する.このときSparkは直ちに他のノードにそのタスクの再実行を通知する.RDDの内部にはこのタスクを復元するのに十分な情報が記録されているからだ.これらの情報はRDD間の依存関係と実行計画を含む.したがって、RDDはフォールトトレランスである.
ここで、RDDの基本的な概念を述べて、次の編はSpark内部がどのように働いているかを重点的に説明します.1つのRDD ActionAPIの呼び出しから、最終結果の出力まで、Sparkはどのような仕事をしますか.
RDDはSparkの最も核心的な理念であり、Sparkを掌握するには、まずRDDという概念を理解しなければならない.次にRDDの概念を説明してみます.
Scalaの集合クラスライブラリを使用したことがある場合は、RDDとそのAPIが非常に一致していることがわかります.Scalaではmap,foreach,flatMapなどの関数をよく使いますが、RDDと付き合っているのは、これらの関数にほかならない.技は同じだ.この面から、RDDはScalaの非変動集合(immutable collection)と見なすことができます.
RDDがScalaの集合と異なる場所は、名前の最初の2文字のdistributeとresilientにある.冗談ですが、Scala集合とRDDの技は一致していますが(いずれもMonadに由来しています)、RDDの内功はScala集合より何倍も深いです.では、先ほどお話ししたRDDの最も重要な2つの特性を見てみましょう.Distribute、この特性はRDDが複数のマシンに分散して実行できることを示している.Resilientには復元可能、復元可能という意味がある、これはRDDが再構築可能であり、フォールトトレランス性を備えることを示す.
まとめると、RDDはフォールトトレランス性と並列実行可能なデータ構造である.次にRDDがどのようにしてこの2点を達成したのかを見てみましょう.
Distribute
まず、単語の数を簡単に統計する例を書きます.
val textFile = sc.textFile(inputFile, 3) // ,
textFile
.map(_.split(" ")) // ,
.map(_.length) //
val wordCount = .reduce(_ + _) //
textFile関数は2つのパラメータを携帯することができ、1つ目は入力するファイルで、2つ目はpartitionsの個数です.partitionというパラメータはdistributeと密接に関連している.RDDは実行時にパーティションを基本単位とし、各パーティションは一定数のデータを保有する、各パーティションは実行時に互いに独立して並列に実行する.RDDのパーティション化可能な特性は、並列実行を前提とする.
Resilient
Resilientと言う前に少し敷く.RDDは2種類のAPI:transformation(変換)&action(実行)を提供する.map,flatMap,filterなどのAPIは変換動作である.また、RDDは実行遅延(lazy evaluate)であり、変換操作は実際の計算をトリガーするものではなく、RDDに実行計画を提出するだけである.RDDの実際の実行はaction関数によってトリガされ、action関数にはreduce、take、countなどがある.変換および実行関数には、APIの詳細な参照ドキュメントも多数存在する.
もう一つ、各RDDは読み取り専用です.これはどういう意味ですか.すなわち、RDDは可変である、作成されるといつ読んでも、どこで読んでも、結果は同じである.では、RDDが読み取り専用である以上、mapを作っているのに、filterはいったい何をしているのでしょうか.前述したRDD上のtransformationは実行計画を構築している.もう1つは、RDD間の依存関係を確立することである.(この2点は密接に関連しており、Spark内部の実行プロセスを後続で分析する文章で言及されますが、今は大体このようなことを知っていればいいです.)RDDが提供する
toDebugString
を使用して、RDD間の依存関係を確認することができる.以下に、WordCount
例によって生成されたRDD依存関係を示す.(1) MapPartitionsRDD[5] at map at WordCount.scala:22 []
| MapPartitionsRDD[4] at map at WordCount.scala:21 []
| MapPartitionsRDD[1] at textFile at WordCount.scala:16 []
| /home/focusj/workspace/scala/SparkTour/src/main/scala/lfda/core/WordCount.scala HadoopRDD[0] at textFile at WordCount.scala:16 []
RDDはどのようにしてフォールトトレランスをしますか?タスクが実行中にクラスタ内のノードがダウンタイムし、そのマシン上で実行するタスクとデータがすべて失われると仮定する.このときSparkは直ちに他のノードにそのタスクの再実行を通知する.RDDの内部にはこのタスクを復元するのに十分な情報が記録されているからだ.これらの情報はRDD間の依存関係と実行計画を含む.したがって、RDDはフォールトトレランスである.
ここで、RDDの基本的な概念を述べて、次の編はSpark内部がどのように働いているかを重点的に説明します.1つのRDD ActionAPIの呼び出しから、最終結果の出力まで、Sparkはどのような仕事をしますか.