前回、Hadoop環境を構築しStandaloneモードで動作確認出来たため、今度は完全分散モードで動作を確認する。
準備
各サーバーからパスワード無しで接続出来るようにする。この作業を行っておくとマスターの起動とスレーブの起動を1コマンドで実行出来るようになる。
#鍵を生成
ssh-keygen -t rsa
#各サーバーに公開鍵をコピー
ssh-copy-id -i /home/foo/.ssh/id_rsa.pub foo@192.168.0.xxx
#パスワード無しでログイン出来ることを確認
ssh 192.168.0.xxx
データ保存用のUSBハードディスクを起動時にマウントするようにする。
#USBハードディスクのパスを確認
sudo fdisk -l
#UUIDを確認
sudo blkid /dev/sda1 #パスは環境毎に異なる可能性があるため注意
sudo vi /etc/fstab
#下記の1行を追記
UUID=xxx-xxx-xxx-xxx-xxx /mnt/usbhdd ext4 defaults 0 0 #UUIDは機器毎に異なるため注意
#再起動して自動的にマウントされることを確認
sudo shutdown -r now
ホスト名を/etc/hostsに記載する。Hadoopの設定でIPアドレスを使用するとエラーが発生するため、ここでホスト名を設定しておく。
sudo vi /etc/hosts
192.168.0.xx1 master1
192.168.0.xx2 master2
192.168.0.xx3 master3
192.168.0.xx4 slave1
192.168.0.xx5 slave2
192.168.0.xx6 slave3
192.168.0.xx7 slave4
クラスターの構成を検討
手元にには7台のRaspberry Pi 2があり、そのうち4台にはUSBハードディスクを接続している。
Hadoopの構築に必要な機能は以下の通りであることから、
- NameNode
- DataNode
- Secondary NameNode
- ResourceManager
- NodeManager
- WebAppProxy
- Map Reduce Job History Server
各サーバーに下記の様に割り振ることにした。Zookeeperによる自動フェイルオーバーについては今回は設定しない。
master1・・・NameNode, ResourceManager
master2・・・Secondary NameNode
master3・・・今回は使用しない
slave1・・・DataNode, NodeManager
slave2・・・DataNode, NodeManager
slave3・・・DataNode, NodeManager
slave4・・・DataNode, NodeManager
※slave1~4にはUSBハードディスクが接続されている。
Hadoopデーモンの環境設定
~/.bashrcに下記を追記する。
export JAVA_HOME="$HOME/jdk-11-latest"
export HADOOP_HOME="$HOME/hadoop-latest"
if [ -d "$HADOOP_HOME" ] ; then
export HADOOP_CONF_DIR="$HADOOP_HOME/etc/hadoop"
fi
全サーバーのetc/hadoop/hadoop-env.shを編集する。
export JAVA_HOME=/home/xxx/jdk-11-latest
export HADOOP_HOME=/home/xxx/hadoop-latest
export HADOOP_HEAPSIZE_MAX=200m
HDFSの設定
全サーバーのetc/hadoop/core-site.xmlを編集する。
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000/</value>
</property>
</configuration>
master1のetc/hadoop/hdfs-site.xmlを編集する。
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master2:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/xxx/hadoop-latest/name</value>
</property>
</configuration>
master1のetc/hadoop/workersを編集する。
slave1
slave2
slave3
slave4
slave1~4のetc/hadoop/hdfs-site.xmlを編集する。
<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>/mnt/usbhdd/hadoop/data</value>
</property>
</configuration>
master1で下記を実行する。
$HADOOP_HOME/bin/hdfs namenode -format <cluster_name>
$HADOOP_HOME/sbin/start-dfs.sh
正常動作を確認出来たら、下記を実行し停止する。
$HADOOP_HOME/sbin/stop-dfs.sh
この時下記のWarningが出たため、
OpenJDK Server VM warning: You have loaded library /home/xxx/hadoop-3.2.2/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
下記の対応を行った。
sudo apt-get install prelink
sudo execstack -c /home/xxx/hadoop-3.2.2/lib/native/libhadoop.so.1.0.0
sudo execstack -c /home/xxx/hadoop-3.2.2/lib/native/libhdfs.so.0.0.0
sudo execstack -c /home/xxx/hadoop-3.2.2/lib/native/libnativetask.so.1.0.0
YARNの設定
注意:メモリの設定は参考にしないでください。物理メモリが1GBしかないRaspberry Pi 2で無理やり動くように設定したものなので、正しい設定方法ではないです。
master1、slave1~4のetc/hadoop/yarn-site.xmlを編集する。(yarn.scheduler.~はmaster1のみ追記、yarn.nodemanager.~はslave1~4のみ追記)
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master1</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>200</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>800</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>200</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</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>
</property>
</configuration>
master1のetc/hadoop/mapred-site.xmlを編集する。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>200</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>200</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx200M</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>200</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx200M</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/home/xxx/hadoop-latest</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/home/xxx/hadoop-latest</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/home/xxx/hadoop-latest</value>
</property>
</configuration>
master1で下記を実行する。
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
問題なく両方の起動が確認できたので、実際に処理を実行してみる。
$HADOOP_HOME/bin/hadoop jar /home/xxx/hadoop-latest/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar pi 10 10000
下記の様に処理が進んで行き、
2021-02-18 08:12:21,597 INFO mapreduce.Job: map 0% reduce 0%
2021-02-18 08:13:06,983 INFO mapreduce.Job: map 19% reduce 0%
2021-02-18 08:13:38,044 INFO mapreduce.Job: map 31% reduce 0%
2021-02-18 08:13:39,081 INFO mapreduce.Job: map 38% reduce 0%
2021-02-18 08:14:09,121 INFO mapreduce.Job: map 44% reduce 0%
2021-02-18 08:14:10,159 INFO mapreduce.Job: map 56% reduce 0%
2021-02-18 08:14:41,193 INFO mapreduce.Job: map 69% reduce 0%
2021-02-18 08:14:48,435 INFO mapreduce.Job: map 69% reduce 23%
2021-02-18 08:15:12,225 INFO mapreduce.Job: map 81% reduce 23%
2021-02-18 08:15:13,260 INFO mapreduce.Job: map 81% reduce 27%
2021-02-18 08:15:42,218 INFO mapreduce.Job: map 88% reduce 27%
2021-02-18 08:15:43,256 INFO mapreduce.Job: map 94% reduce 27%
2021-02-18 08:15:44,290 INFO mapreduce.Job: map 94% reduce 31%
2021-02-18 08:16:14,264 INFO mapreduce.Job: map 100% reduce 31%
2021-02-18 08:16:15,298 INFO mapreduce.Job: map 100% reduce 67%
2021-02-18 08:16:17,369 INFO mapreduce.Job: map 100% reduce 100%
最終的に下記の結果が表示された。やはりかなり遅い。
Job Finished in 320.709 seconds
Estimated value of Pi is 3.14157500000000000000
次回、NameNodeをHA化する。