VagrantでHadoop Clusterを構築する方法まとめ

bigdata ビッグデータ

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

タイトルとURLをコピーしました