Dockerを用いたHDFSクラスタ構築ガイド

本記事では、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がクラスタ全体を代表します。

タグ: Docker Hadoop HDFS クラスタ構築 コンテナ

10月31日 20:59 投稿