Hadoopの勉強をはじめたので、vagrantubuntu 16.04を立ち上げてHadoopをインストールしてみた:

インストール概要

各ライブラリのパス

パス 権限 説明
/opt/hadoop-x.y.z yarn:hadoop Hadoop
/var/data/hadoop/hdfs/nn hdfs:hadoop NameNodeディレクトリ
/var/data/hadoop/hdfs/snn hdfs:hadoop SecondaryNameNodeディレクトリ
/var/data/hadoop/hdfs/dn hdfs:hadoop DataNodeディレクトリ
/opt/hadoop-x.y.z/logs yarn:hadoop 各サービスのログ

x.y.zはバージョンを表す、この記事では2.9.0となります

環境変数

変数名 説明
JAVA_HOME JavaのHomeディレクトリ
HADOOP_HOME HadoopのHomeディレクトリ

ユーザー・グループ

タイプ 名前 説明
グループ hadoop hadoop群
ユーザ yarn YARNユーザ
ユーザ hdfs HDFSユーザ
ユーザ mapred MapReduceユーザ

設定ファイル

設定ファイルは/opt/hadoop-2.9.0/etc/hadoop$HADOOP_HOME/etc/hadoop)に入っています

パス 説明
core-site.xml コア設定
hdfs-site.xml HDFS設定
yarn-site.xml YARN設定
mapred-site.xml MapReduce設定

環境

基本的にJavaあれば大丈夫って感じです。

Java1.8

下記のコマンドでインストール

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

バージョン確認

java -version

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

手順

Apache Hadoopをダウンロード

cd ~
wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz

/optに解凍:

cd /opt
sudo tar xvzf ~/hadoop-2.9.0.tar.gz

環境変数JAVA_HOMEHADOOP_HOMEを設定

/etc/profile.d/java.shに下記の行を追加:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/

/etc/profile.d/hadoop.shに下記の行を追加

export HADOOP_HOME=/opt/hadoop-2.9.0
export PATH=$HADOOP_HOME/bin:$PATH

ご自身使用したバージョンに合わせてください

環境変数を有効化する:

source /etc/profile.d/java.sh
source /etc/profile.d/hadoop.sh

ユーザ・グループ作成

sudo groupadd hadoop
sudo useradd -g hadoop yarn
sudo useradd -g hadoop hdfs
sudo useradd -g hadoop mapred

データとLog用のディレクトリを作成

# NameNode用
sudo mkdir -p /var/data/hadoop/hdfs/nn

# SecondaryNameNode用
sudo mkdir -p /var/data/hadoop/hdfs/snn

# DataNode用
sudo mkdir -p /var/data/hadoop/hdfs/dn

sudo chown -R hdfs:hadoop /var/data/hadoop/hdfs
sudo mkdir -p /var/log/hadoop/yarn
sudo chown -R yarn:hadoop /var/log/hadoop/yarn

hadoopディレクトリの権限設定

cd /opt/hadoop-2.9.0
sudo mkdir logs
sudo chmod g+w logs
sudo chown -R yarn:hadoop .

xml設定ファイルを編集

/opt/hadoop-2.9.0/etc/hadoop/core-site.xml

キー 説明
fs.default.name NameNodeのホスト名とポート
hadoop.http.staticuser.user HDFSユーザ

中身:

<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
  </property>
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>hdfs</value>
  </property>
</configuration>

/opt/hadoop-2.9.0/etc/hadoop/hdfs-site.xml

キー 説明
dfs.replication レプリケーション
dfs.namenode.name.dir NameNodeのディレクトリ
fs.checkpoint.dir チェックポイントディレクトリ
fs.checkpoint.edits.dir チェックポイント編集履歴ディレクトリ
dfs.datanode.data.dir DataNodeディレクトリ

中身:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/var/data/hadoop/hdfs/nn</value>
  </property>
  <property>
    <name>fs.checkpoint.dir</name>
    <value>file:/var/data/hadoop/hdfs/snn</value>
  </property>
  <property>
    <name>fs.checkpoint.edits.dir</name>
    <value>file:/var/data/hadoop/hdfs/snn</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/var/data/hadoop/hdfs/dn</value>
  </property>
</configuration>

/opt/hadoop-2.9.0/etc/hadoop/mapred-site.xml

/opt/hadoop-2.9.0/etc/hadoop/mapred-site.xml.templateからコピーして作成:

cd /opt/hadoop-2.9.0/etc/hadoop/
sudo cp mapred-site.xml.template mapred-site.xml

下記のように設定:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/mr-history/tmp</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/mr-history/done</value>
  </property>
</configuration>

/opt/hadoop-2.9.0/etc/hadoop/yarn-site.xml

キー 説明
yarn.nodemanager.aux-services 補助サービス
yarn.nodemanager.aux-services.mapreduce.shuffle.class 補助サービスのハンドラ

中身:

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandle</value>
  </property>
</configuration>

HDFS初期化

hdfsユーザに切り替えて、hdfsコマンドを使用:

su -hdfs
cd /opt/hadoop-2.9.0/bin
./hdfs namenode -format

ユーザがrootじゃない場合はsudo -irootユーザになってからsuしてください

すると大量なメッセージが表示されます。

INFO common.Storage: Storage directory /var/data/hadoop/hdfs/nn has been successfully formatted.

というメッセージがあれば初期化完了。ここで、hdfsユーザのままでHDFSサービスを起動します。まずはnamenode:

cd ../sbin
./hadoop-daemon.sh start namenode

starting namenode, logging to /opt/hadoop-2.9.0/logs/hadoop-hdfs-namenode-ubuntu-xenial.out

同じのりで、secondarynamenodedatanodeも起動できます:

./hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /opt/hadoop-2.9.0/logs/hadoop-hdfs-secondarynamenode-ubuntu-xenial.out

./hadoop-daemon.sh start datanode
starting datanode, logging to /opt/hadoop-2.9.0/logs/hadoop-hdfs-datanode-ubuntu-xenial.out

jpsコマンドで今動いているプロセス確認できる:

jps

3154 SecondaryNameNode
3300 Jps
3065 NameNode
3212 DataNode

サービスを停止するには、./hadoop-daemon.sh stop <サービス>を使ってください

hdfs dfs -mkdir -p /mr-history/tmp
hdfs dfs -mkdir -p /mr-history/done
hdfs dfs -chown -R yarn:hadoop  /mr-history
hdfs dfs -mkdir -p /user/hdfs

hdfsユーザの操作終わったので、一旦exit

exit

ResourceManagerとNodeManagerを起動

./yarn-daemon.sh start <サービス名>resourcemanagernodemanagerを起動します:

su - yarn
cd /opt/hadoop-2.9.0/sbin/
./yarn-daemon.sh start resourcemanager

starting resourcemanager, logging to /opt/hadoop-2.9.0/logs/yarn-yarn-resourcemanager-ubuntu-xenial.out

./yarn-daemon.sh start nodemanager

starting nodemanager, logging to /opt/hadoop-2.9.0/logs/yarn-yarn-nodemanager-ubuntu-xenial.out

./mr-jobhistory-daemon.shhistoryserverを起動します:

historyserverは実行しているJobを追跡するサービスです

./mr-jobhistory-daemon.sh start historyserver

starting historyserver, logging to /opt/hadoop-2.9.0/logs/mapred-yarn-historyserver-ubuntu-xenial.out

同様に、jps確認する:

jps

3989 JobHistoryServer
3768 NodeManager
4089 Jps
3518 ResourceManager

Web UI

HDFSとYARNのResourceManagerはWeb UIがあるので、ブラウザで確認できる

サンプルのMapReduceを走らせてみる

su - hdfs

export HADOOP_EXAMPLES=/opt/hadoop-2.9.0/share/hadoop/mapreduce
yarn jar $HADOOP_EXAMPLES/hadoop-mapreduce-examples-2.9.0.jar pi 16 1000
Number of Maps  = 16
Samples per Map = 1000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Wrote input for Map #10
Wrote input for Map #11
Wrote input for Map #12
Wrote input for Map #13
Wrote input for Map #14
Wrote input for Map #15
Starting Job

...

17/12/17 10:35:47 INFO mapreduce.Job:  map 0% reduce 0%
17/12/17 10:36:07 INFO mapreduce.Job:  map 13% reduce 0%
17/12/17 10:36:08 INFO mapreduce.Job:  map 38% reduce 0%
17/12/17 10:36:25 INFO mapreduce.Job:  map 50% reduce 0%
17/12/17 10:36:26 INFO mapreduce.Job:  map 75% reduce 0%
17/12/17 10:36:39 INFO mapreduce.Job:  map 88% reduce 0%
17/12/17 10:36:40 INFO mapreduce.Job:  map 100% reduce 0%
17/12/17 10:36:41 INFO mapreduce.Job:  map 100% reduce 100%
17/12/17 10:36:41 INFO mapreduce.Job: Job job_1513506414235_0001 completed successfully

...

Job Finished in 65.666 seconds
Estimated value of Pi is 3.14250000000000000000

まとめ

NameNodeとかResourceManagerとか、サービスがいっぱい出てきてあまり消化できてないが、とりあえずサンプル動いたので、一旦しめます。今回は一台のサーバで完結したので、あまり「分散」の感覚がないですね〜

今度は複数サーバに分散して独自のプログラムを動かしてみようと思います。

参考:https://www.safaribooksonline.com/library/view/hadoop-2-quick-start/9780134050119/