Sparkフレームワーク3の詳細な理解:オペレーティングアーキテクチャ、コアデータセットRDD

序文


ほとんどのSparkフレームワークはHadoopシステム上に構築されているため、Sparkのコア動作原理を理解するには、Hadoopシステムをよく理解している必要があります。Hadoop1.0からHadoop2.0アーキテクチャの最適化と開発調査の詳細な説明このブログでは、最初にHadoopシステム全体を確認してから、Sparkフレームワークがより効率的になることを理解することができます。

長所と短所の理由、エコシステム、運用構造、原則について直接記事を書きたかったのですが、長すぎるため、2つの記事に分かれています。

パートI:深い理解のSparkフレームワーク:理由の開発と長所と短所

Novella:2つの深さを理解するためのSparkフレームワーク:エコシステム


1.Sparkクラスターアーキテクチャ

Sparkのアーキテクチャ図:

  • アプリケーション:クラスター内の複数のノードに分散されたドライバー関数コードとエグゼキューターコードを含む、ユーザーによって作成されたSparkアプリケーション。
  • クライアントプログラム:ユーザーがジョブを送信するクライアント
  • ドライバー:アプリケーションのメイン関数を実行し、SparkContextを作成します。
  • SparkContext:ライフサイクル全体を制御するアプリケーションコンテキスト。ClusterManagerとの通信、リソースアプリケーション、タスクの割り当てと監視などを担当します。Executor部分が完了すると、ドライバーはSparkContextを閉じる責任もあります。
  • Cluter Manager:クラスター上のリソースを取得する外部サービスを指します。現在3種類あります

1)Standalon:ネイティブリソース管理をスパークし、マスターがリソース割り当てを担当します。スタンドアロンの使用はSparkのネイティブリソースマネージャーであることも理解できます。

2)Apache Mesos:hadoopMRとの互換性に優れたリソーススケジューリングフレームワーク

3)Hadoop Yarn:主にYarnのResourceManagerを指します

  • Sparkワーカー:1つ以上のExecutorプロセスを実行し、アプリケーションを実行できるクラスター内の任意のノード
  • エグゼキュータ:これは、ワーカーノード(Sparkワーカー)で実行されるプロセスであり、タスクの実行を担当します。エグゼキュータはスレッドプールを開始してタスクを実行します。武器はデータをメモリまたはディスクに保存する責任があります。各アプリケーションは、タスクを処理するために独自のエグゼキュータを申請します。
  • タスク:Executorで実行されている作業単位。
  • ジョブ:ジョブには、複数のRDDと、対応するRDDに対するさまざまな操作が含まれます。
  • ステージ:ジョブの基本的なスケジューリング単位です。ジョブは複数のタスクグループに分割されます。タスクの各グループはステージまたはタスクセットと呼ばれ、シャッフルの依存関係がない関連タスクのグループを表します。タスクセット。
  • RDD:Resilient分散データセットの略語、中国語はElastic分散データセット、Sparkのコアモジュールおよびクラスです。
  • DAGScheduler:ジョブに応じてステージベースのDAGを構築し、ステージをTaskSchedulerに送信します

アプリケーションはドライバーと複数のジョブで構成され、ジョブは複数のステージで構成され、ステージはシャッフル関係のない複数のタスクで構成されます。

アプリケーションが実行されると、ドライバーはクラスターマネージャーからリソースを申請し、エグゼキューターを起動し、アプリケーションコードとファイルをエグゼキューターに送信してから、エグゼキューターでタスクを実行します。実行が終了すると、実行結果が表示されます。ドライバに返されるか、HDFSまたは他のデータベースに書き込まれます。

Hadoop MapReduceコンピューティングフレームワークと比較して、Sparkで使用されるExecutorには2つの利点があります。

  1. マルチスレッドを使用して特定のタスクを実行し、タスクの起動オーバーヘッドを削減します。
  2. ExecutorにはBlockManagerストレージモジュールがあり、メモリとディスクをストレージデバイスとして使用して、IOオーバーヘッドを効果的に削減します。

1つの画像フロー:

操作プロセス:

2.スパーク動作モード

動作環境

モード

説明

地元

ローカルモード

ローカルの開発とテストによく使用されますが、ローカルはローカルのシングルスレッドとローカルクラスターのマルチスレッドにも分けられます。

スタンドアロン

クラスターモード

典型的なMater / slaveモードですが、マスターに単一障害点があることもわかります。SparkはZooKeeperをサポートしてHAを実現します。

糸に

クラスターモード

ヤーンリソースマネージャーフレームワークで実行され、ヤーンはリソース管理を担当し、Sparkはタスクのスケジューリングと計算を担当します

どこの月

クラスターモード

mesosリソースマネージャーのフレームワーク上で実行され、mesosはリソース管理を担当し、Sparkはタスクのスケジューリングと計算を担当します

クラウド上

クラスターモード

たとえば、AWSのEC2は、このモードを使用して、AmazonのS3に簡単にアクセスできます。

Sparkは複数の分散ストレージシステムをサポートします:HDFSとS3

その中でも、MesosモードとYARNモードは似ています。現在、スタンドアロンモードとYARNモードがより一般的に使用されています。

1.スタンドアロン操作モード

スタンドアロンモードは、Sparkによって実装されるリソーススケジューリングフレームワークであり、そのメインノードはクライアントノード、マスターノード、およびワーカーノードです。ドライバーは、マスターノードまたはローカルクライアント側で実行できます。Sparkシェルインタラクティブツールを使用してSparkジョブを送信すると、Diverはマスターノードで実行されます。spark-submitツールを使用してジョブを送信するか、「new SparkConf()。setMaster」メソッドを使用してEclipseやIDEAなどの開発プラットフォームでSparkタスクを実行すると、Diverはローカルクライアントで実行されます。

(1)まず、SparkContextはマスターに接続し、マスターに登録してリソースを申請します

(2)Wokerは定期的にハートビート情報をマスターに送信し、エグゼキューターのステータスを報告します

(3)マスターは、SparkContextのリソースアプリケーション要件とワーカーのハートビートサイクルで報告される情報に従って、リソースを割り当てるワーカーを決定し、ワーカーのリソースを取得して、StandloneExecutorBackendを起動します。

(4)StandloneExecutorBackendがSparkContextに登録されます

(5)SparkContextはアプリケーションコードをStandloneExecutorBackendに送信し、SparkContextはアプリケーションコードを解析してDAGグラフを作成し、DAGスケジューラーに送信します。DAGスケジューラーはステージに分解されます(アクション操作が発生すると、ジョブが生成されます。各ジョブには1つ以上のステージが含まれています)、ステージ(またはタスクセット)をタスクスケジューラに送信します。タスクスケジューラはタスクを対応するワーカーに割り当て、最後にStandloneExecutorBackendに送信して実行します。

(6)StandExecutorBackendは、Execcytorスレッドプールを確立し、タスクの実行を開始し、タスクが完了するまでSparkContextに報告します。

(7)すべてのタスクが完了すると、SparkContextはマスターからログオフし、リソースを解放します。

詳細を知りたい場合は、StandaloneSchedulerBackend.startなどの基になるコンパイル済みscalaコードを確認できます。

***
    val appUIAddress = sc.ui.map(_.appUIAddress).getOrElse("")
    val coresPerExecutor = conf.getOption("spark.executor.cores").map(_.toInt)
 
    val initialExecutorLimit =
      if (Utils.isDynamicAllocationEnabled(conf)) {
        Some(0)
      } else {
        None
      }
    val appDesc = new ApplicationDescription(sc.appName, maxCores, sc.executorMemory, command,
      appUIAddress, sc.eventLogDir, sc.eventLogCodec, coresPerExecutor, initialExecutorLimit)
      //创建AppClient
    client = new StandaloneAppClient(sc.env.rpcEnv, masters, appDesc, this, conf)
    //启动AppClient
    client.start()
 ***

この記事では、動作原理の概要を説明します。

2 毛糸に火花を散らす

Spark on YARNモードは、クラスター内のドライバーの位置に応じて2つのモードに分けられます。1つはYARN-クライアントモード(クライアントモード)で、もう1つはYARN-クラスターモード(クラスターモード)です。

YARNの動作モード、起動する必要はありませんスパークので、訪問することは不可能である、独立したクラスタを//マスター:8080でHTTPをこの時間YARNクライアントモードSparkシェルコマンドを開始します

bin / spark-shell --masteryarn-client

また、クラスターを開くとエラーが報告されます。

bin / spark-shell--マスターヤーンクラスター

その理由は、2つの操作手順が異なるためです。

クラスターモードでは、Diverはアプリケーションマスター上で実行され、アロケーションマスタープロセスは、アプリケーションの駆動とYARNからのリソースの申請も担当します。プロセスはYARNコンテナで実行されるため、アプリケーションマスターを起動するクライアントは、アプリケーションのライフサイクルまで続行するのではなく、すぐにシャットダウンできます。

図YARN-クラスターモードの操作プロセス:

(1)クライアントはジョブ情報を生成し、それをResourceManagerに送信します。

(2)ResourceManagerは、NodeManager(YARNによって決定される)でコンテナーを開始し、アプリケーションマスターをNodeManagerに割り当てます。

(3)NodeManagerはResouceManagerからリソースアプリケーションを受け取り、ResouceManagerはリソースを割り当て、他のNodeManagerに対応するエグゼキュータを開始するよう通知します。

(4)アプリケーションは、ResourceManagerのアプリケーションマスターに登録してレポートし、対応するタスクを完了します。

(5)Excutorは、NodeManagerのアプリケーションマスターの主要都市に報告して、対応するタスクを完了します。

図YARNクライアントモードのジョブ実行プロセス:

アプリケーションマスターはYARNからExcutorへのリソースにのみ適用され、クライアントはジョブスケジューリングのためにコンテナーと通信します。

(1)クライアントはジョブ情報を生成し、それをResouceManagerに送信します。

(2)ResouceManagerは、ローカルNodeManagerでコンテナーを起動し、アプリケーションマスターをNodeManagerに割り当てます。

(3)NodeManagerはResourceManagerの割り当てを受け取り、Applicaton Masterを起動し、初期化ジョブを開始します。このとき、このNodeManagerはDriverと呼ばれます。

(4)アプリケーションはリソースのResourceManagerに適用され、ResourceManagerはリソースを割り当て、他のNodeManagerに対応するExcutorを開始するように通知します。

(5)エグゼキュータは、ローカルで起動されたアプリケーションマスターに登録して報告し、対応するタスクを完了します。

2つのモードでのジョブ実行プロセスの観点から。YARN-Clusterモードでは、SparkDriverはアプリケーションマスター(AM)で実行されます。これは、YARNからのリソースの申請に役立ち、ジョブの実行ステータスを監視します。ユーザーがジョブを送信した後、クライアントを閉じて、ジョブを閉じることができます。 YARNで続行します。実行するため、YARN-Clusterモードはインタラクティブジョブの実行には適していません。ただし、YARN-Clientモードでは、AMはYARNにExecutorのみを要求し、クライアントは要求されたコンテナーと通信して作業をスケジュールします。つまり、クライアントは離れることができません。

要約すると、クラスターモードのSpark DriverはAMで実行され、クライアントモードのSparkDiverはクライアントで実行されます。したがって、YARN-Clusterは本番環境に適しており、YARN-Clientは対話とデバッグに適しています。つまり、アプリケーションの出力情報をすばやく確認する必要があります。

3、Sparkコアデータセット

RDD(Resilient Distributed Datasets、Resilient Distributed Datasets)は、Sparkの最も重要な概念です。RDDは、多くの操作インターフェイスを提供するデータセットとして簡単に理解できます。一般的なデータセットとは異なり、実際のデータは分散および保存されます。マシン(メモリまたはディスク内)の場合、ここのパーティションは、HadoopHDFSのファイルと簡単に比較して理解できます。

RDDとは柔軟な分散データセットです。

1.弾力性1:メモリとディスクデータストレージを自動的に切り替えます
。2。弾力性2:系統ベースの高効率フォールトトレランス(n番目のノードに障害が発生し、n-1番目のノードから復元され、系統に障害が発生します-許容範囲);
3 3.弾力性3:タスクは失敗した場合に特定の回数(デフォルトは4回)を自動的に再試行します);
4.弾力性4:ステージが失敗した場合は自動的に特定の回数再試行します(できるのは計算が失敗したステージを実行します);計算に失敗したデータシャーディング;
5。チェックポイントと永続化
6.データスケジューリングの弾力性:DAG TASKはリソース管理とは関係ありません
7.データシャーディングは非常に弾力性があります(手動で自由にシャーディングを設定します)機能)、再パーティション

「myRDD」という名前のRDDデータセットを定義します。このデータセットは複数のパーティションに分割されます。各パーティションは実際には別のマシンに保存される場合もあれば、メモリまたはハードディスク(HDFS)に保存される場合もあります。

RDDにはフォールトトレラントメカニズムがあり、読み取り専用であり、変更することはできません。特定の変換操作を実行して、新しいRDDを作成できます。具体的には、RDDには以下の特性があります。

  • 読み取り専用:変更することはできず、新しいRDDは変換操作によってのみ生成できます。
  • 分散:並列処理のために複数のマシンに分散できます。
  • 復元力:計算プロセス中にメモリが不足している場合、ディスクとデータを交換します。
  • メモリベース:全体または一部をメモリにキャッシュし、複数の計算間で再利用できます。

RDDは本質的に、より一般的な反復並列計算フレームワークです。ユーザーは、制御計算の中間結果を表示し、その後の計算に自由に使用できます。

ビッグデータの実際のアプリケーション開発には、機械学習、グラフアルゴリズムなど、インタラクティブなデータマイニングツールなど、多くの反復アルゴリズムがあります。これらのアプリケーションシナリオに共通しているのは、中間結果が異なる計算ステージ間で再利用されることです。つまり、あるステージの出力結果が次のステージの入力として使用されます。

RDDは、このニーズを満たすように設計されています。MapReduceには、自動フォールトトレランス、負荷分散、およびスケーラビリティの利点がありますが、最大の欠点は、非循環データフローモデルを使用することです。これは、反復計算中に多数のディスクI / O操作を必要とします。

RDDを使用することで、ユーザーは基になるデータの分散性について心配する必要がなくなり、パイプラインを実現するために特定のアプリケーションロジックを一連の変換処理として表現するだけで済みます。これにより、中間結果の保存が回避され、データが大幅に削減されます。レプリケーションとディスクI / Oおよびデータシリアル化のオーバーヘッド。

RDD操作は、変換(変換)操作とアクション(アクション)操作に分けられます。変換操作はRDDから新しいRDDを生成することであり、アクション操作は実際の計算を実行することです。

1.ビルド操作

Sparkでの計算はすべてRDDを操作することによって行われます。RDDを学習する際の最初の問題は、RDDを構築する方法です。RDDを構築する方法は、データソースの観点から次の2つのカテゴリに分けられます。

メモリから直接データを読み取ります。
ファイルシステムからデータを読み取るには、多くの種類のファイルシステムがあり、一般的なものはHDFSとローカルファイルシステムです。
最初の方法は、メモリからRDDを構築することです。これには、makeRDDメソッドを使用する必要があります。コードを以下に示します。

val rdd01 = sc.makeRDD(List(l、2,3,4,5,6))

このステートメントは、6つの要素「1,2,3,4,5,6」で構成されるRDDを作成します。

2番目の方法は、ファイルシステムを介してRDDを構築することです。コードを以下に示します。

val rdd:RDD [String] == sc.textFile(“ file:/// D:/sparkdata.txt”、1)

この例ではローカルファイルシステムを使用しているため、ファイルパスプロトコルプレフィックスはfile://です。
2.変換操作

RDDの変換操作は、新しいRDDを返す操作です。変換されたRDDは遅延評価され、これらのRDDがアクション操作で使用された場合にのみ計算されます。

多くの変換操作は要素ごとに行われます。つまり、これらの変換操作は一度にRDD内の1つの要素に対してのみ操作されますが、すべての変換操作がこのようになるわけではありません。

 RDD変換操作(rdd1 = {1、2、3、3}、rdd2 = {3,4,5})

3.アクション

アクション操作は、計算を実行し、指定された方法で結果を出力するために使用されます。アクション操作はRDDを受け入れますが、非RDDを返します。つまり、値または結果を出力します。RDDの実行中、実際の計算はアクション操作で行われます。表2に、一般的に使用されるRDDアクションを示します。

RDDアクション操作(rdd = {1,2,3,3})

RDDの操作は怠惰です。RDDが変換操作を実行すると、実際の計算は実行されません。RDDがアクション操作を実行した場合にのみ、計算タスクの送信がトリガーされ、対応する計算操作が実行されます。

RDDの機能

  • これは、クラスターノード上の不変のパーティション化されたコレクションオブジェクトです。
  • マップフィルター結合など)を作成するための並列変換を介して;
  • 失敗すると自動的に再構築します。
  • 再利用のためにストレージレベル(メモリ、ディスクなど)を制御できます。
  • シリアル化可能である必要があります。
  • RDDは、永続ストレージから、または変換操作を介してのみ生成できます。分散共有メモリ(DSM と比較して、フォールトトレランスをより効率的に実現できます。失われたデータパーティションの場合、特定の必要なしに、その系統基づいて再計算するだけで済みますチェックポイント;
  • 機能分割データRDDはどの、データの局所性を介して性能を向上させることができると同じでのHadoopのMapReduce
  • RDDはシリアル化可能であり、メモリが不足している場合は自動的にディスクストレージにダウングレードでき、RDDはディスクに保存されます。現時点では、パフォーマンスは大幅に低下しますが、現在のMapReduceより悪くなることはありません

 


見る:

Spark RDDとは何ですか?

SparkRDDの復元力

Sparkのスケジューラー(SchedulerBackend)の通信端末を入手するための1つの記事

Spark 2.1 Core(6)の詳細な理解:スタンドアロンモードの動作原理とソースコード分析

コンピュータのメモリとディスクの関係

Sparkの過去と現在

Sparkとそのエコシステムの紹介

Sparkの基本的なアーキテクチャと動作原理

 

おすすめ

転載: blog.csdn.net/master_hunter/article/details/114895846