ビッグ データのインタビューに向けて尋ねる必要がある質問: HDFS の読み取りおよび書き込みプロセス

HDFS の読み取りおよび書き込みプロセス

この質問はビッグデータアナリストの面接では必須の質問ですが、なかなか言い切れない面接官も多いので、
ぜひ覚えておいてください。また、多くの問題は HDFS の読み取りおよび書き込みプロセスに起因します。

1. HDFS読み込み処理

  1. クライアントは RPC リクエストを NameNode に送信します。要求されたファイル ブロックの場所。
  2. NameNode はリクエストを受信すると、ユーザーの権限とこのファイルが存在するかどうかをチェックします。すべて揃っている場合は、
    状況に応じてブロック リストの一部またはすべてを返します。ブロックごとに、NameNode は
    返します。ブロックのコピーを含むデータノードのアドレス データノードのアドレス、
    データノードとクライアント間の距離はクラスター トポロジに従って取得され、
    2 つのルールに従って並べ替えられます。クライアントに最も近いものが最初にランク付けされます。ハートビート メカニズムでは、
    時間の経過とともに報告されるデータノードの状態が STALE であるため、そのような行は後ろにあります。
  3. クライアントは、ブロックを読み取るために最上位の DataNode を選択します。クライアント自体が
    DataNode の場合、ローカルからデータを直接取得します (ショートサーキット読み取り機能)。
  4. 最下層の本質は、ソケット ストリーム (FSDataInputStream) を確立し、
    このブロック上のデータが読み取られるまで親クラス DataInputStream の読み取りメソッドを繰り返し呼び出すことです。
  5. リスト内のブロックを読み取った後、ファイルの読み取りがまだ終了していない場合、クライアントは引き続き
    NameNode からブロック リストの次のバッチを取得します。
  6. ブロックの読み取り後、チェックサム検証が実行されます。DataNode の読み取り中にエラーが発生した場合、
    クライアントは NameNode に通知し、
    ブロックのコピーを持つ次の DataNode から読み取りを続行します。
  7. read メソッドは、ブロック情報を 1 つずつではなく並行して読み取ります。NameNode は、
    クライアントによって要求されたブロックの DataNode アドレスのみを返し、要求されたブロックのデータは返しません。
  8. 最後に、読み取られたすべてのブロックが完全な最終ファイルにマージされます。
    ここに画像の説明を挿入

2. HDFS書き込みプロセス

  1. クライアント クライアントは、アップロード リクエストを送信し、RPC を通じて NameNode との通信を確立します。NameNode は、
    ユーザーにアップロード許可があるかどうか、およびアップロードされたファイルが対応する HDFS ディレクトリに同じ名前を持つかどうかを確認します
    。この 2 つのいずれかが満たされない場合は、エラーが直接報告され、両方が満たされる場合は、
    アップロード可能なメッセージをクライアントに返します。
  2. クライアントは、ファイルのサイズに応じてファイルを分割します。デフォルトは 128M です。分割が完了すると、
    最初のブロックがアップロードされるサーバーの NameNode にリクエストが送信されます。
  3. NameNode はリクエストを受信すると、ネットワーク トポロジ、ラック認識およびコピー メカニズムに従ってファイルを割り当て
    、利用可能な DataNode のアドレスを返します。
  4. アドレスを受信した後、クライアントはサーバー アドレス リスト内のノード (A など) と通信します。これは基本的に
    パイプラインを確立するための RPC 呼び出しです。A はリクエストの受信後も B の呼び出しを継続し、B は C を
    呼び出して要求を完了します。パイプライン全体を確立し、段階的にクライアントに戻ります。
  5. クライアントは最初のブロックを A に送信し始めます (最初にディスクからデータを読み取り、ローカル メモリ キャッシュに置きます
    )。パケット単位 (データ パケット、64kb)、A はパケットを受信して
    ​​ B に送信します。次に、B が C に対して送信します。A は、各パケットが送信された後、それを応答キューに入れて応答を待ちます。
  6. データは個々のパケットに分割され、パイプライン上で順次送信され、
    パイプラインの逆送信では、ACK が 1 つずつ送信され (コマンドの正しい応答)、最後にパイプライン
    内の最初の DataNode ノード A がパイプライン ACK を送信します。クライアント;
  7. ブロックの送信が完了した後、クライアントはネームノードに 2 番目のブロックを再度アップロードするように要求し、
    ネームノードはクライアントのために 3 つのデータノードを再度選択します。

おすすめ

転載: blog.csdn.net/m0_58353740/article/details/131353868