HDFS のアーキテクチャと操作

HadoopHadoopBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Hadoopの主なコンポーネントの1つであるHDFSについて続けて説明します。この実験を学ぶことで、HDFSの動作原理と基本操作、およびHadoopソフトウェアアーキテクチャにおけるWebHDFSのアクセス方法を理解することができます。

HDFSの概要

その名の通り、HDFS(Hadoop Distributed File System)はHadoopフレームワーク内の分散ストレージのコンポーネントであり、フォールトトレラントで拡張可能です。

HDFSは、Hadoopクラスタの一部として、または単独のユニバーサルな分散ファイルシステムとして使用できます。たとえば、HBaseはHDFSをベースに構築されており、Sparkもデータソースの1つとしてHDFSを使用できます。HDFSのアーキテクチャと基本操作を学ぶことは、特定のクラスタの構成、改善、診断に大きな役立ちます。

HDFSは、Hadoopアプリケーションによって使用される分散ストレージであり、データのソースと宛先です。HDFSクラスタは主に、ファイルシステムのメタデータを管理する**NameNodesと、実際のデータを格納するDataNodesで構成されています。アーキテクチャは、以下の図に示すように、NameNodesDataNodes、およびClients**間の相互作用パターンを示しています。

HDFSアーキテクチャ相互作用図
この図はHadoopの公式サイトから引用しています。

HDFSの概要のまとめ:

  • HDFSの概要:HDFS(Hadoop Distributed File System)は、Hadoopフレームワーク内のフォールトトレラントで拡張可能な分散ストレージコンポーネントです。
  • アーキテクチャ:HDFSクラスタは、メタデータを管理するNameNodesと、実際のデータを格納するDataNodesで構成されています。アーキテクチャは、1つのNameNodeと複数のDataNodeからなるマスター/スレーブモデルに従っています。
  • ファイルストレージ:HDFSのファイルは、DataNodesにまたがって格納されるブロックに分割され、デフォルトのブロックサイズは64MBです。
  • 操作:NameNodeはファイルシステムの名前空間操作を処理し、DataNodesはクライアントからの読み書き要求を管理します。
  • 相互作用:クライアントは、メタデータのためにNameNodeと通信し、ファイルデータのために直接DataNodesと相互作用します。
  • 展開:通常、単一の専用ノードがNameNodeを実行し、他の各ノードがDataNodeインスタンスを実行します。HDFSはJavaを使用して構築されており、さまざまな環境間での移植性を提供します。

HDFSに関するこれらのポイントを理解することは、効果的にHadoopクラスタを構成、最適化、診断するのに役立ちます。

ファイルシステムの概要

ファイルシステムの名前空間

  • 階層的な組織:HDFSと従来のLinuxファイルシステムの両方が、ディレクトリツリー構造を持つ階層的なファイル組織をサポートしており、ユーザーやアプリケーションがディレクトリを作成し、ファイルを保存できるようにしています。
  • アクセスと操作:ユーザーは、コマンドラインやAPIなどのさまざまなアクセスインターフェイスを通じてHDFSと相互作用でき、ファイルの作成、削除、移動、名前変更などの操作が可能です。
  • 機能サポート:バージョン3.3.6では、HDFSはユーザークォータ、アクセス権限、ハードリンク、ソフトリンクを実装していません。ただし、将来のリリースでは、アーキテクチャがそれらの実装を可能にするため、これらの機能をサポートする可能性があります。
  • NameNode管理:HDFSのNameNodeは、ファイルシステムの名前空間とプロパティのすべての変更を処理し、ファイルのレプリケーションファクターを管理します。これは、HDFS上で維持するファイルのコピー数を指定します。

データコピー

開発当初、HDFSは、大規模なクラスタにおいて、ノード間で交差し、高度に信頼性の高い方法で非常に大きなファイルを保存するように設計されました。前述のとおり、HDFSはブロック単位でファイルを保存します。具体的には、各ファイルをブロックのシーケンスとして保存します。最後のブロックを除き、ファイル内のすべてのブロックは同じサイズです。

HDFSデータレプリケーション図
この図はHadoopの公式サイトから引用しています。

HDFSのデータレプリケーションと高可用性:

  • データレプリケーション:HDFSでは、ファイルは複数のDataNodeにまたがってレプリケーションされるブロックに分割され、フォールトトレラントを確保します。レプリケーションファクターは、ファイルを作成または変更する際に指定でき、任意の時点で各ファイルには1つのライターがいます。
  • レプリケーション管理:NameNodeは、DataNodeからのハートビートとブロックステータスレポートを受け取ることで、ファイルブロックのコピー方法を管理します。DataNodeは、ハートビートを通じてその動作状態を報告し、ブロックステータスレポートには、DataNodeに保存されているすべてのブロックに関する情報が含まれています。
  • 高可用性:HDFSは、ディスク破損やその他の故障の場合に、クラスタの他の部分から失われたファイルコピーを内部的に復元することで、ある程度の高可用性を提供します。このメカニズムは、分散ストレージシステム内のデータの整合性と信頼性を維持するのに役立ちます。

ファイルシステムメタデータの永続化

  • 名前空間管理:ファイルシステムのメタデータを含むHDFS名前空間は、NameNodeに保存されます。ファイルシステムのメタデータのすべての変更は、EditLogに記録され、これはファイル作成などのトランザクションを永続化します。EditLogは、ローカルファイルシステムに保存されます。
  • FsImage:ブロックからファイルへのマッピングや属性など、ファイルシステムの名前空間全体が、FsImageと呼ばれるファイルに保存されます。このファイルも、NameNodeが存在するローカルファイルシステムに保存されます。
  • チェックポイントプロセス:チェックポイントプロセスでは、NameNode起動時にディスクからFsImageとEditLogを読み取ります。EditLog内のすべてのトランザクションが、メモリ内のFsImageに適用され、その後、永続化のためにディスクに保存されます。このプロセスの後、古いEditLogをトリムできます。現在のバージョン(3.3.6)では、チェックポイントはNameNode起動時にのみ発生しますが、将来のバージョンでは、信頼性とデータの整合性を向上させるため、定期的なチェックポイントが導入される可能性があります。

その他の機能

  • TCP/IPベース:HDFSのすべての通信プロトコルは、TCP/IPプロトコルスイートの上に構築されており、分散ファイルシステム内のノード間での信頼性の高いデータ交換を確保します。
  • クライアントプロトコル:クライアントとNameNodeの間の通信は、クライアントプロトコルを通じて円滑になされます。クライアントは、NameNode上の構成可能なTCPポートに接続を開始して、ファイルシステムのメタデータと相互作用します。
  • DataNodeプロトコル:DataNodeとNameNodeの間の通信は、DataNodeプロトコルに依存しています。DataNodeは、分散ストレージシステムの一部として、その状態を報告し、ハートビート信号を送信し、データブロックを転送するためにNameNodeと通信します。
  • リモートプロシージャコール(RPC):クライアントプロトコルとDataNodeプロトコルの両方は、リモートプロシージャコール(RPC)メカニズムを使用して抽象化されています。NameNodeは、DataNodeまたはクライアントによって開始されたRPC要求に応答し、通信プロセスにおいて受動的な役割を維持します。

以下は、拡張読み取り用の資料です:

ユーザーを切り替える

タスクコードを記述する前に、まずhadoopユーザーに切り替える必要があります。デスクトップ上のXfce端末をダブルクリックして開き、次のコマンドを入力します。hadoopユーザーのパスワードはhadoopです。ユーザーを切り替える際に必要になります。

su - hadoop
labex:~/ $ su - hadoop
hadoop:~$

ヒントhadoopユーザーのパスワードはhadoopです。

HDFSの初期化

HDFSを初めて使用する前に、NameNodeを初期化する必要があります。この操作は、ディスクをフォーマットする操作と比較できますので、HDFSにデータを保存する際には、このコマンドを慎重に使用してください。

それ以外の場合は、このセクションの実験を再起動してください。「デフォルト環境」を使用して、次のコマンドでHDFSを初期化します。

/home/hadoop/hadoop/bin/hdfs namenode -format

ヒント:上記のコマンドはHDFSファイルシステムをフォーマットしますので、コマンドを実行する前にHDFSデータディレクトリを削除する必要があります。

そのため、Hadoopに関するサービスを停止して、Hadoopデータを削除する必要があります。

stop-all.sh
rm -rf ~/hadoopdata

次のメッセージが表示されたら、初期化が完了しています。

2024-03-01 11:16:10,439 INFO common.Storage: Storage directory /home/hadoop/hadoopdata/hdfs/namenode has been successfully formatted.

ファイルのインポート

HDFSは、ローカルディスクの上に構築された階層型の分散ストレージシステムであるため、HDFSを使用する前にデータをインポートする必要があります。

最初に、いくつかのファイルを用意する最も便利な方法は、Hadoopの設定ファイルを例にすることです。

まず、HDFSデーモンを起動する必要があります。

/home/hadoop/hadoop/sbin/start-dfs.sh

サービスを確認する。

hadoop:~$ jps
8341 SecondaryNameNode
7962 NameNode
8474 Jps
8107 DataNode

ディレクトリを作成し、端末に次のコマンドを入力してデータをコピーします。

cd /home/hadoop
mkdir sample_data
cp -r /home/hadoop/hadoop/etc/hadoop/* sample_data/

ディレクトリの内容を一覧表示する。

hadoop:~$ ls /home/hadoop/sample_data/
capacity-scheduler.xml kms-log4j.properties
configuration.xsl kms-site.xml
...

HDFS上の任意の操作は、hdfs dfsで始まり、対応する操作パラメータで補完されます。最も一般的に使用されるパラメータはputであり、次のように使用され、端末に入力できます。

/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/hadoop-policy.xml /policy.xml

ディレクトリの内容を一覧表示する。

hadoop:~$ hdfs dfs -ls /policy.xml
-rw-r--r-- 1 hadoop supergroup 11765 2024-03-01 11:37 /policy.xml

コマンドの最後の/policy.xmlは、HDFSに保存されるファイル名がpolicy.xmlで、パスが/(ルートディレクトリ)であることを意味します。以前のファイル名を引き続き使用したい場合は、パス/を直接指定できます。

複数のファイルをアップロードする必要がある場合は、ローカルディレクトリのファイルパスを連続して指定し、HDFSのターゲット格納パスで終了させることができます。

/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop
/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/httpfs-env.sh /home/hadoop/sample_data/mapred-env.sh /user/hadoop

ディレクトリの内容を一覧表示する。

hadoop:~$ hdfs dfs -ls /user/hadoop
Found 2 items
-rw-r--r-- 1 hadoop supergroup 1484 2024-03-01 11:42 /user/hadoop/httpfs-env.sh
-rw-r--r-- 1 hadoop supergroup 1764 2024-03-01 11:42 /user/hadoop/mapred-env.sh

パス関連のパラメータを指定する場合、ルールはLinuxシステムと同じです。ワイルドカード(たとえば*.sh)を使用して操作を簡略化することができます。

ファイル操作

同様に、指定したディレクトリ内のファイルを一覧表示するには、-lsパラメータを使用します。

/home/hadoop/hadoop/bin/hdfs dfs -ls /user/hadoop

ここに表示されるファイルは、実験環境によって異なる場合があります。

ファイルの内容を表示する必要がある場合は、catパラメータを使用できます。最も簡単な考え方は、HDFS上のファイルパスを直接指定することです。HDFS上のファイルとローカルディレクトリを比較する必要がある場合は、それぞれのパスを別々に指定できます。ただし、ローカルディレクトリはfile://指示子で始める必要があり、その後にファイルパスを付け加える必要があります(たとえば/home/hadoop/.bashrc、先頭の/を忘れないでください)。そうでなければ、ここで指定された任意のパスは、デフォルトでHDFS上のパスとして認識されます。

/home/hadoop/hadoop/bin/hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh

出力は次のとおりです。

hadoop:~$ hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh
## ~/.bashrc: executed by bash(1) for non-login shells.
## see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
## for examples

## If not running interactively, don't do anything
case $- in
...

ファイルを別のパスにコピーする必要がある場合は、cpパラメータを使用できます。

/home/hadoop/hadoop/bin/hdfs dfs -cp /user/hadoop/mapred-env.sh /user/hadoop/copied_file.txt

同様に、ファイルを移動する必要がある場合は、mvパラメータを使用します。これは基本的にLinuxファイルシステムコマンド形式と同じです。

/home/hadoop/hadoop/bin/hdfs dfs -mv /user/hadoop/mapred-env.sh /moved_file.txt

lsrパラメータを使用して、現在のディレクトリの内容、サブディレクトリの内容を含めて一覧表示します。出力は次のとおりです。

hdfs dfs -lsr /

HDFS上のファイルに新しいコンテンツを追加したい場合は、appendToFileパラメータを使用できます。また、追加するローカルファイルパスを指定する際には、複数指定できます。最後のパラメータが追加対象となります。ファイルはHDFS上に存在している必要があり、そうでない場合はエラーが報告されます。

echo 1 >> a.txt
echo 2 >> b.txt
/home/hadoop/hadoop/bin/hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh

追加が成功したかどうかを確認するために、ファイルの末尾(ファイルの最後の部分)の内容を表示するには、tailパラメータを使用できます。

/home/hadoop/hadoop/bin/hdfs dfs -tail /user/hadoop/mapred-env.sh

tailコマンドの出力を確認する。

hadoop:~$ echo 1 >> a.txt
echo 2 >> b.txt
hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh
hadoop:~$ hdfs dfs -tail /user/hadoop/mapred-env.sh
1
2

ファイルまたはディレクトリを削除する必要がある場合は、rmパラメータを使用します。このパラメータには、-r-fを付けることもでき、これらはLinuxファイルシステムコマンドrmと同じ意味を持ちます。

/home/hadoop/hadoop/bin/hdfs dfs -rm /moved_file.txt

ファイルmoved_file.txtの内容が削除され、コマンドは次の出力を返します。'Deleted /moved_file.txt'

ディレクトリ操作

前の内容では、HDFSでディレクトリを作成する方法を学びました。実際、一度に複数のディレクトリを作成する必要がある場合は、複数のディレクトリのパスを直接パラメータとして指定できます。-pパラメータは、親ディレクトリが存在しない場合に自動的に作成されることを示します。

/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop/dir1 /user/hadoop/dir2/sub_dir1

特定のファイルまたはディレクトリがどのくらいのスペースを占めているかを確認したい場合は、duパラメータを使用できます。

/home/hadoop/hadoop/bin/hdfs dfs -du /user/hadoop/

出力は次のとおりです。

hadoop:~$ hdfs dfs -du /user/hadoop/
1764 1764 /user/hadoop/copied_file.txt
0 0 /user/hadoop/dir1
0 0 /user/hadoop/dir2
1484 1484 /user/hadoop/httpfs-env.sh
4 4 /user/hadoop/mapred-env.sh

ファイルのエクスポート

前のセクションでは、主にHDFS内のファイルとディレクトリ操作を紹介しました。MapReduceなどのアプリケーションで計算が行われ、結果を記録したファイルが生成された場合、そのファイルをLinuxシステムのローカルディレクトリにエクスポートするには、getパラメータを使用できます。

ここで最初のパスパラメータはHDFS内のパスを指し、最後のパスはローカルディレクトリに保存するパスを指します。

/home/hadoop/hadoop/bin/hdfs dfs -get /user/hadoop/mapred-env.sh /home/hadoop/exported_file.txt

エクスポートが成功すると、ローカルディレクトリにファイルが見つかります。

cd ~
ls

出力は次のとおりです。

a.txt b.txt exported_file.txt hadoop hadoopdata sample_data

HadoopのWeb操作

Web管理インターフェイス

各NameNodeまたはDataNodeは内部でWebサーバーを実行し、クラスタの現在の状態などの基本情報を表示します。デフォルトの設定では、NameNodeのホームページはhttp://localhost:9870/です。ここには、DataNodeとクラスタの基本統計が表示されます。

Webブラウザを開き、アドレスバーに次のように入力します。

http://localhost:9870/

概要の中の現在の「クラスタ」におけるアクティブなDataNodeノードの数を確認できます。

このWebインターフェイスを使って、HDFS内のディレクトリやファイルを参照することもできます。上部のメニューバーで、「ユーティリティ」の下にある「ファイルシステムを参照する」リンクをクリックします。

HDFS file system browser interface

Hadoopクラスタを停止する

ここでは、WebHDFSの基本操作の一部を紹介しました。WebHDFSのドキュメントには、さらに詳細な説明があります。この実験はここまでです。習慣として、Hadoopクラスタを停止する必要があります。

/home/hadoop/hadoop/sbin/stop-yarn.sh
/home/hadoop/hadoop/sbin/stop-dfs.sh
hadoop:~$ jps
11633 Jps

まとめ

この実験では、HDFSのアーキテクチャを紹介しました。また、コマンドラインから基本的なHDFS操作コマンドを学び、その後HDFSのWebアクセスパターンに移行しました。これにより、HDFSが外部アプリケーションに対する本格的なストレージサービスとして機能するようになります。

この実験では、WebHDFSでのファイル削除のシナリオは一切挙げていません。ドキュメントをご自身で確認してください。公式ドキュメントにはさらに多くの機能が隠されているので、ドキュメントの読み込みに興味を持ち続けるようにしてください。

以下は、拡張読み込み用の資料です。