1.はじめに
Asi、Sparkの初心者にとって、まず第一に、彼らはSparkの操作メカニズムを知りません。あなたと通信するとき、彼らは彼らが何について話しているのかを知りません。たとえば、展開モードと操作モードが混同される可能性があります。ある程度の開発経験がある方は操作の仕組みを知っていても表現の面でSparkのいろいろな用語をよく理解していないかもしれませんので、Sparkの用語を理解することはSpark開発者同士のコミュニケーションに必要な方法です。 Sparkのさまざまな用語を理解するためのSparkからWordCountへのケースの操作メカニズム。
2.スパーク操作機構
まず、公式Webサイトの写真を撮り、それが分散クラスター上のSparkアプリケーションの一般的な実行フレームワークであることを示します。主にsparkcontext(スパークコンテキスト)、クラスターマネージャー(リソースマネージャー)、executor(単一ノードの実行プロセス)によって。クラスターマネージャーは、クラスター全体の統合リソース管理を担当します。エグゼキュータは、アプリケーション実行のメインプロセスであり、複数のタスクスレッドとメモリスペースが含まれています。
Sparkの主な実行プロセスは次のとおりです。
アプリケーションはspark-submitを使用して送信された後、送信時のパラメーター設定(デプロイモード)に従って、対応する場所でsparkの実行環境であるsparkcontextを初期化し、DAGスケジューラーとタスクスケジューラーを作成します。 。ドライバーはアプリケーションに応じてコードを実行し、プログラム全体はアクションオペレーターに応じて複数のジョブに分割されます。各ジョブはDAGグラフを作成します。DAGスケジューラーはDAGグラフを複数のステージに分割します。同時に、各ステージは複数のタスクに分割されます。DAGスケジューラーは、タスクセットをタスクスケジューラーに渡します。タスクスケジューラーは、クラスター上のタスクのスケジューリングを担当します。ステージとタスクの関係、およびそれがどのように分割されるかについては、後で詳しく説明します。
ドライバは、エグゼキュータやメモリリソースの数など、sparkcontextのリソース要件に従ってリソースマネージャからリソースを適用します。
リソースマネージャはリクエストを受信すると、条件を満たすワークノード上にエグゼキュータプロセスを作成します。
エグゼキュータが作成されると、エグゼキュータは逆方向にドライバに登録されるため、ドライバは実行のためにタスクをエグゼキュータに割り当てることができます。
プログラムが実行されると、ドライバーはリソースマネージャーに要求されたリソースをキャンセルします。
3.Sparkの用語を理解する
運用メカニズムから、次の用語を説明し続けましょう。
3.1ドライバープログラム
ドライバーは、sparkcontextまたはsparksessionを作成するために作成したsparkアプリケーションです。ドライバーは、クラスターマナナーと通信し、実行のためにエグゼキューターにタスクを割り当てます。
3.2クラスターマネージャー
プログラム全体のリソーススケジューリングを担当する現在のメインスケジューラは次のとおりです。
糸
Sparkスタンドアロン
月
3.3エグゼキュータ
エグゼキュータは実際には独立したJVMプロセスであり、各ワーカーノードに1つずつあり、主にタスクの実行に使用されます。エグゼキュータ内では、複数のタスクを同時に実行できます。
3.4仕事
ジョブは、論理名であるユーザープログラムの完全な処理フローです。
3.5ステージ
ジョブには複数のステージを含めることができます。ステージはシリアル化されます。状態のトリガーは、いくつかのシャッフル、reduceBy、および保存アクションによって生成されます。
3.6タスク
ステージには、sc.textFile( "/ xxxx")。map()。filter()などの複数のタスクを含めることができます。ここで、mapとfilterはそれぞれタスクです。各タスクの出力は、次のタスクの出力です。
3.7パーティション
パーティションはsparkのデータソースの一部です。完全なデータソースはsparkによって複数のパーティションに分割されるため、sparkを複数のエグゼキュータに送信してタスクを並行して実行できます。
3.8 RDD
RDDは分散弾性データセットです。sparkでは、データソースは大きなRDDと見なすことができます。RDDは複数のパーティションで構成されています。sparkによってロードされたデータはRDDに保存されます。もちろん、実際にはにカットされます。 RDD。複数のパーティション。
では、問題は、スパークジョブがどのように実行されるかということです。
(1)ドライバーとも呼ばれる私たちが作成したsparkプログラムは、クラスターマネージャーにジョブを送信します
(2)Cluster Managerはデータのローカル回線をチェックし、タスクをスケジュールするのに最適なノードを見つけます
(3)ジョブは異なるステージに分割され、各ステージは複数のタスクに分割されます
(4)ドライバーはタスクをエグゼキュータに送信してタスクを実行します
(5)ドライバーは各タスクの実行を追跡し、それをマスターノードに更新します。これはsparkマスターUIで確認できます。
(6)ジョブが完了すると、平均時間、最大時間、中央値、その他の指標を含むすべてのノードのデータが最終的にマスターノードに再び集約されます。
3.9展開モードと操作モード
展開モードとは、クラスターマネージャーには通常スタンドアロンとYarnが含まれ、操作モードはクラスターまたはタスクを送信するマシンであるかどうかに関係なく、Drvierの実行中のマシンを指します。クラスターモードとクライアントモードに対応します。違いはあります。実行結果、ログ、および安定性で。待ってください。
4.WordCountのケースからさまざまな用語を理解する
関連する概念をもう一度理解する
ジョブ:ジョブはアクションによってトリガーされるため、ジョブには1つのアクション操作とN変換操作が含まれます。
ステージ:ステージはシャッフル操作のために分割されたタスクのセットであり、ステージはその幅と狭い依存関係に従って分割されます。
タスク:各タスクはデータの1つのパーティションのみを担当するため、最小の実行ユニット。
処理中、通常はパーティションと同じ数のタスクが存在するため、このタイプのタスクは実際には異なるパーティションで同じアクションを実行します。
以下はWordCountプログラムです
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object WordCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("yarn").setAppName("WordCount")
val sc = new SparkContext(conf)
val lines1: RDD[String] = sc.textFile("data/spark/wc.txt")
val lines2: RDD[String] = sc.textFile("data/spark/wc2.txt")
val j1 = lines1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)
val j2 = lines2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)
j1.join(j2).collect()
sc.stop()
}
}
実稼働環境ではYarnモードがより多く使用されるため、Yarnデプロイメントモードの観点からは、コードに収集されるアクション操作は1つだけであるため、ジョブは1つだけであり、ジョブはシャッフルによって3つのステージに分割されます。はflatMapとmapです。reduceBykeyはStage0としてカウントされ、他のline2は別のline2としてカウントされます。Stage1、Stage3は最初の2つの結果を結合してから収集し、stage3はstage1とstage0に依存しますが、stage0とstage1は並列です。 。実際の本番環境では、依存関係ステージの依存関係グラフを見ると、依存関係がはっきりとわかります。
Wu Xie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能。もっと注意してください