HDFS の正式名は、Hadoop Distributed File System です。hadoop 分散 (クラスター) ファイル ストレージ システムです。一度書き込んで何度も読み取るシナリオに適しています。
HDFS システムは Hadoop のインストール時に組み込まれているため、別途インストールする必要はありません。
Hadoop のインストールでは、以下を参照できます。
- 基本的な仮想マシンがすでにインストールされています: Hadoop のインストール
- 基盤も仮想マシンもインストールされていません: Hadoop クラスターのインストール
HDFS の長所と短所:
- 利点: 耐障害性が高く、大規模なデータの処理に適しており、安価なマシン上に構築可能
- 短所: 低レイテンシのデータ アクセスには適しておらず、多数の小さなファイルを効率的に保存できず、同時書き込みとデータ変更はサポートされていません。
HDFS ファイルのブロック サイズ:
HDFS のファイルは物理的にブロックに保存され、ブロック サイズは構成パラメータ (dfs.blocksize) で指定できます。デフォルトのサイズは、Hadoop2.x/3.x バージョンでは 128M、1.x バージョンでは 64M です。
注: アドレス指定時間が送信時間の 1% の場合、それが最良の状態です
考えてみます: なぜブロック サイズを小さすぎたり、大きすぎたりすることができないのでしょうか?
(1) HDFS のブロック設定が小さすぎると、シーク時間が長くなります
(2) ブロックが大きすぎると、ディスクからのデータ転送にかかる時間が、先頭を見つけるのに必要な時間よりも大幅に長くなりますこのブロックの位置。プログラムがブロック データを処理すると、処理が非常に遅くなります。
概要: HDFS のブロック サイズ設定は、主にディスクの転送速度に依存します。
HDFS 構造:
HDFS はマスター/スレーブ アーキテクチャ (古典的なマスターおよびスレーブ アーキテクチャ) です。
HDFS は、HDFS クライアント、ネームノード、データノード、セカンダリ ネームノードの 4 つの部分で構成されます。
各 HDFS クラスターには、NameNode と複数の DataNode が含まれます
1.クライアントクライアント
ファイル システムはクライアントを介してアクセスされ、クライアントは NameNode および DataNode と通信します。クライアントはファイル システムへのインターフェイスとして機能します
- ファイルのセグメント化。ファイルが HDFS にアップロードされるときに、ファイルは保存のためにデータ ブロック (ブロック) に分割されます。
- NameNode と対話してファイルの場所を取得します
- DataNode と対話してデータの読み取りまたは書き込みを行います。実際のデータ ブロックを保存し、データベースの読み取りおよび書き込み操作を実行します。
- クライアントは、NameNode フォーマットなど、HDFS を管理するためのいくつかのコマンドを提供します。
- クライアントは、HDFS の追加、削除、変更、クエリなどのいくつかのコマンドを通じて HDFS にアクセスできます。
2、NameNode ( nn )
マスター、マネージャーに相当します。ファイルのメタデータを保存および管理し、ファイル システムのディレクトリ構造ツリーを維持し、書き込まれた各データ ブロック (Block) とそれに属するファイルとの対応を記録するために使用されます。
- HDFS 名前空間を管理する
- レプリカポリシーを構成する
- データブロックを管理するためのマッピング情報
- クライアントの読み取りおよび書き込みリクエストを処理する
3.データノード
DataNode はハートビートを通じて NameNode との通信を維持します。DataNode は、ファイル データ (ブロック ブロック) を保存し、ブロックの読み取りと書き込みを提供し、DataNode によって保存されたデータ ブロック情報を NameNode に定期的に報告する責任を負います。
4、セカンダリネームノード
セカンダリ NameNode の役割は、EditsLog を消費し、定期的に FsImage と EditsLog をマージし、新しい FsImage ファイルを生成して、それを NameNode にプッシュして、NameNode への負担を軽減することです。緊急時には、NameNode の回復を支援できます。
SecondaryNameNode メカニズム:
- SecondaryNameNode は、NameNode がハングアップするスタンバイ ノードではありません
- 彼の主な役割は、ログ ファイルが大きくなりすぎないよう定期的にログをマージすることです。
- マージされた画像ファイルも NameNode に保存されます。
SecondaryNameNode の作業プロセス:
- SecondaryNameNode は NameNode への同期リクエストを開始し、この時点で NameNode はログを新しいログに書き込みます。
- SecondaryNameNode は、イメージ ファイルとログ ファイルを NameNode にダウンロードします
- SecondaryNameNode は、これら 2 つのファイルのマージを開始し、新しいイメージ ファイルを生成します。
- SecondaryNameNode は新しい画像ファイルを NameNode に返します
- NameNode ファイルは、新しいミラー ファイルとログ ファイルを現在使用されているファイルに置き換えます。
注記:
1. FsImage (ファイル システム イメージ バイナリ) は、
特定の時点 (checkPoint) での NameNode イメージ データを保存します。
デフォルトの保存場所: /opt/install/hadoop-2.5.2/data/tmp/dfs/name
dfs.namenode.name .dir
2. EditsLog は
ログ バイナリ レコードを編集できます (チェックポイント後のすべての書き込み操作)
デフォルトの保存場所: dfs.namenode.edits.dir
HDFS 高可用性設計:
データストレージの耐障害性:
データの保存中にディスクが故障する場合があります。HDFS は、DataNode に保存されているデータ ブロックのチェックサム (CkeckSum) を計算して保存します。データを読み取るときに、読み取ったデータのチェックサムを再計算します。チェックサムが正しくない場合は、例外がスローされます。アプリケーションは例外をキャッチした後、他の DataNode に移動してバックアップ データを読み取ります。
ディスク障害耐性:
DataNode がローカル ディスクの破損を検出すると、ディスクに保存されている BlockID を NameNode に報告し、NameNode はこれらのデータ ブロックのバックアップを確認し、対応する DataNode サービスに通知し、対応するデータを他のサーバーに復元します。データブロックのバックアップを確実に行うための数が要件を満たしています。
データノードの耐障害性:
DataNode はハートビートを介して NameNode との通信を維持します。タイムアウト後に DataNode がハートビートを送信しない場合、NameNode は DataNode がダウンしていると判断し、DataNode 上のデータ ブロックとこれらのデータ ブロックが配置されているサーバーをすぐに見つけて、これらのサーバーに通知します。 HDFS に保存されているデータ ブロック バックアップの数が要件を満たしていることを確認するために、データを他のサーバーに再度コピーします。
NameNode フォールト トレランス:
NameNode は HDFS 全体の中核であり、すべてのファイルの割り当て情報、すべてのファイル パスおよびデータ ブロック ストレージ情報を記録します。NameNode に障害が発生すると、HDFS システム クラスタ全体が使用できなくなり、NameNode のデータが失われると、クラスタ全体の DataNode データがすべて使用できなくなります。したがって、NameNode はマスター/スレーブ ホット スタンバイ方式を採用して高可用性サービスを提供します。以下に示すように:
HDFS の読み取りおよび書き込みプロセス:
書き込みプロセス:
- アップロードのリクエスト: クライアントはネームノードと通信し、ファイルのアップロードをリクエストします。
- namenodeはアップロード可能かどうかを判断します。namenodeはユーザーにアップロード権限があるか、対象のファイルが存在するか、親ディレクトリが存在するかを確認します。
- ファイルのセグメント化: クライアントはファイルをサイズ 0 ~ 128M のブロックに分割します (論理セグメント化)。
- クライアントはブロックブロックの保存場所を要求します
- namenode はデータノードアドレス dn1、dn2、dn3 を返します。
- クライアントは、FSDataOutputStream モジュールを介してデータをアップロードするように dn1 に要求し、接続パイプラインを確立します (基本的に RPC 呼び出し、パイプラインの確立)。
- dn1 がリクエストを受信すると、dn2 の呼び出しを続け、dn2 は dn3 を呼び出して通信パイプライン全体の確立を完了し、段階的にクライアントに戻ります (図の ack チェック)。
- クライアントは、パケットを単位として (デフォルトは 64k)、最初のブロックを dn1 にアップロードし始めます (最初にディスクからデータを読み取り、ローカル メモリ キャッシュに置きます)。dn1 はパケットを受信し、それを dn2 に渡します。 dn2 はそれを dn3 に渡します; dn1 パケットが送信されるたびに、パケットは応答キューに入れられ、応答を待ちます
- ブロックの送信が完了すると、クライアントはネームノードに 2 番目のブロックのサーバーを再度アップロードするよう要求します (手順 4 ~ 8 を繰り返します)。
- 送信が完了すると、クライアントはストリーム リソースを閉じ、データ送信が完了したことを hdfs に通知し、hdfs は送信の受信後にメタデータを復元します。
読み取りプロセス:
- クライアントは、NameNode への RPC リクエストを開始して、リクエストされたファイル ブロックの場所を特定します。
- NameNode は、必要に応じてファイルのブロック リストの一部またはすべてを返し、ブロックごとに、ブロックのコピーを含む DataNode のアドレスを返します。
- 返された DataNode アドレスは、クラスター トポロジに従って DataNode とクライアント間の距離を取得し、次に 2 つのルールに従って並べ替えます: ネットワーク トポロジでは、クライアントに最も近いアドレスが最初に、ハートビート メカニズムでは、状態報告された超過時間が STALE である DataNode の行は遅れています。
- クライアントは、ブロックを読み取るために最高ランクの DataNode を選択します。クライアント自体が DataNode の場合、データをローカルで直接取得します。基本的な本質は、ソケット ストリーム (FSDataInputStream) を確立し、その読み取りメソッドを繰り返し呼び出すことです。ブロック上のデータが読み取られるまで、親クラス DataInputStream。
- リスト内のブロックを読み取った後、ファイルの読み取りがまだ終了していない場合、クライアントは引き続き NameNode からブロック リストの次のバッチを取得します。
- ブロックの読み取り後にチェックサム検証が実行され、DataNode の読み取り時にエラーが発生した場合、クライアントは NameNode に通知し、ブロックのコピーを持つ次の DataNode から読み取りを続行します。
- read メソッドは、ブロック情報を 1 つずつではなく並行して読み取ります。NameNode は、クライアントがブロックを含めるよう要求した DataNode アドレスのみを返し、要求されたブロックのデータは返しません。
- 最終的には、読み取られたすべてのブロックが完全な最終ファイルにマージされます。
HDFS ストレージ モデル:
-
ファイルは、オフセットと ID を使用してバイト単位でブロックに線形に分割されます。
-
ファイル内の最後のブロックを除いて、他のブロックは同じサイズです
-
ブロックサイズはハードウェアのI/O特性に応じて調整されます
-
ブロックはクラスターのノード間に分散しており、場所が指定されています。
-
ブロックにはコピー (レプリケーション) があり、マスター/スレーブの概念はなく、コピーは同じノード上に存在できません。
-
レプリカは信頼性とパフォーマンスを満たす鍵です
-
ファイルアップロードではブロックサイズとコピー数を指定でき、アップロード後に変更できるのはコピー数のみです。
-
1 回の書き込みと複数回の読み取り。変更はサポートされず、データの追加のみがサポートされます。