序文
ほとんどの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つの利点があります。
- マルチスレッドを使用して特定のタスクを実行し、タスクの起動オーバーヘッドを削減します。
- 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のスケジューラー(SchedulerBackend)の通信端末を入手するための1つの記事
Spark 2.1 Core(6)の詳細な理解:スタンドアロンモードの動作原理とソースコード分析