本記事では、Dockerを活用してHDFSクラスタを効率的に構築する手順を解説します。HDFSクラスタの設定は、Hadoopクラスタ設定の代表例であり、Dockerを利用することで、開発環境の構築が格段に容易になります。
各ノードの設定について
HDFSクラスタを構成する各ノード、特にNameNodeとDataNode間での設定の差異について説明します。NameNodeはDataNodeをSSH経由で管理するため、NameNode側の設定が重要となります。しかし、本構築例では、Dockerイメージを用いて共通の設定ファイルを各ノードに同期させるため、個別の設定変更は最小限に抑えます。
構築手順の概要
まず、HadoopがプリインストールされたDockerイメージをベースに、クラスタ全体で共有可能な設定を行った後、そのイメージから複数のコンテナを生成し、HDFSクラスタを構成します。
ベースイメージの準備
最初に、hadoop_protoという名前のDockerイメージから一時コンテナを作成し、クラスタ設定のベースとします。
docker run -d --name=hadoop_temp --privileged hadoop_proto /usr/sbin/init
次に、Hadoopの設定ファイルディレクトリに移動します。
cd $HADOOP_HOME/etc/hadoop
ここでは、以下の構成のHDFSクラスタを想定します。
- NameNode: 1台 (
nn) - DataNode: 2台 (
dn1,dn2)
まず、workersファイルを編集し、DataNodeのホスト名を記述します。
dn1
dn2
次に、core-site.xmlファイルに以下の設定を追加します。
<!-- HDFSのデフォルトファイルシステム設定 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://nn:9000</value>
</property>
<!-- Hadoopの一時ディレクトリ設定 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:///home/hadoop/tmp</value>
</property>
続けて、hdfs-site.xmlファイルに以下の設定を追加します。
<!-- データブロックのレプリケーション数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- NameNodeのメタデータ保存ディレクトリ -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hdfs/name</value>
</property>
SSHの設定も行います。これにより、NameNodeからDataNodeへの接続が可能になります。
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
ssh-copy-id -i ~/.ssh/id_rsa hadoop@localhost
これでベースとなるコンテナの設定は完了です。コンテナを停止し、新しいDockerイメージcluster_protoとしてコミットします。
docker stop hadoop_temp
docker commit hadoop_temp cluster_proto
必要であれば、一時コンテナhadoop_tempは削除しても構いません。
HDFSクラスタのデプロイ
次に、作成したcluster_protoイメージを使用してHDFSクラスタをデプロイします。
まず、Hadoopクラスタ専用のDockerネットワークhnetを作成します。
docker network create --subnet=172.20.0.0/16 hnet
続いて、各クラスタノードとなるコンテナを作成します。
docker run -d --name=nn --hostname=nn --network=hnet --ip=172.20.1.0 --add-host=dn1:172.20.1.1 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn1 --hostname=dn1 --network=hnet --ip=172.20.1.1 --add-host=nn:172.20.1.0 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn2 --hostname=dn2 --network=hnet --ip=172.20.1.2 --add-host=nn:172.20.1.0 --add-host=dn1:172.20.1.1 --privileged cluster_proto /usr/sbin/init
NameNodeコンテナに入り、HDFSをフォーマットします。
docker exec -it nn su hadoop
hdfs namenode -format
エラーが発生しなければ、HDFSを起動します。
start-dfs.sh
jpsコマンドを実行し、NameNodeおよびSecondaryNameNodeプロセスがNameNodeコンテナで実行されていることを確認します。DataNodeプロセスは、dn1とdn2コンテナで実行されます。
これでHDFSクラスタは正常に動作します。クラスタの操作やHDFSへのアクセスは、以前の擬似クラスタ構成と同様の方法で行えます。NameNodeがクラスタ全体を代表します。