はじめに
この実験では、Hadoopの主なコンポーネントの1つであるHDFSについて続けて説明します。この実験を学ぶことで、HDFSの動作原理と基本操作、およびHadoopソフトウェアアーキテクチャにおけるWebHDFSのアクセス方法を理解することができます。
この実験では、Hadoopの主なコンポーネントの1つであるHDFSについて続けて説明します。この実験を学ぶことで、HDFSの動作原理と基本操作、およびHadoopソフトウェアアーキテクチャにおけるWebHDFSのアクセス方法を理解することができます。
その名の通り、HDFS(Hadoop Distributed File System)はHadoopフレームワーク内の分散ストレージのコンポーネントであり、フォールトトレラントで拡張可能です。
HDFSは、Hadoopクラスタの一部として、または単独のユニバーサルな分散ファイルシステムとして使用できます。たとえば、HBaseはHDFSをベースに構築されており、Sparkもデータソースの1つとしてHDFSを使用できます。HDFSのアーキテクチャと基本操作を学ぶことは、特定のクラスタの構成、改善、診断に大きな役立ちます。
HDFSは、Hadoopアプリケーションによって使用される分散ストレージであり、データのソースと宛先です。HDFSクラスタは主に、ファイルシステムのメタデータを管理する**NameNodesと、実際のデータを格納するDataNodesで構成されています。アーキテクチャは、以下の図に示すように、NameNodes、DataNodes、およびClients**間の相互作用パターンを示しています。
この図はHadoopの公式サイトから引用しています。
HDFSの概要のまとめ:
HDFSに関するこれらのポイントを理解することは、効果的にHadoopクラスタを構成、最適化、診断するのに役立ちます。
開発当初、HDFSは、大規模なクラスタにおいて、ノード間で交差し、高度に信頼性の高い方法で非常に大きなファイルを保存するように設計されました。前述のとおり、HDFSはブロック単位でファイルを保存します。具体的には、各ファイルをブロックのシーケンスとして保存します。最後のブロックを除き、ファイル内のすべてのブロックは同じサイズです。
この図はHadoopの公式サイトから引用しています。
HDFSのデータレプリケーションと高可用性:
以下は、拡張読み取り用の資料です:
タスクコードを記述する前に、まずhadoop
ユーザーに切り替える必要があります。デスクトップ上のXfce
端末をダブルクリックして開き、次のコマンドを入力します。hadoop
ユーザーのパスワードはhadoop
です。ユーザーを切り替える際に必要になります。
su - hadoop
labex:~/ $ su - hadoop
hadoop:~$
ヒント:hadoop
ユーザーのパスワードはhadoop
です。
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
各NameNodeまたはDataNodeは内部でWebサーバーを実行し、クラスタの現在の状態などの基本情報を表示します。デフォルトの設定では、NameNodeのホームページはhttp://localhost:9870/
です。ここには、DataNodeとクラスタの基本統計が表示されます。
Webブラウザを開き、アドレスバーに次のように入力します。
http://localhost:9870/
概要の中の現在の「クラスタ」におけるアクティブなDataNodeノードの数を確認できます。
このWebインターフェイスを使って、HDFS内のディレクトリやファイルを参照することもできます。上部のメニューバーで、「ユーティリティ」の下にある「ファイルシステムを参照する」リンクをクリックします。
ここでは、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でのファイル削除のシナリオは一切挙げていません。ドキュメントをご自身で確認してください。公式ドキュメントにはさらに多くの機能が隠されているので、ドキュメントの読み込みに興味を持ち続けるようにしてください。
以下は、拡張読み込み用の資料です。