HDFS 分散ファイル システムを開発する理由
分散コンピューティングをより適切にサポートできます。
Hadoop分散ファイルシステムは、ファイルを操作する分散ファイルシステムであり、ファイル単位で追加や削除が行われます。
ストレージモデル
- ファイルはバイト単位でブロックに線形に分割され、オフセットがあります。ID
オフセットはブロックのオフセットを指します。たとえば、ブロック サイズは 10 で、オフセットは 0、10、20、または 30 です。。。
id は、block1、block2 などのブロックの名前です。。。 - ファイルのブロック サイズは異なる場合があります。
異なるファイルを参照します。ブロック サイズは異なる場合があります。たとえば、ファイル A のブロック サイズは 10 バイト、ファイル B のサイズは 20 バイトです。 - ファイル内の最後のブロックを除いて、他のすべてのブロックは同じサイズです。
ファイル内のデータは確実にカットされます。回復方法は?後のスプライシング時に回復できます。 - ブロックのサイズはハードウェアの I/O 特性に応じて調整されます。
- ブロックはクラスターのノードに分散して保存されます。場所とは、
ブロックがクラスター内のどのノードに保存されるかを指します。 - ブロックにはレプリカ (レプリケーション) があり、マスター/スレーブの概念はありません。レプリカは同じノード上に存在できません。レプリカには
マスター/スレーブの概念はありません。たとえば、3 つのレプリカは、各ブロックが 3 つのコピーに格納されることを意味します。 3 つのコピーのいずれかを読み取ることができます。 - レプリカは信頼性とパフォーマンスを満たすための鍵です。
複数のレプリカにより、複数のプログラムが並行して計算できるようになり、ファイルを取得せずに計算をデータに移動することができます。 - ファイルアップロード時にブロックサイズとコピー数を指定できます。アップロード後に変更できるのはコピー数のみです。
ファイルアップロード後にブロックサイズを再度調整することはできませんが、ブロックのコピー数は調整できます。 - 一度書き込めば何度も読み取れます。変更はサポートされていません。
読み取りのみ可能で変更はできませんが、データの追加は可能です。
理由: ブロック データが変更されると、後続のブロックのオフセットが変更され、リソース (CPU、ネットワーク帯域幅、IO など) が大幅に浪費されるためです。これは妥協の設計です。 HDFS は分散コンピューティングのサポートを改善するため、変更操作のために操作をフラッディングする必要がありません。 - データの追加のサポート。
データを追加しても、他のブロックのオフセットは変更されません。最後のブロックのデータのみが変更され、フラッディング操作は発生しません。したがって、追加操作がサポートされています。
建築デザイン
- HDFS はマスター/スレーブ (マスター/スレーブ) アーキテクチャです。マスターとスレーブは
協力してタスクを完了します。
マスター/スレーブとは、一方が機能し、他方が機能しないことを意味します。マスターに障害が発生すると、スレーブがマスターに切り替わります。実際、スレーブはバックアップです。 - NameNode といくつかの DataNode で構成され、
NameNode がマスター、DataNode がスレーブになります。 - ファイル指向のインクルージョン: ファイル データ (データ) とファイル メタデータ (メタデータ)
NameNode は、ファイル メタデータの保存と管理、およびLinux のファイル ディレクトリ ツリーと同様の階層ファイル ディレクトリ ツリーの維持を担当します。- DataNode はファイルデータ(ブロック)の保存とブロックの
読み書きを行う役割を持ち、クライアントはまず NameNode にアクセス先を確認し、対応する DataNode にアクセスします。
NameNode はゲートウェイのようなもので、リクエストをさまざまなノードに転送します。 - DataNodeはNameNodeで精神状態を管理し、自身が保持しているブロック情報を報告し、
DataNodeから報告された情報を基にファイルの保管が完了したかを確認します。 - クライアントとネームノードはファイルのメタデータと対話し、データノードはファイル ブロック データと対話します。
役割機能
名前ノード
- ファイル メタデータ、ディレクトリ ツリー構造、およびファイル ブロック マッピングを保存するために完全にメモリに基づいており、
メモリ ストレージに基づいて高速アクセスを実現し、メモリ IO はディスク IO の 100,000 倍です。 - データの信頼性を確保するには永続化ソリューションが必要です
- レプリカ配置戦略
データノードを提供する - ローカル ディスク ストレージ ブロック (ファイル形式) に基づいて、
ファイルが 10 個のブロックに分割されている場合、ファイルは 10 個の小さなファイルに保存され、異なるデータノードに分散されます。 - ブロックの信頼性を確保するために、ブロックのチェックサムを保存します。
ダウンロード時にブロック データが破壊されないことを確認します。ブロックをダウンロードした後、チェックサムを計算し、データノード上のチェックサムと比較します。一貫したデータがあれば、普通。 - NameNode でハートビートを維持し、ブロック リストのステータスをレポートする
メタデータの永続性
- ファイル システムのメタデータを変更する操作はすべて、EditLog と呼ばれるトランザクション ログを使用して NameNode によって記録されます。
- FsImage を使用してすべてのメタデータ状態をメモリに保存する
- ローカルディスクを使用して EditLog と FsImage を保存する
- EditLog は整合性があり、データの損失が少ないですが、回復速度が遅く、ボリュームが拡張するリスクがあります。
- FsImageは復元速度が速く、メモリデータと同等のサイズですが、リアルタイムに保存できず、データの損失が大きくなります。
- NameNode は、FsImage+EditLog 統合ソリューションを使用して
、増分 EditLog をローリング ベースで FsImage に更新し、FsImage の時点を近づけ、EditLog サイズを小さくします。
ログファイルの役割
発生する追加、削除、変更操作をリアルタイムに記録し、ログを読み込むことで以前のデータを復元できます。
利点: ログはリアルタイムであるため、整合性が高くなります。
欠点: データのロードと復元は時間がかかり、多くのスペースを消費します。
ミラー、スナップショット、ダンプ、データベースの機能
メモリ データ全体は、特定の時点に基づいてディスクに書き込まれます。これは、メモリ データ全体をディスクにシリアル化するのと似ています。
ただし、I/O の読み取りおよび書き込みが遅いため、間隔を短くしすぎることはできません。
利点: 通常はバイナリ ファイル ストレージ、高速リカバリ。
短所: インターバル保存のため、一部のデータが失われやすいです。
HDFS メタデータが保持される仕組み
画像 (FsImage) + ログ (EditLog) の組み合わせにより。
HDFS はどのように併用されますか?
EditLog: ログ ファイルのサイズをできるだけ小さくし、レコードの数をできるだけ少なくします。
FsImage: パイプラインを通じてイメージ ファイルをできるだけ早く更新します (FsImage ファイルを定期的に生成します)。
データは、最新の FsImage + 増分 EditLog を通じて保持されます。
たとえば、現在は 10 時です
。9 時に FsImage を使用し、
9 時から 10 時まで増分 EL リカバリ ステップを実行します。
1. FI をロードします
。 2. EL をロードします
。 3. メモリはフルになります。シャットダウン前のデータ量
セーフモード
-
HDFS は構築時にフォーマットされ、フォーマット操作により空の FsImage が生成されます。
-
NameNode が起動すると、ハードディスクから Editlog と FsImage を読み取ります。
-
Editlog 内のすべてのトランザクションをメモリ内の FsImage に適用します
-
この新しいバージョンの FsImage をメモリからローカル ディスクに保存します
-
次に、古い EditLog を削除します。これは、この古い Editlog のトランザクションがすでに FsImage に適用されているためです。
-
NameNode が起動すると、セーフ モードと呼ばれる特別な状態に入ります。
-
セーフ モードの NameNode はデータ ブロックをコピーしません。
たとえば、ファイルのメタデータには、ファイル属性、および各ブロックがどの DN に存在するかが含まれます。
永続化中: ファイル属性は永続化されますが、ファイルの各ブロックの位置は永続化されないため、NN がリカバリを開始すると、NN はブロックの位置情報を失います。
この設計の理由は、分散ストレージではデータの一貫性が非常に重要であるため、永続化されていてもクラスターの起動時に特定の DN がハングアップすると、ブロックのダウンロード時にエラーが発生するためです。すべてはスタートアップ DD を使用してデータを NN に報告します。 -
NameNode は、すべての Datanode からハートビート信号とブロック ステータス レポートを受信します。
-
データ ブロックのレプリカの数がこの最小値に達したことを NameNode が検出すると、データ ブロックは安全に複製されたとみなされます。
-
NameNode によって一定の割合 (このパラメーターは構成可能) のデータ ブロックが検出され、安全であることが確認された後 (さらに 30 秒の待機時間)、NameNode はセーフ モード状態を終了します。
-
次に、指定された数に達していないレプリカを持つデータ ブロックを確認し、これらのデータ ブロックを他のデータノードにコピーします。
HDFS の SNN
セカンダリネームノード(SNN)
- 非 Ha モードでは、SNN は通常独立したノードであり、NN の EditLog と FsImage は定期的にマージされて、EditLog のサイズと NN の起動時間が削減されます。
- 構成ファイルに従って設定された時間間隔 fs.checkpoint.period のデフォルトは 3600 秒です。
- 構成ファイル fs.checkpoint.size に従って、編集ログ サイズを設定します。デフォルトでは、編集ファイルの最大サイズは 64MB であると規定されています。
ブロックのコピー配置戦略
- 最初のコピー: アップロードされたファイルの DN に配置されます。クラスターの外に送信された場合、ディスクがいっぱいではなく、CPU があまりビジーではないノードがランダムに選択されます。
- 2 番目のレプリカ: 最初のレプリカとは異なるラック上のノードに配置されます。
- 3 番目のレプリカ: 2 番目のレプリカと同じラック内のノード。
クライアントのコストを削減します。2 と 3 をラックに配置すると、ラックから離れる必要がなく、ネットワーク IO が削減されます。 - より多くのコピー: ランダムなノード。
読み取りと書き込みのプロセス
- クライアントはまず、NN からソートされた DN のリストを取得します。
- クライアントは最も近い DN との TCP 接続を確立し、最初の DN は 2 番目の DN との TCP 接続を確立し、2 番目の DN は 3 番目の DN との TCP 接続を確立してパイプラインを形成します。つまり、クライアントは TCP 接続のみを確立します。 1 つの DN で接続します。クライアントはファイルを複数のブロックに分割します。クライアントは 1 つのブロックを最初の DN に転送します。数回繰り返した後、クライアントは 2 番目のブロックを転送します。2 番目の DN と 3 番目の DN が転送されるまで待つ必要はありません。後続の DN データは、前の DN が担当します。実際、パイプラインも並列処理の一種です。
HDFS書き込みプロセスの詳細
クライアント現象 NN はブロックのコピー位置に適用され、クライアントがブロックを送信した後、次のブロックのコピー位置に対して再び NN に適用されます。
以下は、クライアントがブロックを送信するための具体的なプロセスです。
- クライアントと NN 接続によりファイルのメタデータが作成される
- NN はメタデータが有効かどうかを判断します
- NN はレプリカ配置戦略をトリガーし、順序付けされた DN リストを返します。
- クライアントとDNがパイプライン接続を確立します
- クライアントはブロックをパケット (64KB) に分割し、それらをチャンク (512B) + チャンクサム (4B) で満たします。
つまり、クライアントは毎回パケットを送信します。
64KB = (512B + 4B)*n、つまり、64KB データは複数のチャンク + チャンクサムに分割されます。 - クライアントはパケットを送信キュー dataqueue に入れ、最初の DN に送信します。
- パケットを受信した後、最初の DN はそれをローカルに保存し、2 番目の DN に送信します。
- パケットを受信した後、2 番目の DN はそれをローカルに保存し、3 番目の DN に送信します。
- このプロセス中に、上流ノードは次のパケットを同時に送信します。
- 生活におけるエンジニアリングのパイプラインへの類似: 結論: ストリーミングは実際には並列コンピューティングの一種です
- HDFS はこの伝送方法を使用し、コピー数はクライアントに対して透過的です。
- ブロックの送信が完了すると、DN はそれぞれ NN に報告し、クライアントは次のブロックの送信を続けます。
- したがって、クライアントの送信とブロックのレポートも並行して行われます。
HDFS読み取りプロセス
HDFS読み取りプロセス
- 全体的な帯域幅の消費と読み取り遅延を削減するために、HDFS はリーダーに最も近いコピーを読み取らせようとします。
- リーダーと同じラックにレプリカがある場合、そのレプリカが読み取られます。
- HDFS クラスターが複数のデータ センターにまたがる場合、クライアントは最初にローカル データ センターのコピーも読み取ります。
- セマンティクス: テキストをダウンロードする:
- クライアントと NN はファイルのメタデータと対話して、
fileBlockLocation ファイル内のすべてのブロックの場所を取得します。 - NN は距離戦略に従ってソートされて返されます。
- クライアントはブロックをダウンロードしてデータの整合性を検証しようとします。
- クライアントと NN はファイルのメタデータと対話して、
- セマンティクス: ファイルをダウンロードすると、実際にはファイルのすべてのブロック コンポーネント データが取得されるため、特定のブロックのサブセット取得を確立する必要があります。
- HDFS は、クライアントがファイルのオフセットを指定し、接続するブロックの DN をカスタマイズし、データ取得をカスタマイズすることをサポートします。
- これは、コンピューティング層での分割統治と並列コンピューティングをサポートするコアです。