0シャッフル概要
何シャッフルを理解するために、ビッグデータを紹介し、配布しました。私たちは、データが大規模な分散ストレージに格納されていることを知って、ビッグデータ・コンピューティング・フレームワークは、分散コンピューティングフレームワークです。インタラクティブなデータ伝送が配布されなければ、短いシャッフルは、インタラクティブなデータ送信処理に分布しています。
以下に示すように、出力データがブロックに書き込まれたステージ0シャッフルライターを通過することです、ステージ1は、ブロックから読み込まれた入力データを必要と、書き込み処理は、この中間結果がそのシャッフル後で読み込みます。
図1
データのステージ0は、直接、ステージ1の処理に引き渡さできない理由そこで問題は、シャッフルはそれのプロセスを通過する必要がありますか?
:ここでは、分割ステージで始まり、RDDのステージ部門によると、幅、幅依存分割での参考品に依存しているhttps://www.cnblogs.com/beichenroot/p/11414173.html
RDDの幅に依存して存在するため、スパーク約天然属性、分散コンピューティングエンジンをスパーク、RDD弾性分散データセットは、スパーク論理ユニット処理データです。RDDデータストレージを以下に示す:図RDDデータは、3つの異なるノードキュータパーティション(パーティション)に格納され、パーティションは、ブロックA、ブロックの異なるプレゼンテーションは、3つの異なるノード、パーティションに対応することが理解されるであろう一緒にRDDにパーティションを形成します。
トピックに戻る、依存が狭い場合、異なるノードで並列に計算を分散プレゼンスデータRDD異なるノードが、即ち、パーティション間でサブエリア動作におけるデータを、データを交換する必要がないため、幅が依存している場合読み取りと書き込み、他のパーティションにデータ送信の必要性を、データが必然的に生成され、そこにシャッフル。
1.の重要性をシャッフル
図1Shuffleプロセス、三つの部分を含むシャッフル処理から見ました:
1. Wiiterをシャッフル
2.ネットワーク伝送
3.シャッフル的読みます
この3部構成の操作は、Sparkアプリケーションの効率のほとんどに影響を与え、メモリ操作、ディスクI / O、ネットワークI / Oの管理とJVMが含まれています。良いコードのために、パフォーマンス(95%)のほとんどは、ローカルディスクのファイルシャッフル書き込み段階で消費データ伝送ネットワークとデータをフェッチしています。だから、シャッフルのための最適化プロセスの多くを行って火花。
2.スパークシャッフルの開発プロセス
初期のシャッフルはHashShuffleを使用してスパーク、最大の問題はHashShuffleの数(断片のマッパー番号は*リデューサーのフラグメントの数)であるIOメモリの消費量とGCの莫大な負担の多数の結果、あまりにも多くのファイルが生成され、。
以下に示すように、SortedBasedShuffleは、ファイルの数に応じて作業マップを使用してスパーク発生、各タスクのための2つのマップファイルを生成し、データファイルがフラグメントに書き込まれ、ファイルオフセットは、スライス毎に記録されています関連情報。タスクが最初にデータを読み取るために、データを読み込む際に、ファイル内のオフセットから、データファイルを位置データを取得減らします。SortedBasedShuffleは、*シャッフル2のタスクの数に地図ファイルの数を減らし、次のような最適化をもたらすでしょう。
1.マッパーの終わりには、小さなメモリフットプリントになり
2.大規模データスパークを処理する能力を高めるために(並列にタスクの数を増加させます)
3.減速終了時刻少ないデータをフェッチ
4.ハンドルネットワークチャネルが少なくなります
データ自体が減少し、メモリの消費量であります
シャッフルの詳細はテキストを参照することがスパーク:https://www.cnblogs.com/itboys/p/9226479.html
3.モジュールとストレージの間の相互作用をシャッフル
スパーク記憶モジュールは、記憶に抽象化され、管理ブロック(ブロック)を担うデータ・ストレージ・システムを表すストレージスパークは、ブロックはRDDパーティションに相当するデータにアクセスするための最小単位です。
ストレージ抽象モジュールは、次の2つのレベルに分かれています。
1.通信層:マスタとスレーブとの間の主な構造からの典型的な通信層情報、および伝送制御状態です。主にBlockManager、BlockManagerMaster、BlockManagerMasterEndPoint、BlockManagerSlaverEndPoint他のカテゴリによる通信層。
前記メモリ層:それは磁気又はヒープメモリ外部メモリに格納されたデータを担当して、時々、リモートノード上のデータのコピーを必要とします。スパーク実装クラスやストレージ層はDiskStore MemoryStoreを持っています。
データの物質は、読み取り及び書き込みプロセスシャッフルBlockManagerインタフェースを操作することによって達成されます。
3.1 BlockManagerアーキテクチャ
1.アプリケーションは起動時にSparkEnvにBlockManagerMasterとMapOutputTrackerを登録されます
。BlockManagerMaster:ブロックデータは、クラスタ全体を管理します
。B MapOutputTracker:すべてのマッパー出力を追跡
2. BlockManagerMaster BlockManagerMasterEndPointを構築するために作成した、BlockManagerMasterEndPoint自体は、遠隔通信によりBlockManagerにすべてのノードを管理する責任がメッセージ本体です。
3. ExecutorBackend、BlockManagerが遠隔通信BlockManagerMasterによってインスタンス化され、登録されて開始されなかった。エグゼキュータは、実質的にレジスタにBlockManager所与BlockManagerMasterEndPointにドライバを起動したとき。
4. MemoryStore BlockManagerクラスは、読み取りおよび書き込みデータとメモリを格納するための責任があります。
5. BlockManager責任ディスクデータストレージクラスを読み書きDiskStore。
6. DiskBlockManager:ディスクのディスク・ファイル上の論理ブロック管理と物理ブロックとの間のマッピングと、読み書きを作成する責任があります。
3.2シャッフルBlockManagerはとの対話します
3.2.1シャッフル書き込みデータ
シャッフルソートBypassMergeSortShuffleHandleとBaseShuffleHandle、ShuffleHandleクラスBypassMergeSortShuffleWriterとSortShuffleWriter、ここで例えばSortShuffleWriter櫛に対応する書き込みデータの2種類を含むベースShuffleHandleを実施しました。
次の書き込み方法によって達成されるデータを書き込むSortShuffleWriter、我々は最初のShuffleBlockResolverでデータファイルを取得する必要があります。
/ **このタスクの出力にレコードの束を書く* / 上書きデフ書き込み(記録:イテレータ[Product2 [K、V]]):単位は= { ... //マージ開くための時間を含む気にしないでくださいシャッフル書き込み時間の出力ファイル、 //それだけで1つのファイルを開くので、その一般的に正確に測定するにはあまりにも速いです //(SPARK-3570を参照してください)。 ヴァル出力= shuffleBlockResolver.getDataFile(dep.shuffleId、mapId) ... ヴァルTMP = Utils.tempFileWith(出力) してみてください{ ヴァルBLOCKID = ShuffleBlockId(dep.shuffleId、mapId、IndexShuffleBlockResolver.NOOP_REDUCE_ID) ヴァルpartitionLengths = sorter.writePartitionedFile(BLOCKID 、TMP)
shuffleBlockResolver.writeIndexFileAndCommit(dep.shuffleId、mapId、partitionLengths、TMP)
あなたが実際にblockManagerによって取得されたデータを見ることができますIndexShuffleBlockResolver、の詳細なコールgetDataFile方法ShuffleBlockResolverサブクラス。
DEF getDataFile(shuffleId:INT、mapId:INT):ファイル= { blockManager.diskBlockManager.getFile(ShuffleDataBlockId(shuffleId、mapId、NOOP_REDUCE_ID)) }
その後ShuffleBlockId、データwritePartitionedFile ExternalSorter方法の最後の書き込みが発生します。writePartitionedFileコールの物質は、書き込み方法blockManagerのままです。だから、Shffleは、基礎となるデータがblockManagerによって実現される書き込み。
DEF writePartitionedFile( BLOCKID:BLOCKID、 OUTPUTFILE:ファイル):配列[ロング] = { //出力ファイル内の各範囲のトラック位置 ヴァル長=新しい配列[ロング](numPartitions) ヴァルライター= blockManager.getDiskWriter(BLOCKID、OUTPUTFILE 、serInstance、fileBufferSize、 context.taskMetrics()。shuffleWriteMetrics)
3.2。シャッフルは、データを読み取ります
シャッフルgetReaderのデータリーダSortShuffleManagerから取得されたデータを読み取り、getReader方法はBlockStoreShuffleReaderインスタンスを作成します。、
BlockStoreShuffleReader最初の読み出し方法は、ShuffleBlockFetcherIteratorをインスタンス化します。読み、メモリとディスクの管理blockManager ShuffleBlockFetcherIterator体上にデータを書き込みます。
* ShuffleBlockFetcherIteratorランダムにキューへのリモート要求にローカルおよびリモートsplitLocalRemoteBlocks分割ブロック、Utils.randomize(remoteRequests)は、遠隔送信要求取得ブロック、ローカルブロック取得fetchLocalBlocksをfetchUpToMaxBytes。