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

【概要】Ubuntu 24.04 LTS 環境に Apache Hadoop 3.3.6 をインストールし、擬似分散モードで動作させる手順を示す。OpenJDK 11、SSH 設定、Hadoop 実行用ユーザーの作成、設定ファイル(core-site.xml, hdfs-site.xml, yarn-site.xml, mapred-site.xml, hadoop-env.sh)の編集、NameNode のフォーマット、デーモン起動、WordCount サンプル実行までを解説する。

インストール前の準備

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

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

OpenJDK 11 のインストール

Hadoop の実行には Java Development Kit (JDK) が必要である。Apache Hadoop 3.3 系がサポートする Java は Java 8Java 11 (実行時のみ) である。ここでは OpenJDK 11 をインストールする。

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

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

java -version

OpenJDK 11 が使用されていることを確認すること。既定の Java を切り替えるには sudo update-alternatives --config java を実行する。また、JDK のインストールディレクトリを確認しておく。OpenJDK 11 では /usr/lib/jvm/java-11-openjdk-amd64 である。このパスは後述する Hadoop の設定で使用する。

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

Hadoop の起動スクリプトはローカルホストを含む各ノードへの接続に SSH を使用するため、OpenSSH サーバをインストールし、設定を行う。

  1. OpenSSH サーバのインストール
    sudo apt update
    sudo apt -y install openssh-server
    
  2. SSH アクセス制御の設定

    SSH 接続を許可するユーザや接続元 IP アドレスを制限する。Ubuntu 24.04 LTS では ufw (ファイアウォール)/etc/ssh/sshd_config 内の設定 (AllowUsers, AllowGroups, Match Address など) で制御する。例えば、SSH でのログインを hadoop ユーザのみに限定するには、/etc/ssh/sshd_config に次の行を追加し、sudo systemctl restart ssh で設定を反映する。

    AllowUsers hadoop
    

    設定項目の詳細は SSH サーバ のドキュメントを参照すること。

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

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

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

    作成した hadoop ユーザでログインし直し、パスワードなしで localhost に SSH 接続できるように公開鍵認証を設定する。起動スクリプトは対話的な入力なしに SSH 接続を行うため、鍵にはパスフレーズを設定しない。パスフレーズを設定した鍵を使う場合は、起動前に ssh-agent に鍵を登録しておく必要がある。

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

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

    ssh localhost
    # パスワードなしでログインできれば成功。exit で抜ける。
    

    ログインできない場合は、~/.ssh ディレクトリやファイルのパーミッション (chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys)、/etc/ssh/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) に移動し、ダウンロードしたファイルを展開する。展開により /usr/local/hadoop-3.3.6 が作成される。
    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 ユーザに変更する。シンボリックリンク自身の所有者を変更するために -h オプションを使用する。
    sudo chown -R hadoop:hadoop /usr/local/hadoop-3.3.6
    sudo chown -h 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 mkdir -p /usr/local/hadoop-datastore/tmp
    sudo chown -R hadoop:hadoop /usr/local/hadoop-datastore
    

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

ここからの設定は、hadoop ユーザで行う。次のコマンドで hadoop ユーザのログインシェルに切り替える。

sudo -u hadoop -i

環境変数の設定

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

# /home/hadoop/.bashrc に追記

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
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) にある。Hadoop 3 系では、以下のファイルはいずれも既定で存在する。

  1. hadoop-env.sh:

    JAVA_HOME を設定する。起動スクリプトは SSH 経由で非対話シェルを起動するため、.bashrc の設定が読み込まれない場合がある。このファイルでの指定が確実である。

    # $HADOOP_CONF_DIR/hadoop-env.sh 内
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
    
  2. core-site.xml:

    HDFS の NameNode の URI と、一時ディレクトリのベースパスを設定する。

    # $HADOOP_CONF_DIR/core-site.xml
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://localhost:9000</value>
            <description>The default file system URI</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 のレプリケーション係数 (擬似分散モードでは 1) と、NameNode および DataNode のデータディレクトリパスを設定する。

    # $HADOOP_CONF_DIR/hdfs-site.xml
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
            <description>Default block replication.</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 を指定する。

    # $HADOOP_CONF_DIR/mapred-site.xml
    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
            <description>The runtime framework for executing MapReduce jobs.</description>
        </property>
        <!-- MapReduce の各プロセスに Hadoop のインストール先を渡す -->
        <property>
            <name>yarn.app.mapreduce.am.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
        </property>
        <property>
            <name>mapreduce.map.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
        </property>
        <property>
            <name>mapreduce.reduce.env</name>
            <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
        </property>
        <!-- Job History Server の設定 -->
        <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 の設定を行う。NodeManager の補助サービスとして mapreduce_shuffle を指定し、ResourceManager のホスト名とリソース量を設定する。

    # $HADOOP_CONF_DIR/yarn-site.xml
    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
            <description>Auxiliary service for MapReduce shuffle.</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 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 のストレージディレクトリをフォーマットする。この操作は既存の HDFS データを削除するため、初回のみ実行する。

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

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

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

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

Apache Hadoop デーモンの起動

HDFS デーモン (NameNode, DataNode, SecondaryNameNode) と YARN デーモン (ResourceManager, NodeManager) を起動する。

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

起動後、jps コマンドを実行して、NameNode, DataNode, SecondaryNameNode, ResourceManager, NodeManager の各 Java プロセスが起動していることを確認する。表示されないプロセスがある場合は、$HADOOP_HOME/logs 内の該当ログファイルで原因を確認する。

jps

Web UI による状態確認

Hadoop デーモンの状態は Web ブラウザからも確認できる。主要な Web UI の既定の URL は次の通りである。

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

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

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

    MapReduce ジョブを実行する。入力は HDFS 上の input ディレクトリ、出力は HDFS 上の output ディレクトリである。出力ディレクトリは実行前に存在していてはならない。

    hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output
    
  3. 実行結果の確認:

    HDFS 上の output ディレクトリにある結果ファイルの内容を表示する。

    hdfs dfs -cat output/*
    

    以下のような単語カウントの結果が表示されれば成功である。

    example	1
    hadoop	2
    hello	2
    world	2
    

Apache Hadoop デーモンの終了

Hadoop の利用が終わったら、デーモンを停止する。

stop-yarn.sh
stop-dfs.sh

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

HDFS を操作するための基本的なコマンド例 (hdfs dfs プレフィックスを使用)。