スパークRDDとRDDの操作を学習した後、本当にすぐに彼らが学んだことについてのスパークを統合するプログラムを書きたいされていません。ビッグデータは少ない語数それを開発する方法を学ぶことができますか?
いくつかの単語の男は、直接コードに、言いました:
val lines = sc.textFile("data/dataset.txt")
val result = lines.flatMap(_.split(" "))
.map((_, 1))
.reduceByKey(_ + _)
result.collect()
.foreach(x => println(x._1 + " = " + x._2))
出力:
Deer = 2
Bear = 2
Car = 3
River = 2
わずか数行のコードWORDCOUNT書き込みのMapReduceプログラムを考え、WORDCOUNTを取得するには、スパークはあまりにも本当に使いやすいです。
次に、我々はいくつかの他の事を行うには、あなただけの書いたプログラムを利用したいです...
まず第一に、我々は、Sparkを提供することができtoDebugString
血統RDD方式を参照してください。
result.toDebugString
出力:
(2) ShuffledRDD[4] at reduceByKey at WordCount.scala:21 []
+-(2) MapPartitionsRDD[3] at map at WordCount.scala:20 []
| MapPartitionsRDD[2] at flatMap at WordCount.scala:19 []
| data/dataset.txt MapPartitionsRDD[1] at textFile at WordCount.scala:17 []
| data/dataset.txt HadoopRDD[0] at textFile at WordCount.scala:17 []
出力結果から、我々はいくつかのRDD WORDCOUNTプログラムが出て作成された見ることができます。ここではボトムアップから。
するために呼び出すsc.textFile
MapPartitionsRDDを作成します。実用的ではtextFile
インテリアHadoopRDD、そしてRDDマッピング操作は、それが最終的になっているMapPartitionsRDDを作成することです。この後flatMap
、Map
及びreduceByKey
他の変換操作、後者はRDD RDDに依存する前に。最後の呼び出しcollect
アクション操作、生成仕事を。このスパークスケジューラで、ユーザ・コンピューティング・オペレーションRDD物理的行動の実施計画を作成します。スパークスケジューラは最終から起動することができcollect()
、すべての必要な計算のRDDをバックアップし、出発RDD操作。親スケジューラは、RDDのすべての必要な計算物理学プログラムの祖先を生成するために、再帰的にアップし、その上RDDの親、親を訪問し、かつます。
DAG世代
元のRDD(S)はDAGの系列を変換することによって形成されています。RDDを含んRDD、間の依存関係がパーティションに由来する親RDD(複数可)に変換され、それがどのような親RDD(S)に依存します。RDDのリネージュ(下降)の形成にこれらの依存関係。RDDが失われた場合の結果の一部またはすべてが、それを再することができ、フォールトトレランスRDDを達成することもなく、;リネージュで、それは親RDDを依存し、RDDが前に計算されて保証することができ、計算が完了していますすべてのデータを再計算せずに、失われたデータの計算のこの部分。
タスクDAGを計算生成する方法
DAGの依存関係に応じて、異なる段階(ステージ)に分割されています。パーティション依存性確信ので、パーティションの変換プロセスは、同じスレッド内に完了することができる狭い依存性のために、狭い依存関係は同じSparkのステージに分割され、ワイド依存性のために起因シャッフルの存在のために、唯一の親RDD(複数の)治療が完了した後、以下の計算を開始することができるが、このように広いスパーク依存性は、ステージを分割に基づいています。一つの内部段階では、各パーティションは、並列タスクで実行することができる計算タスク(タスク)が割り当てられます。大きい粒子サイズにステージDAG間の依存関係は、DAGの実行順序は、後方にも前方です。それは親のステージや親のステージが実行されていない場合にのみ、他の言葉では、ステージは、あなたが行うことができます。
上記の例でWORDCOUNTは、シフト操作が行われreduceByKey
たときにトリガシャッフル(シャッフリング)プロセス。このように、ここから全体の仕事は、二つのステージを形成し、分割します。スパークでのWebUI(http://127.0.0.1:4040で)、私たちが見ることができます:
STAGE0に依存ステージ1は、したがって、STAGE0を実行して、ステージ1を実行する必要があります。次に、STAGE0 RDD変換とステージ1での関係を検討します。
STAGE0で最終MapPartitionsRDDにファイルを読み込むからパイプライン実行です。以下に示すようSTAGE0は二つのタスクで生成されました:
入力としてSTAGE0タスクステージ1タスクの最終結果の出力。
概要
RDD変換の一連の後、それは、ジョブを生成します、最後の操作RDD上のアクションを呼び出します。ジョブ内のコンピューティングタスク(タスク)の数に分割して、これらのタスクを計算するクラスタに計算ノードに提出されます。タスクでのスパーク分割ShuffleMapTask
してResultTask
2種類。ResultTaskパーティションをそれぞれの結果を生成する(ステージ1に対応)DAGの最終段階は、すべての残りの部分は、ステージShuffleMapTaskを生成します。エグゼキュータに送られます生成されたタスクは、コンピューティングタスクを達成するためにexecutorが開始されています。
スパークは、プロセスを実行します。
- 非循環有向グラフで定義されたRDDユーザコード
に新しいRDD RDDアクションを作成するために、サブ参照親RDD RDD、DAGを形成しました。 - 実施計画に翻訳強制運転アクション非循環有向グラフ
RDDアクション操作を呼び出すときは、RDDを計算しなければなりません。また、これは親ノードがRDDで計算される必要です。スパークスケジューラは、すべての必要なRDDを計算するためのジョブを送信します。このジョブは、一つ以上のステップ、コンピューティングタスクの数に対応する各ステップを含むであろう。また、DAGのステップ又はRDD(実行パイプライン)の複数に相当します。 - タスクは、クラスタ内のスケジューリングと実行
スパークスケジューラは労働者で実行するタスクをスケジュールします、パーティションのデータを処理するタスクを、アクションRDD操作を呼び出した後、それはタスクの多くを生成します。ジョブの最後のステップが終了したら、アクションが終了した操作を実行します。
良いテキストをお勧めします:
ます。https://www.jianshu.com/p/8d2bf49cf97dで再現