Apache Hadoop のインストール(Ubuntu 上)

Ubuntu 24.04 LTSにHadoop 3.3.6を擬似分散モードで導入する。OpenJDK 17/21、SSH鍵設定、hadoopユーザー作成、core-site.xml, hdfs-site.xml等設定、Namenodeフォーマット、start-dfs.sh/start-yarn.shでのデーモン起動、WordCount実行、Web UI(localhost:9870, localhost:8088)での確認手順を含む。

インストール前の準備

Apache Hadoop インストールディレクトリを事前に決めておくこと. このページでは,次のように仮定する.

前提ソフトウェアのインストールと設定 (Ubuntu 24.04 LTS)

OpenJDK のインストール

Hadoop の実行には Java Development Kit (JDK) が必要である。Ubuntu 24.04 LTS では OpenJDK 17 や 21 (LTS) が標準リポジトリから容易にインストールできる。ここでは OpenJDK 17 をインストールする例を示す。

sudo apt update
sudo apt -y install openjdk-17-jdk

(補足: 最新の LTS である OpenJDK 21 を使用する場合は `openjdk-21-jdk` をインストールする。`default-jdk` パッケージでも最新版が導入できる。)

インストール後、バージョンを確認する。

java -version

複数の Java バージョンがインストールされている場合、`sudo update-alternatives --config java` コマンドで使用するバージョンを切り替えることができる。Hadoop が使用する JDK のインストールディレクトリを確認しておくこと (例: /usr/lib/jvm/java-17-openjdk-amd64)。このパスは後述する Hadoop の設定 (hadoop-env.sh) で正確に指定する必要がある。

OpenSSH サーバのインストールと設定

Hadoop はノード間の通信に SSH を使用するため、OpenSSH サーバをインストールし、設定を行う。

  1. OpenSSH サーバのインストール
    sudo apt update
    sudo apt -y install openssh-server
    
  2. SSH サービスの自動起動設定 (推奨)

    システム起動時に SSH サービスが自動的に開始されるように設定する。

    sudo systemctl enable ssh
    sudo systemctl start ssh
    
  3. SSH アクセス制御の設定 (推奨)

    セキュリティ向上のため、SSH接続を許可する IP アドレスやユーザを制限することが強く推奨される。Ubuntu 24.04 LTS では ufw (ファイアウォール)/etc/ssh/sshd_config ファイル内の設定 (AllowUsers, AllowGroups, Match Address など) で制御するのが一般的である。

    具体的な設定方法は SSH サーバ のドキュメント等を参照すること。少なくとも、Hadoop を実行するユーザ (例: `hadoop` ユーザ) のみがパスワードなし SSH ログインできるように設定する必要がある。

Hadoop 実行用ユーザの作成と SSH 設定

Hadoop プロセスを実行するための専用ユーザを作成する。ここではユーザ名を `hadoop` とする。

  1. Hadoop 実行用ユーザ (`hadoop`) の作成
    sudo adduser hadoop
    # 指示に従いパスワード等を入力
    
  2. `hadoop` ユーザでの SSH 設定 (パスワードなしログイン)

    作成した `hadoop` ユーザでログインし直し、パスワードなしで localhost に SSH 接続できるように公開鍵認証を設定する。

    # hadoop ユーザで実行
    ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 0600 ~/.ssh/authorized_keys
    

    (注意: -P '' オプションはパスワードなしのキーを生成するが、セキュリティを考慮する場合はパスフレーズを設定することが推奨される。)

    設定後、`hadoop` ユーザで localhost への SSH ログインを試行し、パスワードを要求されずにログインできることを確認する。

    ssh localhost
    # パスワードなしでログインできれば成功。初回接続時は確認(yes/no)が表示される場合がある。
    # 確認後、 exit で抜ける。
    

    もしログインできない場合は、~/.ssh ディレクトリやファイルのパーミッション (chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys)、sshd_config の設定 (特に `PubkeyAuthentication yes`、`AuthorizedKeysFile .ssh/authorized_keys`)、ファイアウォールの設定などを確認すること。SSH サーバのログ (sudo journalctl -u ssh/var/log/auth.log 等) も問題解決の手がかりとなる。

Apache Hadoop 3.3.6 のインストール手順

ダウンロード

  1. Apache Hadoop のダウンロード用 Web ページを開く: https://hadoop.apache.org/releases.html
  2. 目的のバージョン (例: 3.3.6) の「Binary」リンクをクリックする。
  3. 表示されるミラーサイト一覧から、適切なサイトを選択し、`hadoop-3.3.6.tar.gz` (バイナリ版) をダウンロードする。
  4. ダウンロードしたファイル (`hadoop-3.3.6.tar.gz`) を、一時ディレクトリ(例えば /tmp)に置く。

インストール

  1. Apache Hadoop を展開するディレクトリ (例: /usr/local) に移動し、ダウンロードしたファイルを展開する。
    cd /usr/local
    sudo tar -xzf /tmp/hadoop-3.3.6.tar.gz
    
  2. バージョンに依存しないシンボリックリンクを作成すると管理が容易になる。
    sudo ln -s /usr/local/hadoop-3.3.6 /usr/local/hadoop
    
  3. 展開したディレクトリと関連ファイルの所有者を `hadoop` ユーザに変更する。
    sudo chown -R hadoop:hadoop /usr/local/hadoop-3.3.6
    sudo chown -R hadoop:hadoop /usr/local/hadoop
    
  4. HDFS が使用するデータディレクトリを作成し、権限を設定する (例: `/usr/local/hadoop-datastore`)。
    sudo mkdir -p /usr/local/hadoop-datastore/namenode
    sudo mkdir -p /usr/local/hadoop-datastore/datanode
    sudo chown -R hadoop:hadoop /usr/local/hadoop-datastore
    

Hadoop の設定 (擬似分散モード)

これ以降の設定は、`hadoop` ユーザで行うとスムーズである。

sudo -u hadoop -i

環境変数の設定

`hadoop` ユーザのシェル設定ファイル (/home/hadoop/.bashrc) に以下の環境変数を追加する。これにより、Hadoop コマンドや設定ファイルへのパスが適切に設定される。

# /home/hadoop/.bashrc に追記

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64  # インストールしたJDKパスに合わせる
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# YARN を使用する場合に必要な変数
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME

設定を反映させるため、ファイルを再読み込みする。

source ~/.bashrc

Hadoop 設定ファイルの編集

以下の主要な設定ファイルを編集し、擬似分散モードで動作するように設定する。設定ファイルは $HADOOP_CONF_DIR (通常は `/usr/local/hadoop/etc/hadoop`) に配置されている。

  1. hadoop-env.sh:

    Hadoop が使用する `JAVA_HOME` を明示的に設定する。`.bashrc` での設定に加えて、ここでも正確に設定することが推奨される。

    # $HADOOP_CONF_DIR/hadoop-env.sh 内のコメントアウトされている行を編集または追記
    export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 # .bashrc と同じパスを指定
    
  2. core-site.xml:

    HDFS のデフォルトファイルシステム (NameNode) の URI と、Hadoop が使用する一時ディレクトリのベースパスを設定する。

    # $HADOOP_CONF_DIR/core-site.xml
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://localhost:9000</value>
            <description>The default file system URI. Use hdfs://namenode_hostname:port for cluster.</description>
        </property>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/hadoop-datastore/tmp</value>
            <description>A base for other temporary directories.</description>
        </property>
    </configuration>
    
  3. hdfs-site.xml:

    HDFS の設定を行う。擬似分散モードでは、全デーモンが単一ノードで動作するため、ブロックのレプリケーション係数 (dfs.replication) は 1 に設定する。また、NameNode と DataNode がメタデータやブロックデータを保存するディレクトリパスを指定する。

    # $HADOOP_CONF_DIR/hdfs-site.xml
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
            <description>Default block replication. Set to 1 for pseudo-distributed mode.</description>
        </property>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>file:/usr/local/hadoop-datastore/namenode</value>
            <description>Directory where NameNode stores metadata.</description>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>file:/usr/local/hadoop-datastore/datanode</value>
            <description>Directory where DataNode stores blocks.</description>
        </property>
    </configuration>
    
  4. mapred-site.xml:

    MapReduce の設定を行う。実行フレームワークとして YARN を指定する。デフォルトでは `mapred-site.xml` は存在しないため、テンプレート (`mapred-site.xml.template`) をコピーして作成する。

    # $HADOOP_CONF_DIR/ に移動して実行
    cp mapred-site.xml.template mapred-site.xml
    
    # $HADOOP_CONF_DIR/mapred-site.xml
    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
            <description>The runtime framework for executing MapReduce jobs (e.g., yarn, local).</description>
        </property>
        <!-- Job History Server の設定 (MapReduceジョブの履歴を追跡する場合) -->
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>localhost:10020</value>
        </property>
        <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>localhost:19888</value>
        </property>
    </configuration>
    
  5. yarn-site.xml:

    YARN (Yet Another Resource Negotiator) の設定を行う。MapReduce ジョブを実行するために、NodeManager の補助サービスとして `mapreduce_shuffle` を指定する。また、ResourceManager のホスト名や NodeManager が利用可能なリソース (メモリ、CPU コア数) を設定する。

    # $HADOOP_CONF_DIR/yarn-site.xml
    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
            <description>Auxiliary service needed for MapReduce shuffle functionality.</description>
        </property>
        <property>
            <name>yarn.nodemanager.env-whitelist</name>
            <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
            <description>Environment variables to be passed from NodeManager to containers.</description>
        </property>
        <!-- ResourceManager のホスト名 (擬似分散モードでは localhost) -->
        <property>
             <name>yarn.resourcemanager.hostname</name>
             <value>localhost</value>
        </property>
        <!-- NodeManager のリソース設定 (マシンスペックに応じて調整) -->
        <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>2048</value> <!-- 例: 2GB。物理メモリ量を超えないように注意 -->
        </property>
        <property>
            <name>yarn.nodemanager.resource.cpu-vcores</name>
            <value>2</value> <!-- 例: 2コア。物理コア数を超えないように注意 -->
        </property>
    </configuration>
    

HDFS のフォーマット

HDFS を初めて使用する前に、NameNode 用に指定したストレージディレクトリ (dfs.namenode.name.dir) をフォーマットする必要がある。この操作は HDFS 内の既存データをすべて削除するため、クラスタの初回セットアップ時のみ実行すること。

# hadoop ユーザで実行
hdfs namenode -format

"Storage directory ... has been successfully formatted." というメッセージと "Exiting with status 0" が表示されれば成功である。

Apache Hadoop の起動と動作確認 (擬似分散モード)

以下の操作は、引き続き `hadoop` 実行用ユーザで行う。

Apache Hadoop デーモンの起動

HDFS デーモン (NameNode, DataNode, SecondaryNameNode) と YARN デーモン (ResourceManager, NodeManager) を起動する。`start-dfs.sh` が HDFS を、`start-yarn.sh` が YARN をそれぞれ起動する。

# $HADOOP_HOME/sbin ディレクトリにパスが通っていることを確認
start-dfs.sh
start-yarn.sh

デーモンが正常に起動したかを確認するために、`jps` (Java Virtual Machine Process Status Tool) コマンドを実行する。`NameNode`, `DataNode`, `SecondaryNameNode`, `ResourceManager`, `NodeManager` の各 Java プロセスが表示されていれば、正常に起動している。

jps
# 以下のようなプロセスが表示されるはず (PID は異なる)
# xxxx Jps
# xxxx NameNode
# xxxx DataNode
# xxxx SecondaryNameNode
# xxxx ResourceManager
# xxxx NodeManager

(補足: Job History Server を起動する場合は `mapred --daemon start historyserver` コマンドを実行する。)

Web UI による状態確認 (推奨)

Hadoop デーモンの状態は Web ブラウザからも確認できる。主要な Web UI のデフォルト URL は以下の通りである。

これらのインターフェースにアクセスし、クラスタの状態や実行中のジョブに関する情報を確認できる。

サンプルプログラム wordcount の実行

Hadoop クラスタが正しく動作しているかを確認するために、付属の WordCount サンプルプログラムを実行してみる。

  1. テスト用データの準備と HDFS への転送:
    # HDFS 上にユーザディレクトリと入力用ディレクトリを作成 (初回のみ)
    hdfs dfs -mkdir -p /user/hadoop/input
    
    # ローカルにテストファイルを作成
    mkdir -p ~/hadoop_input
    echo "hadoop hdfs yarn mapreduce" > ~/hadoop_input/file1.txt
    echo "hdfs yarn example hadoop" > ~/hadoop_input/file2.txt
    
    # 作成したファイルを HDFS の input ディレクトリにコピー
    hdfs dfs -put ~/hadoop_input/* /user/hadoop/input
    
  2. WordCount ジョブの実行 (擬似分散モード):

    MapReduce ジョブとして WordCount を実行する。入力パスとして HDFS 上の `input` ディレクトリを、出力パスとして HDFS 上の `output` ディレクトリを指定する (出力ディレクトリは実行前に存在しないこと)。

    # ジョブを実行 (JARファイルのパスはバージョンに合わせて確認)
    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hadoop/input /user/hadoop/output
    
  3. 実行結果の確認:

    ジョブが正常に完了したら、HDFS 上の `output` ディレクトリに生成された結果ファイルの内容を表示する。

    # 結果ファイルの内容を表示 (通常 part-r-00000 というファイル名)
    hdfs dfs -cat /user/hadoop/output/*
    

    以下のような単語ごとのカウント結果が表示されれば、擬似分散モードでの Hadoop 実行は成功である。

    example	1
    hadoop	2
    hdfs	2
    mapreduce	1
    yarn	2
    

Apache Hadoop デーモンの終了

Hadoop の利用が終了したら、起動したデーモンを安全に停止する。

stop-yarn.sh
stop-dfs.sh
# Job History Server を起動した場合は mapred --daemon stop historyserver も実行

参考: HDFS (Hadoop Distributed File System) の操作コマンド

HDFS を操作するための基本的なコマンド例。最新の Hadoop バージョンでは `hdfs dfs` プレフィックスの使用が推奨されている (`hadoop fs` も互換性のために利用可能)。