このドキュメントは、Hadoopクラスタの一部として、またはスタンドアロンの汎用分散ファイルシステムとして、Hadoop分散ファイルシステム(HDFS)を使用するユーザーのための出発点です。HDFSは多くの環境で「そのまま動作する」ように設計されていますが、HDFSに関する知識は、特定のクラスタでの設定の改善と診断に非常に役立ちます。
HDFSは、Hadoopアプリケーションで使用される主要な分散ストレージです。HDFSクラスタは主に、ファイルシステムメタデータを管理するNameNodeと、実際のデータを格納するDataNodeで構成されます。「HDFSアーキテクチャガイド」では、HDFSについて詳細に説明しています。このユーザーガイドでは、主にユーザーと管理者がHDFSクラスタと対話する方法について説明します。HDFSアーキテクチャ図は、NameNode、DataNode、クライアント間の基本的な相互作用を示しています。クライアントはファイルメタデータまたはファイルの変更のためにNameNodeに問い合わせ、実際のファイルI/OはDataNodeと直接行います。
以下は、多くのユーザーにとって興味深い重要な機能の一部です。
HDFSを含むHadoopは、コモディティハードウェアを使用した分散ストレージと分散処理に適しています。耐障害性、スケーラビリティが高く、拡張も非常に簡単です。大規模な分散アプリケーションのセットに適用できるシンプルさで知られるMapReduceは、Hadoopの不可欠な部分です。
HDFSは、多くのインストールに適したデフォルト設定で高度に構成可能です。多くの場合、設定の調整が必要になるのは、非常に大規模なクラスタの場合のみです。
HadoopはJavaで記述されており、主要なすべてのプラットフォームでサポートされています。
Hadoopは、HDFSと直接対話するためのシェルのようなコマンドをサポートしています。
NameNodeとDatanodeには、クラスタの現在の状態を簡単に確認できる組み込みのWebサーバーがあります。
HDFSでは、新しい機能と改善が定期的に実装されています。以下は、HDFSの有用な機能のサブセットです。
ファイルのアクセス許可と認証。
ラック認識:タスクのスケジューリングとストレージの割り当てを行う際に、ノードの物理的な場所を考慮に入れる。
セーフモード:メンテナンスのための管理モード。
fsck
:ファイルシステムの健全性を診断し、欠落しているファイルやブロックを見つけるユーティリティ。
fetchdt
:DelegationTokenを取得して、ローカルシステムのファイルに保存するユーティリティ。
バランサー:データがDataNode間で不均等に分散されている場合にクラスタのバランスを取るツール。
アップグレードとロールバック:ソフトウェアのアップグレード後、予期しない問題が発生した場合、アップグレード前のHDFSの状態にロールバックできます。
セカンダリNameNode:名前空間の定期的なチェックポイントを実行し、HDFSの変更ログを含むファイルのサイズをNameNodeで特定の範囲内に維持するのに役立ちます。
チェックポイントノード:名前空間の定期的なチェックポイントを実行し、HDFSへの変更を含むNameNodeに保存されているログのサイズを最小限に抑えるのに役立ちます。以前はセカンダリNameNodeによって実行されていた役割を置き換えますが、まだ実戦投入の準備が整っているわけではありません。NameNodeは、システムに登録されているバックアップノードがない限り、複数のチェックポイントノードを同時に許可します。
バックアップノード:チェックポイントノードの拡張機能です。チェックポイントに加えて、NameNodeからの編集ストリームも受信し、アクティブなNameNode名前空間状態と常に同期している、名前空間の独自のメモリ内コピーを維持します。一度に1つのバックアップノードのみをNameNodeに登録できます。
次のドキュメントでは、Hadoopクラスタのインストールと設定方法について説明しています。
このドキュメントの残りの部分では、ユーザーが少なくとも1つのDataNodeを持つHDFSを設定して実行できると仮定しています。このドキュメントの目的のために、NameNodeとDataNodeの両方が同じ物理マシンで実行される可能性があります。
NameNodeとDataNodeはそれぞれ、クラスタの現在の状態に関する基本情報を表示するために、内部Webサーバーを実行します。デフォルトの設定では、NameNodeのフロントページはhttp://namenode-name:9870/
にあります。クラスタ内のDataNodeとクラスタの基本統計情報を一覧表示します。Webインターフェースを使用して、ファイルシステムを参照することもできます(NameNodeのフロントページにある「ファイルシステムを参照」リンクを使用)。
Hadoopには、HDFSおよびHadoopがサポートするその他のファイルシステムと直接対話するさまざまなシェルのようなコマンドが含まれています。コマンドbin/hdfs dfs -help
は、Hadoopシェルによってサポートされているコマンドを一覧表示します。さらに、コマンドbin/hdfs dfs -help command-name
は、コマンドの詳細なヘルプを表示します。これらのコマンドは、ファイルのコピー、ファイルのアクセス許可の変更など、ほとんどの通常のファイルシステム操作をサポートしています。また、ファイルのレプリケーションの変更など、いくつかのHDFS固有の操作もサポートしています。詳細については、「ファイルシステムシェルガイド」を参照してください。
bin/hdfs dfsadmin
コマンドは、いくつかのHDFS管理関連の操作をサポートしています。bin/hdfs dfsadmin -help
コマンドは、現在サポートされているすべてのコマンドを一覧表示します。例:
-report
:HDFSの基本統計を報告します。この情報の一部は、NameNodeのフロントページでも入手できます。
-safemode
:通常は必要ありませんが、管理者は手動でセーフモードに入ったり、セーフモードから抜け出したりできます。
-finalizeUpgrade
:前回のアップグレード中に作成されたクラスタの以前のバックアップを削除します。
-refreshNodes
:NameNodeに接続できるDataNodeのセットを使用して、NameNodeを更新します。デフォルトでは、NameNodeはdfs.hosts
、dfs.hosts.exclude
で定義されたファイル内のDataNodeホスト名を再読み込みします。dfs.hosts
に定義されているホストは、クラスタの一部であるDataNodeです。dfs.hosts
にエントリがある場合、そのエントリにあるホストのみがNameNodeに登録できます。dfs.hosts.exclude
のエントリは、デコミッションする必要があるDataNodeです。または、dfs.namenode.hosts.provider.classname
がorg.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
に設定されている場合、すべてのincludeホストとexcludeホストは、dfs.hosts
で定義されたJSONファイルに指定されます。DataNodeは、それらからのすべてのレプリカが他のDataNodeにレプリケートされると、デコミッションを完了します。デコミッションされたノードは自動的にシャットダウンされず、新しいレプリカの書き込みには選択されません。
-printTopology
:クラスタのトポロジを出力します。NameNodeから見た、ラックとラックに接続されているDataNodeのツリーを表示します。
コマンドの使用法については、「dfsadmin」を参照してください。
NameNodeは、ファイルシステムへの変更をネイティブファイルシステムファイルであるeditsに追記されたログとして保存します。NameNodeが起動すると、イメージファイルfsimageからHDFSの状態を読み込み、その後editsログファイルから変更を適用します。次に、新しいHDFSの状態をfsimageに書き込み、空のeditsファイルで通常の操作を開始します。NameNodeは起動時のみfsimageとeditsファイルをマージするため、ビジーなクラスタではeditsログファイルが時間の経過とともに非常に大きくなる可能性があります。editsファイルが大きくなるもう一つの副作用として、NameNodeの次回の再起動時間が長くなることが挙げられます。
セカンダリNameNodeは、fsimageとeditsログファイルを定期的にマージし、editsログのサイズを制限内に保ちます。そのメモリ要件はプライマリNameNodeと同程度であるため、通常はプライマリNameNodeとは別のマシンで実行されます。
セカンダリNameNodeでのチェックポイントプロセスの開始は、2つの設定パラメータによって制御されます。
dfs.namenode.checkpoint.period
は、デフォルトで1時間に設定されており、2つの連続するチェックポイント間の最大遅延時間を指定します。
dfs.namenode.checkpoint.txns
は、デフォルトで100万に設定されており、チェックポイントされていないNameNode上のトランザクションの数で、チェックポイント期間に達していない場合でも緊急チェックポイントを強制します。
セカンダリNameNodeは、最新のチェックポイントをプライマリNameNodeのディレクトリと同じ構造のディレクトリに保存します。そのため、チェックポイントされたイメージは、必要に応じてプライマリNameNodeによって常に読み取り可能になっています。
コマンドの使用方法については、secondarynamenodeを参照してください。
NameNodeは、名前空間の最新のチェックポイントであるfsimageと、チェックポイント以降の名前空間への変更のジャーナル(ログ)であるeditsという2つのファイルを使用して名前空間を永続化します。NameNodeが起動すると、fsimageとeditsジャーナルをマージして、ファイルシステムメタデータの最新ビューを提供します。その後、NameNodeは新しいHDFSの状態を使用してfsimageを上書きし、新しいeditsジャーナルを開始します。
チェックポイントノードは、名前空間のチェックポイントを定期的に作成します。アクティブなNameNodeからfsimageとeditsをダウンロードし、ローカルでマージして、新しいイメージをアクティブなNameNodeにアップロードします。チェックポイントノードは、そのメモリ要件がNameNodeと同程度であるため、通常はNameNodeとは別のマシンで実行されます。チェックポイントノードは、設定ファイルに指定されたノードで、bin/hdfs namenode -checkpointによって起動されます。
チェックポイント(またはバックアップ)ノードとその付属のWebインターフェースの場所は、dfs.namenode.backup.address
とdfs.namenode.backup.http-address
の設定変数によって設定されます。
チェックポイントノードでのチェックポイントプロセスの開始は、2つの設定パラメータによって制御されます。
dfs.namenode.checkpoint.period
は、デフォルトで1時間に設定されており、2つの連続するチェックポイント間の最大遅延時間を指定します。
dfs.namenode.checkpoint.txns
は、デフォルトで100万に設定されており、チェックポイントされていないNameNode上のトランザクションの数で、チェックポイント期間に達していない場合でも緊急チェックポイントを強制します。
チェックポイントノードは、最新のチェックポイントをNameNodeのディレクトリと同じ構造のディレクトリに保存します。これにより、チェックポイントされたイメージは、必要に応じてNameNodeによって常に読み取り可能になります。チェックポイントのインポートを参照してください。
クラスタ設定ファイルには、複数のチェックポイントノードを指定できます。
コマンドの使用方法については、namenodeを参照してください。
バックアップノードは、チェックポイントノードと同じチェックポイント機能を提供するだけでなく、アクティブなNameNodeの状態と常に同期されたファイルシステム名前空間のメモリ内コピーも保持します。ファイルシステム編集のジャーナルストリームをNameNodeから受け入れ、これをディスクに永続化するだけでなく、バックアップノードはそれらの編集をメモリ内の名前空間の独自のコピーにも適用するため、名前空間のバックアップを作成します。
バックアップノードは、既にメモリに名前空間の状態の最新の状態があるため、チェックポイントノードやセカンダリNameNodeのように、チェックポイントを作成するためにアクティブなNameNodeからfsimageとeditsファイルをダウンロードする必要はありません。バックアップノードのチェックポイントプロセスは、名前空間をローカルのfsimageファイルに保存し、editsをリセットするだけで済むため、より効率的です。
バックアップノードは名前空間のコピーをメモリに保持するため、そのRAM要件はNameNodeと同じです。
NameNodeは一度に1つのバックアップノードをサポートします。バックアップノードが使用されている場合は、チェックポイントノードを登録できません。複数のバックアップノードを同時に使用することは、将来サポートされる予定です。
バックアップノードは、チェックポイントノードと同じ方法で設定されます。bin/hdfs namenode -backup
で起動されます。
バックアップ(またはチェックポイント)ノードとその付属のWebインターフェースの場所は、dfs.namenode.backup.address
とdfs.namenode.backup.http-address
の設定変数によって設定されます。
バックアップノードを使用すると、永続ストレージを使用せずにNameNodeを実行し、名前空間の状態の永続化のすべての責任をバックアップノードに委任することができます。これを行うには、-importCheckpoint
オプションを使用してNameNodeを起動し、NameNode設定のeditsタイプの永続ストレージディレクトリdfs.namenode.edits.dir
を指定しません。
バックアップノードとチェックポイントノードの作成の背後にある動機についての完全な説明については、HADOOP-4539を参照してください。コマンドの使用方法については、namenodeを参照してください。
イメージとeditsファイルの他のすべてのコピーが失われた場合、最新のチェックポイントをNameNodeにインポートできます。そのためには、
dfs.namenode.name.dir
設定変数で指定された空のディレクトリを作成します。
設定変数dfs.namenode.checkpoint.dir
にチェックポイントディレクトリの場所を指定します。
そして、-importCheckpoint
オプションを使用してNameNodeを起動します。
NameNodeはdfs.namenode.checkpoint.dir
ディレクトリからチェックポイントをアップロードし、dfs.namenode.name.dir
に設定されたNameNodeディレクトリに保存します。合法的なイメージがdfs.namenode.name.dir
に含まれている場合、NameNodeは失敗します。NameNodeはdfs.namenode.checkpoint.dir
のイメージの一貫性を検証しますが、変更はしません。
コマンドの使用方法については、namenodeを参照してください。
HDFSデータは、常にDataNode全体に均一に配置されるとは限りません。一般的な理由の1つは、既存のクラスタに新しいDataNodeを追加することです。新しいブロック(ファイルのデータは一連のブロックとして格納されます)を配置する場合、NameNodeはこれらのブロックを受け取るDataNodeを選択する前に、さまざまなパラメータを考慮します。考慮事項の一部を以下に示します。
ブロックのレプリカの1つを、ブロックを書き込んでいるノードと同じノードに保持するポリシー。
ラック全体の損失からクラスタを保護するために、ブロックの異なるレプリカをラック全体に分散する必要があること。
レプリカの1つは通常、ファイルに書き込んでいるノードと同じラックに配置されるため、ラック間のネットワークI/Oが削減されます。
HDFSデータをクラスタ内のDataNode全体に均一に分散します。
複数の競合する考慮事項があるため、データはDataNode全体に均一に配置されない場合があります。HDFSは、ブロック配置を分析し、DataNode全体にデータを再バランスする管理者向けのツールを提供します。バランサーの簡単な管理者ガイドは、HADOOP-1652にあります。
バランサーは、ツールとして実行するか、長時間実行されるサービスとして実行するかの2つのモードをサポートします。
ツールモードでは、クラスタを最善の努力でバランスしようと試み、次の条件で終了します。
すべてのクラスタがバランスされています。
非常に多くの反復処理(デフォルトは5)でバイトが移動されません。
ブロックを移動できません。
クラスタのアップグレードが進行中です。
その他のエラー。
サービスモードでは、バランサーは長時間実行されるデーモサービスとして実行されます。動作は次のとおりです。
各ラウンドごとに、成功するまで、またはエラーで戻るまでクラスタのバランスを取ろうとします。
各ラウンド間のインターバルを設定できます。インターバルはdfs.balancer.service.interval
で設定されます。
予期しない例外が発生した場合、サービスを停止する前に数回試行します。これはdfs.balancer.service.retries.on.exception
で設定されます。
コマンドの使用方法については、balancerを参照してください。
HDFSクラスタは、各ノードが配置されているラックのトポロジを認識できます。データ容量と使用率を最適化するために、このトポロジを設定することが重要です。詳細については、共通ドキュメントのラック認識を確認してください。
起動時に、NameNodeはfsimageとeditsログファイルからファイルシステムの状態を読み込みます。その後、DataNodeがブロックを報告するのを待ってから、クラスタに十分なレプリカが既に存在するにもかかわらず、ブロックのレプリケーションを早期に開始しないようにします。この間、NameNodeはセーフモードのままです。NameNodeのセーフモードは、基本的にHDFSクラスタの読み取り専用モードであり、ファイルシステムやブロックへの変更は許可されません。通常、NameNodeはDataNodeがほとんどのファイルシステムブロックが使用可能であると報告した後、自動的にセーフモードを終了します。必要に応じて、bin/hdfs dfsadmin -safemode
コマンドを使用して、HDFSを明示的にセーフモードにすることができます。NameNodeのフロントページには、セーフモードがオンになっているかオフになっているかが表示されます。より詳細な説明と設定は、setSafeMode()
のJavaDocとして保持されています。
HDFSは、さまざまな不整合をチェックするためのfsckコマンドをサポートしています。これは、さまざまなファイルに関する問題(たとえば、ファイルのブロックの欠落やレプリケーション不足のブロック)を報告するために設計されています。ネイティブファイルシステムの従来のfsckユーティリティとは異なり、このコマンドは検出されたエラーを修正しません。通常、NameNodeは自動的にほとんどの回復可能な障害を修正します。デフォルトでは、fsckは開いているファイルを無視しますが、レポート中にすべてのファイルを選択するオプションを提供します。HDFS fsckコマンドはHadoopシェルコマンドではありません。bin/hdfs fsck
として実行できます。コマンドの使用方法については、fsckを参照してください。fsckは、ファイルシステム全体またはファイルのサブセットに対して実行できます。
HDFSは、委任トークンを取得してローカルシステムのファイルに保存するためのfetchdtコマンドをサポートしています。このトークンは後で、安全でないクライアントからセキュアなサーバー(たとえばNameNode)にアクセスするために使用できます。ユーティリティはRPCまたはHTTPS(Kerberos経由)を使用してトークンを取得するため、実行前にKerberosチケットが存在する必要があります(チケットを取得するにはkinitを実行します)。HDFS fetchdtコマンドはHadoopシェルコマンドではありません。bin/hdfs fetchdt DTfile
として実行できます。トークンを取得したら、HADOOP_TOKEN_FILE_LOCATION
環境変数を委任トークンファイルに設定することで、Kerberosチケットを持たずにHDFSコマンドを実行できます。コマンドの使用方法については、fetchdtコマンドを参照してください。
通常、複数のメタデータストレージの場所を設定します。その後、ストレージの場所の1つが破損した場合、他のストレージの場所の1つからメタデータを読み取ることができます。
ただし、使用可能なストレージの場所がすべて破損している場合はどうすればよいでしょうか?この場合、データの大部分を回復できる可能性のある、リカバリモードと呼ばれる特別なNameNode起動モードがあります。
次のようにして、リカバリモードでNameNodeを起動できます。namenode -recover
リカバリモードの場合、NameNodeはコマンドラインでデータの回復に実行できる可能性のある対処法について対話的にプロンプトを表示します。
プロンプトを表示したくない場合は、-force
オプションを指定できます。このオプションを使用すると、リカバリモードは常に最初の選択肢を選択します。通常、これは最も妥当な選択肢になります。
リカバリモードを使用するとデータが失われる可能性があるため、使用する前に必ず編集ログとfsimageをバックアップしてください。
既存クラスタでHadoopをアップグレードする場合、他のソフトウェアアップグレードと同様に、既存のアプリケーションに影響を与える新たなバグや互換性のない変更が存在し、事前に検出されなかった可能性があります。重要なHDFSインストールにおいて、データを失うことは選択肢ではありません。ましてや、HDFSを最初から再起動することもできません。HDFS管理者は、以前のバージョンのHadoopに戻り、アップグレード前の状態にクラスタをロールバックできます。HDFSアップグレードについては、Hadoopアップグレード Wikiページでより詳細に説明されています。HDFSは一度に1つのバックアップを持つことができます。アップグレード前に、管理者はbin/hadoop dfsadmin -finalizeUpgrade
コマンドを使用して既存のバックアップを削除する必要があります。以下に、一般的なアップグレード手順の概要を示します。
Hadoopソフトウェアをアップグレードする前に、既存のバックアップがあればファイナライズします。
クラスタを停止し、新しいバージョンのHadoopを配布します。
-upgrade
オプション付きで新しいバージョンを実行します(sbin/start-dfs.sh -upgrade
)。
ほとんどの場合、クラスタは正常に動作します。新しいHDFSが正常に動作すると判断された後(運用開始から数日後など)、アップグレードをファイナライズします。クラスタがファイナライズされるまで、アップグレード前に存在していたファイルを削除しても、DataNode上の実際のディスク容量は解放されません。
以前のバージョンに戻す必要がある場合、
クラスタを停止し、以前のバージョンのHadoopを配布します。
NameNodeでロールバックコマンドを実行します(bin/hdfs namenode -rollback
)。
ロールバックオプション付きでクラスタを起動します(sbin/start-dfs.sh -rollback
)。
新しいバージョンのHDFSにアップグレードする際には、新しいバージョンのHDFSで予約されているパスを名前変更または削除する必要があります。NameNodeがアップグレード中に予約済みパスを検出すると、次のようなエラーが表示されます。
/.reservedは予約済みパスであり、.snapshotはこのバージョンのHDFSでは予約済みパスコンポーネントです。ロールバックしてこのパスを削除または名前変更するか、-renameReserved [キーバリューペア]オプションを使用してアップグレード時にこれらのパスを自動的に名前変更してください。
-upgrade -renameReserved [オプションのキーバリューペア]
を指定すると、NameNodeは起動時に検出された予約済みパスを自動的に名前変更します。たとえば、すべての.snapshot
という名前のパスを.my-snapshot
に、.reserved
を.my-reserved
に名前変更するには、-upgrade -renameReserved .snapshot=.my-snapshot,.reserved=.my-reserved
を指定します。
-renameReserved
にキーバリューペアを指定しない場合、NameNodeは予約済みパスに.<LAYOUT-VERSION>.UPGRADE_RENAMED
というサフィックスを追加します(例:.snapshot.-51.UPGRADE_RENAMED
)。
この名前変更プロセスにはいくつかの注意点があります。可能であれば、アップグレード前にhdfs dfsadmin -saveNamespace
を実行することをお勧めします。これは、編集ログ操作が自動的に名前変更されたファイルの宛先を参照する場合、データの不整合が発生する可能性があるためです。
Datanodeはホットスワップ可能なドライブをサポートしています。ユーザーは、DataNodeをシャットダウンせずにHDFSデータボリュームを追加または交換できます。以下に、一般的なホットスワップドライブ手順の概要を示します。
新しいストレージディレクトリがある場合は、それらをフォーマットし、適切にマウントする必要があります。
ユーザーは、アクティブに使用されるデータボリュームディレクトリを反映するように、DataNodeの設定dfs.datanode.data.dir
を更新します。
ユーザーはdfsadmin -reconfig datanode HOST:PORT start
を実行して再構成プロセスを開始します。ユーザーはdfsadmin -reconfig datanode HOST:PORT status
を使用して、再構成タスクの実行状況を問い合わせることができます。HOST:PORTの代わりに、livenodesをDatanodeに対して指定することもできます。これにより、特定のDatanode(HOST:PORTで表される)での再構成の開始または問い合わせのみを許可するのに対し、すべてのライブDatanodeで再構成の開始または問い合わせが可能になります。livenodesクエリには、dfsadmin -reconfig datanode livenodes start
およびdfsadmin -reconfig datanode livenodes status
があります。
再構成タスクが完了したら、ユーザーは削除されたデータボリュームディレクトリを安全にumount
し、物理的にディスクを削除できます。
ファイルのパーミッションは、Linuxなどの他の一般的なプラットフォームのファイルパーミッションと同様になるように設計されています。現在、セキュリティは単純なファイルパーミッションに限定されています。NameNodeを起動するユーザーは、HDFSのスーパーユーザーとして扱われます。将来のバージョンのHDFSでは、Kerberosなどのネットワーク認証プロトコルを使用して、ユーザー認証とデータ転送の暗号化をサポートします。詳細は、パーミッションガイドで説明されています。
Hadoopは現在、数千ノードのクラスタで実行されています。 PoweredBy Wikiページには、大規模クラスタにHadoopを展開している組織の一部がリストされています。HDFSはクラスタごとに1つのNameNodeを持っています。現在、NameNodeで使用可能な総メモリが、スケーラビリティの主要な制限要因となっています。非常に大規模なクラスタでは、HDFSに保存されているファイルの平均サイズを大きくすることで、NameNodeのメモリ要件を増やすことなくクラスタサイズを大きくすることができます。デフォルトの設定は大規模クラスタには適していない場合があります。FAQ Wikiページには、大規模Hadoopクラスタのための推奨される設定の改善点がリストされています。
このユーザーガイドは、HDFSを使用するための良い出発点です。ユーザーガイドは継続的に改善されていますが、HadoopとHDFSに関する膨大なドキュメントがあります。以下は、さらなる調査の出発点です。