スパークタスクの実行

スパーク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.textFileMapPartitionsRDDを作成します。実用的ではtextFileインテリアHadoopRDD、そしてRDDマッピング操作は、それが最終的になっているMapPartitionsRDDを作成することです。この後flatMapMap及び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で)、私たちが見ることができます:

3423665-411a28bf5589916e
画像
3423665-71e0f5c577d5ae47
画像

STAGE0に依存ステージ1は、したがって、STAGE0を実行して、ステージ1を実行する必要があります。次に、STAGE0 RDD変換とステージ1での関係を検討します。

3423665-c4522734e4a60576
STAGE0

STAGE0で最終MapPartitionsRDDにファイルを読み込むからパイプライン実行です。以下に示すようSTAGE0は二つのタスクで生成されました:

3423665-e53b348613307eea
画像

入力としてSTAGE0タスクステージ1タスクの最終結果の出力。

3423665-08980b3a4c9126d5
ステージ1
3423665-893f3f5116cd6bef
画像

概要

RDD変換の一連の後、それは、ジョブを生成します、最後の操作RDD上のアクションを呼び出します。ジョブ内のコンピューティングタスク(タスク)の数に分割して、これらのタスクを計算するクラスタに計算ノードに提出されます。タスクでのスパーク分割ShuffleMapTaskしてResultTask2種類。ResultTaskパーティションをそれぞれの結果を生成する(ステージ1に対応)DAGの最終段階は、すべての残りの部分は、ステージShuffleMapTaskを生成します。エグゼキュータに送られます生成されたタスクは、コンピューティングタスクを達成するためにexecutorが開始されています。

スパークは、プロセスを実行します。

  1. 非循環有向グラフで定義されたRDDユーザコード
    に新しいRDD RDDアクションを作成するために、サブ参照親RDD RDD、DAGを形成しました。
  2. 実施計画に翻訳強制運転アクション非循環有向グラフ
    RDDアクション操作を呼び出すときは、RDDを計算しなければなりません。また、これは親ノードがRDDで計算される必要です。スパークスケジューラは、すべての必要なRDDを計算するためのジョブを送信します。このジョブは、一つ以上のステップ、コンピューティングタスクの数に対応する各ステップを含むであろう。また、DAGのステップ又はRDD(実行パイプライン)の複数に相当します。
  3. タスクは、クラスタ内のスケジューリングと実行
    スパークスケジューラは労働者で実行するタスクをスケジュールします、パーティションのデータを処理するタスクを、アクションRDD操作を呼び出した後、それはタスクの多くを生成します。ジョブの最後のステップが終了したら、アクションが終了した操作を実行します。
3423665-1beb0ae8abc22bae
画像

良いテキストをお勧めします:

ます。https://www.jianshu.com/p/8d2bf49cf97dで再現

おすすめ

転載: blog.csdn.net/weixin_33896069/article/details/91059713