0.質問の概要
第二に、Sparkのコア原則
2.スパークの動作原理
1、Spark 总体架构?
- 追问1:SparkContext作用
2、Spark内存模型
……
2、Spark程序的运行流程(*3)
- 追问1:关于分配资源,即作业调度,能不能再细说下?
- 追问2:DAGscheduler干了什么活?(*2)
- 追问3:Job、Task、Stage分别说下?
- 追问4:特别大的数据,怎么发送到excutor中?
- 追问5:Hadoop中job和Tasks的区别是什么?
3、宽依赖和窄依赖(*4)概念
- 追问1:哪些算子会导致宽依赖,哪些会导致窄依赖?(*3)
4、Spark中如何划分Stage?(*2)
- 追问1:划分Stage依据是什么?(*2)
- 追问2:Spark判断Shuffle的依据?
5、Spark shuffle过程是什么,shuffle的概念?
6、Spark 运行模式?(x3)其中哪几种是集群模式?
7、Spark on Yarn作业执行流程?(在集群中怎么执行程序?)
- 追问1:Yarn-Client和Yarn-Cluster有什么区别?
- 追求2:如果有聚合操作呢?
8、Spark中广播变量是什么,作用?
- 追问1:共享变量和累加器是什么?
第二に、Sparkのコア原則
2.スパークコアの原則
1. Sparkの全体的な構造は?
回答:
モジュール | 前書き | 効果 |
---|---|---|
運転者 | 各アプリケーションタスク制御ノード | Sparkアプリケーションのmain()関数を実行して、SparkContextを作成します。 |
SparkContext | アプリケーションの入り口、クラスター全体と対話する | RDDの作成など、リソースアプリケーション、タスクの割り当て、および監視のためにClusterManagerと通信します。(* 2) |
クラスターマネージャー | クラスターリソースマネージャー | ワーカーノードでの実行に必要なリソースを申請して管理します。 |
ワーカーノード | 作業ノード | アプリケーションには、ジョブタスクを実行する複数のワークノードを含めることができます。 |
エグゼキュータ | ワーカーノードの実行プロセス | データをメモリ/ディスクに保存するタスクを実行します。 |
仕事 | 仕事 | エグゼキュータプロセスのワークユニットでは、複数のタスクがステージを形成します。 |
2. Sparkプログラムの実行プロセス(* 3)
- 動作環境を構築します。SparkContextは、リソースアプリケーション、タスクの割り当て、および監視のためにドライバーによって作成されます。
- リソースを割り当てます。リソースマネージャー(スタンドアロン/ Mesos / YARN)はリソースを割り当て、Executorのプロセスを開始します。
- ステージを分解し、タスクに適用します。SparkContextは、ステージに分解されるDAGグラフを作成し、TaskSetをTaskSchedulerに送信します。ExecutorはSparkContextからタスクを申請し、TaskScheduleは実行するタスクをExecutorに発行します。
- 実行してログオフします。タスクはExecutorで実行され、実行結果はTaskSchedulerとDAGSchedulerにフィードバックされ、実行後にすべてのリソースが解放されます。
フォローアップ1:リソースの割り当て、つまりジョブのスケジューリングについて詳しく教えてください。
- 1)DAGSchedulerは、各RDD間の変換依存関係を分析してDAGを取得します。
- 2)DAGを使用してジョブを複数の段階に分割します。
- 3)各ステージはTaskSetを生成し、それをTaskSchedulerに送信し、スケジューリング能力はTaskSchedulerに転送されます。TaskSchedulerは、実行のためにタスクをワーカーに分散します。
フォローアップ2:DAGschedulerは何をしましたか?(* 2)
ジョブに基づいてステージベースのDAG(RDD間の依存関係)を構築し、ステージをTaskSchedulerに送信します。
フォローアップ3:ジョブ、タスク、ステージを別々にどうしますか?(* 2)
名前 | 特徴 |
---|---|
ジョブ | アクション演算子によってトリガーされる、複数のタスクで構成される並列計算ステージ |
ステージ | 各ジョブは、Stageという名前のTaskSet(小さなコンピューティングタスクグループ)として複数のタスクに分割されます |
仕事 | エグゼキュータのコンピューティングユニット、複数のタスクがステージを形成します |
1 App = n Job
1 Job = n Stage = n TaskSet
1 Stage = n Task
1 App = n1 job = n1*n2 Stage = n1*n2*n3 Task
フォローアップ4:非常に大きなデータをexcutorに送信する方法は?
……
フォローアップ5:Hadoopのジョブとタスクの違いは何ですか?
回答:ジョブは、完全なMapReduceプログラムの抽象的なカプセル化です。タスクは、ジョブの実行中の各処理ステージの特定のインスタンスです。たとえば、map task、reduce task、maptask、reduce taskでは、複数のインスタンスが同時に実行されます。
3.広い依存と狭い依存の概念(* 6)
回答:変換操作はRDD依存関係を形成します.1つの親RDDノードは、ナロー依存関係と呼ばれる子RDDの最大1つのパーティションでのみ使用でき、ワイド依存関係と呼ばれる複数の子RDDで使用できます。
说明: n > 1
窄依赖:n 父RDD == 1 子RDD
宽依赖:1 父RDD == n 子RDD
-
狭い依存関係には2つのタイプがあります
-
1)1対1; 2)ユニオンなどの多対1
-
幅広い依存関係の説明:親RDDの各パーティションは、複数の子RDDパーティションによって使用される場合があり、子RDDパーティションは通常、親RDDのすべてのパーティションに対応します。
フォローアップ1:どの演算子が広い依存につながり、どの演算子が狭い依存につながるか?(* 3)
- 窄依赖:map、filter、union
- 宽依赖:groupbykey、sortByKey [会产生Shuffle过程]
- 看情况:If(分区器 == HashPartitioner), then (join、reduceByKey、join)为窄依赖。
说明:
- 默认两种划分器:HashPartitioner和RangePartitioner,当分区器HashPartitioner时就是窄依赖。
答:同一个key进去,通过HashPartitioner得到的分区id是一样的,计算前后同一个key得到的分区都一样,
父RDD的分区就只被子RDD的一个分区依赖,就不需要移动数据。所以是窄依赖。
4. Sparkでステージを分割する方法は?(* 2)
最後に実行されたRDDから先に進み、幅広い依存関係に遭遇したときにステージをカットします。
フォローアップ1:ステージを分割するための基礎は何ですか?(* 2)
回答:RDD間の依存関係を通じて、オーバーヘッドが最小のスケジューリング方法を見つけてください。
フォローアップ2:Sparkはシャッフルをどのように判断しますか?
回答:親RDDの1つのパーティションのデータは、子RDDの複数のパーティションに分散される場合があります。シャッフル書き込みおよびシャッフル読み取り操作があります。
5. Sparkシャッフルプロセスとシャッフルの概念は何ですか?
MapReduceシャッフル—ハッシュシャッフルV1:
MRでは、シャッフルはMapとReduceを接続します。この段階で、ディスクの読み取りと書き込み、およびネットワーク送信が設計され、プログラム全体のパフォーマンスとスループットに影響します。
重大な問題:
1。多数のファイルが生成され、メモリが消費され、IO操作が非効率的です。
2. [タスクの削減]マージ操作は、HashMapのデータをマージします。これにより、OOMが発生する可能性があります。
Spark Shuffle-Hash Shuffle V2:
最初の問題に対応して、ファイル統合メカニズムが導入されました。エグゼキューター上のすべてのマップタスクによって生成されるパーティションファイルは1つだけです。つまり、同じマップタスクのすべてのパーティションファイルがマージされます。このようにして、各エグゼキュータは最大N個のパーティションファイルを生成できます。
問題:これによりファイルの数は減りますが、ダウンストリームステージパーティションの数Nが多く、各エグゼキューターでNファイルが生成されます。同様に、1つのエグゼキューターにKコアがある場合でも、K * Nライターが存在します。 。ハンドラー、ここでOOMを発生させるのは簡単です。
Spark Sort Shuffle V1:
上記の問題を解決するために、SparkはMRのシャッフル処理方法を参照し、ソートに基づくシャッフル書き込み操作メカニズムを導入しています。
各タスクは、後続のタスクごとに個別のファイルを作成するのではなく、すべての結果を同じファイルに書き込みます。ファイルは最初にパーティションIDに従って並べ替えられ、各パーティションはキーに従って並べ替えられます。マップタスク操作。パーティションデータごとに、各パーティションのサイズとオフセットを記録するためのインデックスファイルも生成されます。
削減フェーズでは、削減タスクは、CombineのデータをプルするときにHashMapを使用せず、ExternalAppendOnlyMapを使用します。このデータ構造をCombineに使用すると、メモリが不足している場合、ディスクがフラッシュされます。これにより、堅牢性が大幅に保証され、ほとんどが回避されます。状況。OOM。
外観:並べ替えシャッフルはハッシュシャッフルのすべての欠点を解決しますが、シャッフルプロセスではレコードを並べ替える必要があるため、パフォーマンスが低下します。
タングステン-ソートベースのシャッフル/安全でないシャッフル:
Spark 1.5.0は、メモリとCPUの使用を最適化するためのタングステン計画を開始しました。JDK Sun Unsafe APIに基づくオフヒープメモリを使用しているため、UnsafeShuffleとも呼ばれます。
アプローチは、データレコードをバイナリ形式で保存し、Javaオブジェクトの代わりにシリアル化されたバイナリデータを直接並べ替えることです。一方で、メモリ使用量とGCオーバーヘッドを削減でき、他方で、頻繁なシリアル化を回避できます。シャッフルプロセスでの逆シリアル化。キャッシュ効率の高いソーターは、ソートプロセス中に提供されます。これは、8バイトのポインターを使用して、ソートをポインターデータのソートに変換します。これにより、ソートのパフォーマンスが大幅に最適化されます。
問題:Tungsten-Sort Based Shuffleの使用は集計操作を行うことができず、パーティションの数は特定のサイズを超えることができないため、reduceByKeyなどの集計演算子はTungsten-Sort Based Shuffleを使用できず、SortShuffleを使用するように縮退します。
SortShuffleWriterの実装の詳細については、
最初に問題を検討できます。100億個のデータがあり、メモリが100万個しかないが、ディスクが非常に大きい場合、これらの100億個のデータを今すぐソートする必要があります。すべてのデータをソートすることは不可能1回のロードで外部ソーティングの問題を伴うメモリソートを実行します。1Mメモリは1億個のデータしか保持できず、これらの1億個のデータのみを毎回ソートできます。ディスクに出力し、合計100個のファイルを出力し、最後にこれらの100個のファイルをグローバルに順序付けられた大きなファイルにマージする方法を示します。ヘッダーデータの一部を各ファイルのバッファーとして(順序付けて)取得し、これらの100個のバッファーをヒープに配置してヒープソートを行うことができます。比較方法は、すべてのヒープ要素のヘッド要素を実行することです(バッファー)サイズを比較します。次に、各ヒープの先頭にあるバッファのhead要素を継続的にポップアウトして最終ファイルに出力し、ヒープソートを続行して出力を続行します。いずれかのバッファが空の場合は、対応するファイルに移動して、データの一部を追加し続けます。最終的に、グローバルに順序付けられた大きなファイルを取得します。
集計方法:
シャッフル書き込み:前のステージの各マップタスクは、処理中の現在のパーティション内のデータの同じキーがパーティションファイルに書き込まれることを確認する必要があり、複数の異なるパーティションファイルに書き込まれる場合があります。
シャッフル読み取り:reduceタスクは、前のステージのすべてのタスクが配置されているマシンから独自のパーティションファイルを検索し、各キーに対応する値が処理と集約のために同じノードに収集されるようにします。
Sparkには、HashShuffleManagerとSortShuffleManagerの2種類のシャッフル管理があります。Spark1.2以前はHashShuffleManagerでした。Spark1.2ではSortShuffleManagerが導入されました。HashShuffleManagerはSpark2.0 +で破棄されました。
並べ替えシャッフルV2
Spark-1.6.0は、ソートシャッフルとタングステンソートベースのシャッフルをソートシャッフルに統合します。タングステンソートベースのシャッフル条件が満たされていることが検出されると、タングステンソートベースのシャッフルが自動的に使用されます。それ以外の場合は、ソートシャッフルが使用されます。
Spark-2.0.0はハッシュシャッフルを削除します。現在、Spark-2.0にはソートシャッフルという1つのシャッフルしかありません。
6.スパーク動作モード?(X3)これらのどれがクラスターモードですか?
- 1)ローカル:スタンドアロン操作。通常、開発とテストに使用されます。
- 2)スタンドアロン:マスター+スレーブで構成されるSparkクラスターを構築すると、Sparkはクラスター内で実行されます。
- 3)Spark on Yarn:Sparkの顧客は、Sparkクラスターを構築する必要なしにYarnに直接接続します。
- 4)Spark on Mesos:SparkクライアントはMesosに直接接続し、追加のSparkクラスターを構築する必要はありません。
その中で、スタンドアロン、Spark on Yarn、およびSpark onMesosモードはクラスターモードです。
7. Spark on Yarnジョブの実行プロセスは何ですか?(クラスター内でプログラムを実行する方法は?)
7.1はじめに
Yarnは、統合されたリソース管理を担当し、MapReduceやStormなどの複数のコンピューティングフレームワークを実行できます。Sparkは、履歴またはパフォーマンスの考慮事項に基づいてSpark on Yarn操作モードを開発しました。Yarnの柔軟なリソース管理メカニズムにより、アプリケーションのデプロイがより便利になり、アプリケーションリソースが完全に分離されます。
Spark on Yarnは、クラスター内のドライバーの場所に応じて、Yarn-ClientモードとYarn-Cluster(Yarn-Standaloneモードとも呼ばれます)に分けられます。
7.2ヤーンクライアント
このモードでは、ドライバーはクライアント上でローカルに実行され、Sparkアプリケーションはクライアントと対話します。Driverはクライアント側にあるため、ドライバーのステータスにはWebUIを介してアクセスできます。デフォルトはhttp:// xxx:4040で、Yarnはhttp:// xxx:8088からアクセスします。
ワークフロー:
-
Spark YarnクライアントはResourceManagerに適用して、アプリケーションマスターを起動します。同時に、DAGSchedulerとTASKSchedulerがSparkContextの初期化で作成されます。(Yarn-Clientモードでは、プログラムはYarnClientClusterSchedulerとYarnClientSchedulerBackendを選択します)
-
ResourceManagerはリクエストを受信すると、NodeManagerを選択し、最初のコンテナをアプリケーションに割り当ててから、ApplicationMasterを起動します。(VS YARN-Clusterの違いは、ApplicationMasterがSparkContextを実行せず、リソース割り当てのためにSparkContextとのみ通信することです)
-
クライアントのSparkContextが初期化された後、ApplicationMasterとの通信を確立し、ResourceManagerに登録し、タスク情報に基づいてリソース(コンテナー)を申請します。
-
ApplicationMasterがリソース(コンテナー)を申請すると、対応するNodeManagerと通信し、取得したコンテナーでCoarseGrainedExecutorBackendを開始する必要があります。CoarseGrainedExecutorBackendが開始されると、クライアントのSparkContextに登録され、タスクに申請されます。 ;
-
クライアントのSparkContextはタスクをCoarseGrainedExecutorBackendに割り当てて実行し、CoarseGrainedExecutorBackendはタスクを実行して実行ステータスをドライバーに報告します。これにより、クライアントは実行情報を把握し、タスクが失敗したときにタスクを再開できます。
-
アプリケーションの実行が終了すると、クライアントのSparkContextがResourceManagerに適用され、ログアウトして自身を閉じます。
7.3ヤーンクラスター
このモードでは、YARNはアプリケーションを次の2つの段階で実行します。
- 1.最初にYARNクラスターでApplicationMasterとしてSparkのドライバーを起動します。
- 2. ApplicationMasterはアプリケーションを作成し、ResourceManagerからリソースを申請し、Executorを起動してタスクを実行し、実行が完了するまで実行中のプロセス全体を監視します。
ワークフロー:
-
Spark Yarn Clientは、ApplicationMasterプログラムとその起動コマンド、Executorで実行されているプログラムなどを含むアプリケーションをYARNに送信します。
-
ResourceManagerはリクエストを受信すると、クラスター内のNodeManagerを選択して最初のコンテナーを割り当て、このコンテナー内のアプリケーションのApplicationMasterを開始するように要求します。ここで、ApplicationMasterはSparkContextの初期化などを実行します。
-
ApplicationMasterはResourceManagerに登録して、ユーザーがResourceManageを介してアプリケーションの実行ステータスを直接表示できるようにします。その後、ポーリング方式でRPCプロトコルを介して各タスクのリソースを申請し、実行ステータスを最後まで監視します。
-
ApplicationMasterがリソース(Container)を申請すると、対応するNodeManagerと通信し、CoarseGrainedExecutorBackendをContainerで開始する必要があります。また、ApplicationMasterのSparkContextに登録し、起動後にタスクを申請します。
(SparkContextがSparkアプリケーションで初期化される場合、CoarseGrainedSchedulerBackendがタスクスケジューリングのためにYarnClusterSchedulerと組み合わせて使用されることを除いてスタンドアロンモードと同じです。YarnClusterSchedulerはTaskSchedulerImplの単純なパッケージであり、Executorなどの待機ロジックが追加されます。) -
ApplicationMasterのSparkContextは、タスクをCoarseGrainedExecutorBackendに割り当てて実行します。CoarseGrainedExecutorBackendはタスクを実行し、実行ステータスと進行状況をApplicationMasterに報告します。これにより、ApplicationMasterはいつでも各タスクの実行ステータスを把握できるため、タスクを再開できます。タスクは失敗します。
-
アプリケーションの実行後、ApplicationMasterはResourceManagerに適用してログアウトし、自身をシャットダウンします。
追求1:Yarn-ClientとYarn-Clusterの違いは何ですか?集計操作がある場合はどうなりますか?
ApplicationMasterの概要:YARNでは、各ApplicationインスタンスにApplicationMasterプロセスがあります。ApplicationMasterプロセスは、アプリケーションによって開始される最初のコンテナーであり、ResourceManagerとの対話とリソースの要求を担当します。リソースを取得した後、NodeManagerにコンテナーを開始するように指示します。
YARN-クラスターとYARN-クライアントモードの違い-> ApplicationMasterプロセスの違い:
- 1)YARN-Clientモードでは、アプリケーションマスターはYARNにExecutorのみを要求し、クライアントは要求されたコンテナーと通信して作業をスケジュールします。つまり、クライアントは離れることができません。
- 2)YARN-Clusterモードでは、ドライバーはAM(アプリケーションマスター)で実行され、YARNからのリソースの申請と、ジョブの実行ステータスの監視を担当します。ユーザーがジョブを送信した後、クライアントをオフにすることができ、ジョブはYARNで引き続き実行されます。したがって、YARN-Clusterモードは対話型ジョブの実行には適していません。
追求2:集計操作がある場合はどうなりますか?
……
8. Sparkのブロードキャスト変数とその機能は何ですか?
ブロードキャスト変数は、各タスクのコピーをコピーする代わりに、一部の共有データまたは大きな変数をSparkクラスターにキャッシュできます。後続の計算を再利用して、ネットワーク送信を減らし、パフォーマンスを向上させることができます。
补充:
1、广播变量只读,保证数据一致性。
2、相比Hadoop分布式缓存,广播内存可以跨作业共享。
フォローアップ1:アキュムレータとは何ですか?
アキュムレータはグローバルな要約を実行でき、分散カウントの機能を備えています。
注意:只有Driver能取到累加器值,Task端是累加操作。
3、参照
1. (答え)2020ビッグデータのインタビューの質問のための実際の質問の概要
2.スパーク全体的なアーキテクチャおよび実行中のプロセス
3.スパーク実行中のプロセス
4.スパーク・ノート(7)-Sparkは、プロセスを実行している
5.理解の仕事、段階、およびタスクをスパークにおける
前記ステージ分割スパークジョブスケジューリング
7、スパークステージ分割単位:ステージスケジューリングアルゴリズム
で火花8、スパークソースコード読み取り:DAGSchedulerステージ分割およびタスク最適位置算出
9、スパークシャッフル詳細な説明
10、スパークシャッフルの完全な理解プロセス(シャッフル書き込み)
11.スパークシャッフルの基本
12、スパークの4つの動作モード
13、スパーク(5)スパークタスクの提出方法と実行プロセス
14、理解スパークメモリモデルSQLタスクから
15、スパークで放送変数の詳細な説明とどのようにブロードキャスト変数
16を動的に更新するには、Sparkラーニングロード(4)Sparkのブロードキャスト変数とアキュムレータ
16。Spark共有変数のアキュムレータ