HDFS の読み取りおよび書き込みプロセス
この質問はビッグデータアナリストの面接では必須の質問ですが、なかなか言い切れない面接官も多いので、
ぜひ覚えておいてください。また、多くの問題は HDFS の読み取りおよび書き込みプロセスに起因します。
1. HDFS読み込み処理
- クライアントは RPC リクエストを NameNode に送信します。要求されたファイル ブロックの場所。
- NameNode はリクエストを受信すると、ユーザーの権限とこのファイルが存在するかどうかをチェックします。すべて揃っている場合は、
状況に応じてブロック リストの一部またはすべてを返します。ブロックごとに、NameNode は
返します。ブロックのコピーを含むデータノードのアドレス データノードのアドレス、
データノードとクライアント間の距離はクラスター トポロジに従って取得され、
2 つのルールに従って並べ替えられます。クライアントに最も近いものが最初にランク付けされます。ハートビート メカニズムでは、
時間の経過とともに報告されるデータノードの状態が STALE であるため、そのような行は後ろにあります。 - クライアントは、ブロックを読み取るために最上位の DataNode を選択します。クライアント自体が
DataNode の場合、ローカルからデータを直接取得します (ショートサーキット読み取り機能)。 - 最下層の本質は、ソケット ストリーム (FSDataInputStream) を確立し、
このブロック上のデータが読み取られるまで親クラス DataInputStream の読み取りメソッドを繰り返し呼び出すことです。 - リスト内のブロックを読み取った後、ファイルの読み取りがまだ終了していない場合、クライアントは引き続き
NameNode からブロック リストの次のバッチを取得します。 - ブロックの読み取り後、チェックサム検証が実行されます。DataNode の読み取り中にエラーが発生した場合、
クライアントは NameNode に通知し、
ブロックのコピーを持つ次の DataNode から読み取りを続行します。 - read メソッドは、ブロック情報を 1 つずつではなく並行して読み取ります。NameNode は、
クライアントによって要求されたブロックの DataNode アドレスのみを返し、要求されたブロックのデータは返しません。 - 最後に、読み取られたすべてのブロックが完全な最終ファイルにマージされます。
2. HDFS書き込みプロセス
- クライアント クライアントは、アップロード リクエストを送信し、RPC を通じて NameNode との通信を確立します。NameNode は、
ユーザーにアップロード許可があるかどうか、およびアップロードされたファイルが対応する HDFS ディレクトリに同じ名前を持つかどうかを確認します
。この 2 つのいずれかが満たされない場合は、エラーが直接報告され、両方が満たされる場合は、
アップロード可能なメッセージをクライアントに返します。 - クライアントは、ファイルのサイズに応じてファイルを分割します。デフォルトは 128M です。分割が完了すると、
最初のブロックがアップロードされるサーバーの NameNode にリクエストが送信されます。 - NameNode はリクエストを受信すると、ネットワーク トポロジ、ラック認識およびコピー メカニズムに従ってファイルを割り当て
、利用可能な DataNode のアドレスを返します。 - アドレスを受信した後、クライアントはサーバー アドレス リスト内のノード (A など) と通信します。これは基本的に
パイプラインを確立するための RPC 呼び出しです。A はリクエストの受信後も B の呼び出しを継続し、B は C を
呼び出して要求を完了します。パイプライン全体を確立し、段階的にクライアントに戻ります。 - クライアントは最初のブロックを A に送信し始めます (最初にディスクからデータを読み取り、ローカル メモリ キャッシュに置きます
)。パケット単位 (データ パケット、64kb)、A はパケットを受信して
B に送信します。次に、B が C に対して送信します。A は、各パケットが送信された後、それを応答キューに入れて応答を待ちます。 - データは個々のパケットに分割され、パイプライン上で順次送信され、
パイプラインの逆送信では、ACK が 1 つずつ送信され (コマンドの正しい応答)、最後にパイプライン
内の最初の DataNode ノード A がパイプライン ACK を送信します。クライアント; - ブロックの送信が完了した後、クライアントはネームノードに 2 番目のブロックを再度アップロードするように要求し、
ネームノードはクライアントのために 3 つのデータノードを再度選択します。