Vagrant で VM を用意して Hadoop Cluster を構築してみました。
ZooKeeper の設定が面倒なため HA 構成にはしていません。
手順
以下のような手順で Hadoop Cluster を構築します。
- VM 構築
- ユーザ作成
- JDK インストール
- Hadoop インストール
- hosts 設定
- SSH 設定
- Hadoop 設定
- NameNode フォーマット
ユーザ、サーバを意識する必要がある箇所にはコマンドの先頭行にコメントで user@server のように記載しました。
VM 構築
Vagrant で VM を構築します。
- Master : 1 台
- Slave : 3 台
> cd e:\vagrant\hadoop
> ls
share Vagrantfile
> vagrant up
master_cnt = 1
slave_cnt = 3
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.synced_folder "./share", "/home/vagrant/share", owner: "vagrant", group: "vagrant"
#--- MasterNode 構築 ---#
(1..master_cnt).each do |i|
config.vm.define "master#{i}" do | master |
master.disksize.size = '30GB'
master.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
master.vm.hostname = "master#{i}"
master.vm.network "private_network", ip: "192.168.33.1#{i}"
master.vm.provision :hosts, :sync_hosts => true
end
end
#--- /MasterNode 構築 ---#
#--- SlaveNode 構築 ---#
(1..slave_cnt).each do |i|
config.vm.define "slave#{i}" do | slave |
slave.disksize.size = '30GB'
slave.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
slave.vm.hostname = "slave#{i}"
slave.vm.network "private_network", ip: "192.168.33.2#{i}"
slave.vm.provision :hosts, :sync_hosts => true
end
end
#--- /SlaveNode 構築 ---#
end
ユーザ作成
Hadoop 実行ユーザを作成します。
$ sudo useradd hadoop -s /bin/bash -m
JDK インストール
$ sudo apt install openjdk-8-jdk -y
Hadoop インストール
# hadoop バイナリ取得
$ cd ~
$ wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-2.10.0/hadoop-2.10.0.tar.gz
# hadoop バイナリ展開
$ cd /opt
$ sudo tar xf ~/hadoop-2.10.0.tar.gz
$ sudo chown -R hadoop:hadoop ./hadoop-2.10.0/
# シンボリックリンク作成
$ sudo ln -s hadoop-2.8.0 hadoop
$ sudo chown -h hadoop:hadoop ./hadoop
hosts
/etc/hosts に以下のような行があったら削除します。
削除しないと MasterNode-SlaveNode 間でうまく通信できません。
127.0.0.1 localhost
127.0.1.1 hostname
そして以下のように hosts を修正します。
$ cat /etc/hosts
192.168.33.11 master1
192.168.33.21 slave1
192.168.33.22 slave2
192.168.33.23 slave3
SSH
MasterNode から SlaveNode に SSH 接続できるように設定します。
まず MasterNode で鍵を作成します。
# hadoop@master1
# hadoop ユーザで公開鍵を作成する
$ sudo su - hadoop
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat <<EOL >> ~/.ssh/config
Host *
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
LogLevel quiet
EOL
$ cat ~/.ssh/id_rsa.pub
各 SlaveNode で公開鍵を登録します。
# hadoop@slave1
# hadoop@slave2
# hadoop@slave3
# hadoop ユーザで公開鍵を登録する
$ sudo su - hadoop
$ cd ~
$ mkdir .ssh
$ echo "master1で表示した公開鍵" >> ~/.ssh/authorized_keys
$ cat <<EOL >> ~/.ssh/config
Host *
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
LogLevel quiet
EOL
念のため MasterNode から各 SlaveNode に SSH 接続できるか確認します。
# hadoop@master1
$ ssh slave1
$ exit
$ ssh slave2
$ exit
$ ssh slave3
$ exit
Hadoop 設定
変数設定
シェルの設定で Java と Hadoop の PATH を通します。
これは全 VM で実施します。
# hadoop@master1
# hadoop@slave1
# hadoop@slave2
# hadoop@slave3
$ sudo su - hadoop
$ cat << 'EOF' >> ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
EOF
$ source ~/.bashrc
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
$ hadoop version
Hadoop 2.10.0
Subversion ssh://git.corp.linkedin.com:29418/hadoop/hadoop.git -r e2f1f118e465e787d8567dfa6e2f3b72a0eb9194
Compiled by jhung on 2019-10-22T19:10Z
Compiled with protoc 2.5.0
From source with checksum 7b2d8877c5ce8c9a2cca5c7e81aa4026
This command was run using /opt/hadoop-2.10.0/share/hadoop/common/hadoop-common-2.10.0.jar
設定ファイル編集
/opt/hadoop/etc/hadoop/ 配下にある以下の設定ファイルを編集します。
- hadoop-config.sh
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
- slaves
MasterNode で全て編集して SlaveNode に配布します。
hadoop-config.sh
また、Hadoop の設定でも PATH を通します(これをしないとうまくいかなかった)。
# hadoop@master1
$ vi /opt/hadoop/libexec/hadoop-config.sh
# 先頭に追記する
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
core-site.xml
core-site.xml で NameNode を設定します。
今回は master1 を NameNode とします。
# hadoop@master1
$ vi /opt/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.33.11:9000</value>
</property>
</configuration>
hdfs-site.xml
hdfs-site.xml で以下の設定をします。
- レプリカ数
- NameNode のデータ格納先
- DataNode のデータ格納先
# hadoop@master1
$ vi /opt/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/opt/hadoop/data</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/opt/hadoop/name</value>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml
分散処理フレームワークに YARN を指定します。
# hadoop@master1
$ cp /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapred-site.xml
$ vi /opt/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
ResourceManager を指定します。
# hadoop@master1
$ vi /opt/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.33.11</value>
</property>
</configuration>
slaves
SlaveNode がどれかを指定します。
# hadoop@master1
$ cat << 'EOF' > /opt/hadoop/etc/hadoop/slaves
slave1
slave2
slave3
EOF
設定ファイル配布
全ての設定ファイルを編集したら各 SlaveNode に配布します。
# hadoop@master1
$ for node in slave1 slave2 slave3; do scp /opt/hadoop/libexec/hadoop-config.sh $node:/opt/hadoop/libexec/hadoop-config.sh; done;
$ for node in slave1 slave2 slave3; do scp /opt/hadoop/etc/hadoop/* $node:/opt/hadoop/etc/hadoop/; done;
NameNode ディレクトリ作成
# hadoop@master1
$ sudo mkdir -p /opt/hadoop/name
$ sudo chown -R hadoop:hadoop /opt/hadoop/
DataNode ディレクトリ作成
# hadoop@slave1
# hadoop@slave2
# hadoop@slave3
$ sudo mkdir -p /opt/hadoop/data
$ sudo chown -R hadoop:hadoop /opt/hadoop/
NameNode フォーマット
Hadoop の設定が完了したら NameNode をフォーマットします。
# hadoop@master1
$ /opt/hadoop/bin/hdfs namenode -format
HDFS 起動
まずは HDFS を起動します。
# hadoop@master1
$ /opt/hadoop/sbin/start-dfs.sh
Starting namenodes on [master1]
master1: starting namenode, logging to /opt/hadoop-2.10.0/logs/hadoop-hadoop-namenode-master1.out
slave2: starting datanode, logging to /opt/hadoop-2.10.0/logs/hadoop-hadoop-datanode-slave2.out
slave1: starting datanode, logging to /opt/hadoop-2.10.0/logs/hadoop-hadoop-datanode-slave1.out
slave3: starting datanode, logging to /opt/hadoop-2.10.0/logs/hadoop-hadoop-datanode-slave3.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/hadoop-2.10.0/logs/hadoop-hadoop-secondarynamenode-master1.out
MasterNode の 50070 に http アクセスすると HDFS の管理画面を表示されます( http://192.168.33.11:50070 )。
MasterNode では NameNode が、SlaveNode では DataNode が起動しています。
# hadoop@master1
$ jps
30105 NameNode
30539 Jps
30366 SecondaryNameNode
# hadoop@slave1
$ jps
25860 Jps
25673 DataNode
# hadoop@slave2
$ jps
24613 Jps
24522 DataNode
# hadoop@slave3
$ jps
24485 Jps
24406 DataNode
YARN 起動
次に YARN を起動します。
# hadoop@master1
$ /opt/hadoop/sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop-2.10.0/logs/yarn-hadoop-resourcemanager-master1.out
slave2: starting nodemanager, logging to /opt/hadoop-2.10.0/logs/yarn-hadoop-nodemanager-slave2.out
slave1: starting nodemanager, logging to /opt/hadoop-2.10.0/logs/yarn-hadoop-nodemanager-slave1.out
slave3: starting nodemanager, logging to /opt/hadoop-2.10.0/logs/yarn-hadoop-nodemanager-slave3.out
MasterNode の 8088 に http アクセスすると HDFS の管理画面を表示されます( http://192.168.33.11:8088 )。
MasterNode では ResourceManager が、SlaveNode では NodeManager が起動しています。
# hadoop@master1
$ jps
4290 NameNode
4738 ResourceManager
18183 Jps
4572 SecondaryNameNode
# hadoop@slave1
$ jps
26257 Jps
25673 DataNode
26140 NodeManager
# hadoop@slave2
$ jps
24816 NodeManager
24916 Jps
24522 DataNode
# hadoop@slave3
$ jps
24406 DataNode
24747 Jps
24670 NodeManager
確認
# hadoop@master1
$ hdfs dfsadmin -report
Configured Capacity: 93476536320 (87.06 GB)
Present Capacity: 83203604480 (77.49 GB)
DFS Remaining: 83202056192 (77.49 GB)
DFS Used: 1548288 (1.48 MB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (3):
Name: 192.168.33.21:50010 (slave1)
Hostname: slave1
Decommission Status : Normal
Configured Capacity: 31158845440 (29.02 GB)
DFS Used: 1052672 (1.00 MB)
Non DFS Used: 3407339520 (3.17 GB)
DFS Remaining: 27733676032 (25.83 GB)
DFS Used%: 0.00%
DFS Remaining%: 89.01%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 21 07:07:17 UTC 2019
Last Block Report: Thu Nov 21 06:39:45 UTC 2019
Name: 192.168.33.22:50010 (slave2)
Hostname: slave2
Decommission Status : Normal
Configured Capacity: 31158845440 (29.02 GB)
DFS Used: 413696 (404 KB)
Non DFS Used: 3408097280 (3.17 GB)
DFS Remaining: 27733557248 (25.83 GB)
DFS Used%: 0.00%
DFS Remaining%: 89.01%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 21 07:07:17 UTC 2019
Last Block Report: Thu Nov 21 06:52:30 UTC 2019
Name: 192.168.33.23:50010 (slave3)
Hostname: slave3
Decommission Status : Normal
Configured Capacity: 31158845440 (29.02 GB)
DFS Used: 81920 (80 KB)
Non DFS Used: 3407163392 (3.17 GB)
DFS Remaining: 27734822912 (25.83 GB)
DFS Used%: 0.00%
DFS Remaining%: 89.01%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Nov 21 07:07:19 UTC 2019
Last Block Report: Thu Nov 21 06:39:45 UTC 2019
MasterNode がちゃんと SlaveNode を認識してることが確認出来ました。
試しに用意されている MapReduce タスクを実行します。
# hadoop@master1
$ hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.0.jar pi 10 10000
...
Job Finished in 23.326 seconds
Estimated value of Pi is 3.14120000000000000000
円周率の計算が 23 秒で完了しました。
参考
https://kapibara-sos.net/archives/137
https://blog.amedama.jp/entry/2017/06/06/040651