MapReduceのビッグデータに関する一般的なインタビューの質問

記事ディレクトリ

1. MapReduceの実行プロセス

MRの全体的な実行プロセス:(糸モード)

  • 1.対応するファイルを、MapReduceプログラムがファイルを読み取る入力ディレクトリに保存します。
  • 2.クライアントプログラムは、submit()メソッドが実行される前に処理されるデータ情報を取得し、クラスター内のパラメーターの構成に従ってタスク割り当て計画を作成します。
  • 3.クライアントがYarnにスライス情報を送信し、Yarnのリソースマネージャーが起動します。
  • 4. MRAPPmasterが開始された後、ジョブの説明情報に従って、必要なmaptaskインスタンスオブジェクトを計算し、クラスターに適用して、対応する数のmaptaskプロセスを開始します。
  • 5. Maptaskは、クライアントが指定した入力形式を使用してデータを読み取り、出力KVキーと値のペアを形成します。
  • 6. maptaskは、論理演算用に顧客が定義したmap()メソッドに入力KVキーと値のペアを渡します。
  • 7. Map()メソッドが完了すると、KVペアがmaptaskキャッシュに収集されます。
  • 8.シャッフルステージ
    •1)maptaskは、map()メソッドによって出力されたKVペアを収集し、それらをリングバッファーに入れます。
    •2)maptaskのKVペアはkパーティションに従ってソートされ、複数のファイルをオーバーフローする可能性があるローカルディスクファイルに継続的に書き込まれます。
    •3)複数のファイルが大きなオーバーフローファイルにマージされます。
    •4)オーバーフロー書き込みプロセスとマージプロセスの間、パーティション化とキーの並べ替え操作が継続的に実行されます。
    •5)Reducetaskは、パーティション番号に従って、各maptaskマシン上の対応する結果パーティションデータを取得します。
    •6)reducetaskは同じパーティション内の異なるmaptasksから結果ファイルをフェッチし、reducetaskはこれらのファイルを再度マージしてソートします。
    •7)大きなファイルにマージした後、シャッフルプロセスが終了し、reducemaskの論理演算プロセスに入ります(ファイルからキーと値のペアグループを1つずつ取り出し、ユーザー定義のreduce()メソッドを呼び出します)。
  • 9. MRAPPmasterは、すべてのmaptaskプロセスタスクの完了を監視した後、お客様が指定したパラメーターに従って対応する数のreducetaskプロセスを開始し、reducetaskプロセスに処理するデータパーティションを通知します。
  • 10. reducetaskプロセスが開始された後、MRAPPmasterから通知された処理対象データの場所に応じて、maptaskが実行されているマシンから複数のmaptask出力結果ファイルが取得され、ローカルで再マージおよびソートされ、同じキーのKVに従ってグループが作成されます。 、お客様が定義したreduce()メソッドを呼び出して、論理演算を実行します。
  • 11. reducetaskの計算が完了したら、お客様が指定したoutputformatを呼び出して、結果データを外部に出力します。

2. MapReduceは作成されていますか?主要なカテゴリは何ですか?マッパーメソッドとは何ですか?セットアップ方法は何をしますか?データの行が読み取られるたびにこのメソッドを呼び出しますか?

1.主要なカテゴリ

•GenericOptionParserは、Hadoopフレームワークのコマンドラインパラメーターを解析するためのツールクラスです。
•InputFormatインターフェイス。その実装クラスには、Fileinputfotmat、Composable inputformatなどが含まれ、主にファイルの入力とカットに使用されます。
•マッパーは、入力kvペアを一連の中間データkvペアにマップします。マップは入力レコードを中間レコードに変換します。
•レデューサーは、キーに従って、中間データセットの処理をより小さいデータ結果セットに結合します。
•Partitionerは、キーに従ってデータを分割します。
•OutputCollectorファイルの出力。
•コンバイナローカル集約、ローカライズされた削減。

2.マッパーのメソッドは、セットアップ、マップ、クリーンアップ、実行です

•セットアップメソッドは、マッパーライフサイクル内のリソースを管理し、初期作業を読み込み、各ジョブを1回実行するために使用され、マッパーの構築が完了する前にセットアップが実行され、マップアクションが実行されます。
•mapメソッド、メインロジックの書き込みメソッド。
•クリーンアップメソッドは主に、ファイルのクローズやmap()の実行後のキー値の配布などの最終作業を行います。各ジョブは1回実行されます。これは、グローバル最大値の計算などのタスクにより適しています。
•runメソッドは、上記のすべてのプロセスを実行します。最初にsetupメソッドを呼び出し、次にmap()メソッドを実行し、最後にcleanupメソッドを実行します。

3. 1つの命令ですべてのファイルを同じパーティションにシャッフルする必要があるという要件がありますが、MapReduceを使用する場合は、どのように書きますか?

  • ドライバードライバークラスのリデューサーの数を設定します。job.setNumReduceTask(1)は1です。

4. Hadoopシャッフルの原理(より詳細であるほど良い)?

  • 1. mapメソッドの後、reduceメソッドの前のプロセスは、シャッフルと呼ばれます。
  • 2. mapメソッドの後、データは最初にパーティションメソッドに入り、データパーティションにマークを付けてから、リングバッファーにデータを送信します。リングバッファーのデフォルトサイズは100Mで、リングバッファーが80%に達するとオーバーフロー書き込み、オーバーフロー書き込みの前にデータを並べ替えます。並べ替えはキーインデックスのディクショナリ順に基づいており、並べ替え方法は高速です。オーバーフロー書き込みは大量のオーバーフロー書き込みファイルを生成し、オーバーフロー書き込みファイルをマージして並べ替える必要があります。コンバイナ操作はオーバーフロー書き込みファイルに対しても実行できます。前提は集計演算であり、平均値では不十分です。最後に、ファイルはパーティションに従ってディスクに保存され、Reduce側がプルするのを待ちます。
  • 3.各Reduceは、マップ側の対応するパーティションのデータをプルします。データをプルした後、最初にメモリに格納します。メモリが不足している場合は、ディスクに格納します。すべてのデータを取得したら、マージソートを使用してメモリとディスクのデータをソートします。reduceメソッドを入力する前に、データをグループ化できます。

関連する詳細は次のとおりです。

  • 1. maptaskが実行され、maptaskの出力データを収集し、リングバッファーにデータを書き込み、開始オフセットを記録します。
  • 2.リングバッファのデフォルトサイズは100Mです。データが80Mに達すると、終了オフセットが記録されます。
  • 3.データがパーティション化され(デフォルトのグループは、ハッシュ値%reduceのキーに従ってパーティション化されます)、パーティションはすばやくソートされます。
  • 4.パーティションを作成し、並べ替えた後、データをディスクにフラッシュします(このプロセスでは、出力データは残りの20%リングバッファーに書き込まれ、開始オフセットも記録する必要があります)。
  • 5. maptaskが終了すると、形成された複数の小さなファイルがマージされ、1つの大きなファイルにソートされます。
  • 6. maptaskが実行されると、reducetaskが開始されます。
  • 7. reducetaskは、maptaskが完了したマシン上の独自のパーティションに属するデータをプルします。
  • 8. reducetaskは、プルされたデータを「グループ化」し、データのグループごとにreduce()メソッドを1回呼び出します。
  • 9. reduceロジックを実行し、結果をファイルに出力します。

5.コンバイン機能の役割は何ですか?

  • Comnbineはマップ側とリデュース側に分かれており、同じキーのKey-Valueペアをマージする機能で、カスタマイズ可能です。結合関数は、マップ関数によって生成された<key、value>ペア(複数のキー、値)を新しい<key2、value2>に結合します。新しい<key2、value2>をreduce関数に入力します。この値2は、複数存在するため、値と呼ぶこともできます。この統合された親大学は、ネットワーク伝送を減らすことです。

6.いくつかのMapReduce調整方法を簡潔にリストします

MapReduce最適化方法は、主に6つの側面から考慮されます。データ入力、マップフェーズ、削減フェーズ、IO送信、データスキューの問題、一般的に使用されるチューニングパラメーターです。

1.データ入力

  • 1)小さなファイルをマージし、MRタスクを実行する前に小さなファイルをマージします。小さなファイルが多数あると、多数のマップタスクが生成され、マップタスクのロード数が増加します。タスクのロードには時間がかかり、結果としてMR操作が遅くなります。
  • 2)入力としてCombinetextInputFormatを使用して、入力側に多数の小さなファイルがあるシナリオを解決します。

2.マップステージ

  • 1)io.sort.mbおよびsort.spill.percentパラメーター値を調整してオーバーフロー書き込みの数を減らし、オーバーフロー書き込みのメモリーの上限を増やし、オーバーフロー書き込みの数を減らし、それによってディスクIOを減らします。
  • 2)io.sort.factorパラメーターを調整してマージの数を減らし、マージファイルの数を増やし、マージの数を減らします。これにより、MR処理時間が短縮されます。
  • 3)マップ後、ビジネスロジックに影響を与えることなく、最初に処理を組み合わせてIOを削減します。

3.Reduceフェーズ

  • 1)マップの数を設定し、適度に減らします。どちらの数も小さすぎても多すぎてもいけません。少なすぎると、タスクの待機時間が長くなり、処理時間が長くなります。多すぎると、マップとタスク間のリソースの競合が発生します。処理タイムアウトやその他のエラーを引き起こします。
  • 2)マップの共存を設定し、開始完了マップパラメーターを削減、調整、表示し、マップを一定の範囲で実行し、実行開始も削減して、待機時間を短縮します。
  • 3)データセットの接続に使用される場合、reduceは大量のネットワーク消費を生成するため、reduceの使用を避けます。
  • 4)バッファーのデータの一部を直接送信して削減できるように、パラメーターを設定することで構成できる削減サイドバッファーを合理的に設定します。これにより、IOオーバーヘッドが削減されます。値が0より大きい場合、MapReduce、Reduce.input.buffer.percentのデフォルトは0.0です。このとき、メモリ読み出しバッファの指定された比率のデータはメモリに保持され、reduceによって直接使用されます。

4.IO送信

  • 1)データ圧縮を使用して、タスクのIO時間を削減します。
  • 2)seqバイナリファイルを使用します。

7. Hadoopにはどのプロセスがあり、それらの役割は何ですか?

  • NameNodeは、ファイルシステムのメタデータのストレージを管理し、ファイル内の各データブロックの位置情報を記録し、ファイルやディレクトリのオープン、クローズ、名前変更など、ファイルシステムのネームスペースに関連する操作を実行します。アクティブなHDFSクラスターは1つだけです。 namenodeは他のスレーブメタデータノードを持つことができます
  • Secondarynamenode、namenodeの編集ログをfsimageファイルにマージして、namenodeがメタデータ情報をメモリに保持できるようにします
  • NodeManagerはYARNの各ノードのエージェントです。ResourceManagerとの通信の維持、コンテナのライフサイクル管理の監視、各コンテナのリソース使用状況(メモリ、CPUなど)のモニタリング、ノードの追跡など、Hadoopクラスタ内の単一のコンピューティングノードを管理しますさまざまなアプリケーションで使用されるヘルスステータス、管理ログ、および補助サービス(補助サービス)
  • DataNode、データストレージノード、保存および取得ブロック(ファイルブロック)は、ファイルシステムクライアントからの読み取りおよび書き込み要求の提供、ブロックの作成、削除、その他の操作の実行を担当します。
  • YARNのResourceManagerは、クラスター内のすべてのリソースの統合管理と割り当てを担当します。各ノード(NodeManager)からリソースレポート情報を受け取り、この情報を特定の戦略(実際にはApplicationManger)に従って各アプリケーションに配布します。 RMは、各ノードのNodeManager(NM)および各アプリケーションのApplicationMaster(AM)と連携します。

8.糸のジョブの送信プロセス

ここに画像の説明を挿入

1.課題提出

  • 1)クライアントはjob.waitForCompletionメソッドを呼び出して、クラスター全体にMapReduceジョブを送信します。
  • 2)クライアントはResourceManagerからジョブIDを申請します。
  • 3)ResourceManagerは、ジョブリソースの送信パス(HDFSパス)とジョブIDをクライアントに返します各ジョブには一意のIDがあります。
  • 4)クライアントは、jarパッケージ、スライス情報、および構成ファイルを指定されたリソース送信パスに送信します。
  • 5)クライアントがリソースを送信した後、それはResourceManagerに適用されてMrAppMaster(ジョブのApplicationMaster)を実行します。

2.ジョブの初期化

  • 6)ResourceManagerはクライアントのリクエストを受信すると、ジョブをキャパシティスケジューラ(Resource Scheduler)に追加します。
  • 7)アイドル状態のNodeManagerがジョブを受信します。
  • 8)NodeManagerはコンテナーを作成し、MrAppMasterを生成します。++++++++++
  • 9)クライアントからローカルに送信されたリソースをダウンロードし、フラグメント情報に従ってMapTaskおよびReduceTaskを生成します。

3.タスクの割り当て

  • 10)MrAppMasterはResourceManagerに適用され、複数のMapTaskタスクリソースを実行します。
  • 11)ResourceManagerはMapTaskを実行するタスクをアイドル状態の複数のNodeManagerに割り当て、NodeManagerはタスクを受け取り、それぞれコンテナ(コンテナ)を作成します。

4.実行中のタスク

  • 12)MrAppMasterMasterはプログラムの起動スクリプトをタスクを受信する2つのNodeManagerに送信し、タスクを受信する各NodeManagerはMapTaskを開始し、MapTaskはデータを処理してデータをソートします。
  • 13)MrAppMasterがすべてのMapTasksの実行を待った後、ResourceManagerからコンテナー(コンテナー)を申請し、ReduceTaskを実行します。
  • 14)手順が完了すると、MrAppMasterはResourceManagerに申請して自分自身をキャンセルします。
  • 15)進捗状況とステータスの更新。YARNのタスクは、進捗状況とステータス(カウンターを含む)をアプリケーションマネージャーに返します。クライアントは毎秒(mapreduce.client.progressmonitor.pollintervalによって設定された)アプリケーションマネージャーからの進行状況の更新を要求し、それをユーザーに表示します。YARN WebUIを使用して、タスクの実行ステータスを表示できます。

5.宿題が完了しました

  • クライアントは、アプリケーションマネージャからジョブの進行状況を要求することに加えて、ジョブがwaitForCompletion()を介して5分ごとに完了しているかどうかをチェックします。時間間隔は
    mapreduce.client.completion.pollintervalで設定できます。ジョブが完了すると、アプリケーションマネージャーとコンテナーは作業状態をクリーンアップします。ジョブ情報は、後でユーザーが検査できるようにジョブ履歴サーバーによって保存されます。

9.現在のブロックのサイズは128Mです。これで、サイズが260Mのファイルがあります。スピルが実行されると、何スライスに分割されますか?

  • 2スライス、1.1冗長性(スライスするたびに、残りの部分がブロックの1.1倍より大きいかどうかを判断する必要があり、それが1.1倍以下の場合は1スライスに分割されます)

10. MRに介入できるコンポーネントをリストします(各コンポーネントの原理を詳しく説明してください、ps:結合)

  • 結合:マップ側の削減(各maptaskによって生成されるファイル)と同等です。
  • パーティション:パーティション。デフォルトはキーハッシュ値%reduceの数に基づいており、カスタムパーティションはPartitionerクラスを継承し、getPartition()パーティションメソッドをオーバーライドします。カスタムパーティションは、データスキューの問題を効果的に解決できます。
  • group:グループ、WritableCompatatorクラスを継承、compare()メソッドをオーバーライド、グループをカスタマイズ(つまり、reduceによって入力されたデータのグループ化ルールを定義)。
  • sort:ソート、WritableComoarableクラスの継承、compareTo()メソッドのオーバーライド、reduceの出力結果のカスタムソートメソッドによるソート。
  • 断片化:クライアントのブロックサイズ、最小サイズ、最大サイズを調整できます。

11.断片化とチャンクの違いは何ですか?

  • 断片化は論理的な概念であり、断片化には冗長性があります。
  • ブロッキングは物理的な概念であり、冗長性なしでデータを分割することです。

12. resourceManagerの職責は何ですか?

•リソーススケジューリング。
•リソースの監視。
•アプリケーションの提出。

13. NodeManagerの職務は何ですか?

  • 主にノードのリソース管理。コンテナを起動してタスクの計算を実行し、リソースをレポートし、コンテナのステータスをRMに、タスクの処理ステータスをAMに。

14. Hadoopスケジューラーについて簡単に説明してください

  • 現在、Hadoopには、FIFO、Capacity Scheduler、Fair Schedulerという3つの一般的なリソースマネージャーがあります。現在、Hadoop2.7はデフォルトでCapacity Schedulerを使用しています。

1. FIFO(先入れ先出しスケジューラ)

  • Hadoop 1.xで使用されるデフォルトのスケジューラーはFIFOです。FIFOはキュー方式を使用して、時間順にジョブタスクを処理します。たとえば、最上位のジョブには複数のmaptaskと複数のreduceタスクが必要であり、アイドル状態のサーバーノードが見つかると、ジョブが実行されるまでこのジョブに割り当てられます。
    ここに画像の説明を挿入

2.Capacity Scheduler(キャパシティースケジューラー)

hadoop2.xが使用するデフォルトのスケジューラーは、Capacity Schedulerです。

  • 1)複数のキューをサポートします。各キューは特定の量のリソースで構成でき、各キューはFIFOによってスケジュールされます。
  • 2)同じユーザーのジョブタスクがキュー内のリソースを独占しないようにするために、スケジューラは、同じユーザーが送信したジョブタスクが占有するリソースを制限します。
  • 3)新しいジョブタスクを割り当てるときは、最初に各キューで実行中のタスクの数とキューが割り当てるリソースの量の比率を計算し、次に比率が最小のキューを選択します。たとえば、図に示すように、キューAには15個のタスクと20%のリソースがあり、15%0.2 = 70、キューBは25%0.5 = 50、キューCは25%0.3 = 80.33です。したがって、最小のキューBを選択します。
  • 4)第2に、ジョブタスクの優先順位と時間シーケンスに従って、ユーザーのリソース量とメモリ制限を考慮する必要があります。キュー内のジョブタスクを並べ替えて実行します。
  • 5)タスクキューの順序に従って、複数のキューが同時に実行されます。次の図に示すように、job11、job21、job31はそれぞれのキューが比較的多く、3つのタスクが同時に実行されます。
    ここに画像の説明を挿入

3.フェアスケジューラー(フェアスケジューラー)

  • 1)複数のキューを保持し、各キューを特定のリソースで構成できます。各キューのジョブタスクは、キューが配置されているキューのすべてのリソースを公平に共有します。
  • 2)キュー内のジョブタスクには優先度に従ってリソースが割り当てられます。優先度が高いほど多くのリソースが割り当てられますが、公平性を確保するために、各ジョブタスクにはリソースが割り当てられます。優先度は、各ジョブタスクで取得したリソースの理想的な量から実際のリソースカテゴリを引いた差に基づいて決定され、差が大きいほど優先度が高くなります。
    ここに画像の説明を挿入

15.ジョブを開発するときに、reduceステージを削除できますか?

  • はい、削減数を0に設定します。job.setNumReduceTask= 0

おすすめ

転載: blog.csdn.net/sun_0128/article/details/108564793