前回の構成ではNameNodeが単一障害点になっていたため、HDFS高可用性(HA)機能を試してみる。
サーバー構成を検討
スタンバイのNameNodeがSecondary NameNodeの代わりになるため、Secondary NameNodeは不要になる。
master1・・・Zookeeper,NameNode(Active), ResourceManager
master2・・・Zookeeper,NameNode(Standby)
master3・・・Zookeeper,NameNode(Standby)
slave1・・・DataNode, NodeManager
slave2・・・DataNode, NodeManager
slave3・・・DataNode, NodeManager
slave4・・・DataNode, NodeManager
Zookeeperをインストール
master1~3にインストールする。
wget https://downloads.apache.org/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
tar xvfz apache-zookeeper-3.6.2-bin.tar.gz
ln -nfs /home/xxx/apache-zookeeper-3.6.2-bin zookeeper-latest
master1~3のconf/zoo.cfgを編集する。
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/xxx/zookeeper-latest/data
clientPort=2181
server.1=master1:2888:3888
server.2=master2:2888:3888
server.3=master3:2888:3888
master1~3の~/zookeeper-latest/data/myidファイルを作成し、server.xで指定した数字と同じ数字を記入する。
その後、master1~3のZookeeperを順次起動する。
~/zookeeper-latest/bin/zkServer.sh start
HDFS高可用性(HA)機能の設定
master1~3のetc/hadoop/hdfs-site.xmlを編集する。
<property>
<name>dfs.nameservices</name>
<value>rpcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.rpcluster</name>
<value>nn1,nn2,nn3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn1</name>
<value>master1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn2</name>
<value>master2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn3</name>
<value>master3:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn1</name>
<value>master1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn2</name>
<value>master2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn3</name>
<value>master3:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;master3:8485/rpcluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.rpcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/ubuntu/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181,master3:2181</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/ubuntu/hadoop-latest/dfs/journalnode</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/ubuntu/hadoop-latest/dfs/namenode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
slave1~4のetc/hadoop/hdfs-site.xmlを編集する。
<property>
<name>dfs.nameservices</name>
<value>rpcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.rpcluster</name>
<value>nn1,nn2,nn3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn1</name>
<value>master1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn2</name>
<value>master2:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.rpcluster.nn3</name>
<value>master3:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn1</name>
<value>master1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn2</name>
<value>master2:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.rpcluster.nn3</name>
<value>master3:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master1:8485;master2:8485;master3:8485/rpcluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.rpcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/ubuntu/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181,master3:2181</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/mnt/usbhdd/hadoop/data</value>
</property>
master1~3、slave1~4のetc/hadoop/core-site.xmlを編集する。
<property>
<name>fs.defaultFS</name>
<value>hdfs://rpcluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181,master3:2181</value>
</property>
HDFSのフォーマット
master1~3のJournalNodeのみ起動する。
$HADOOP_HOME/bin/hdfs --daemon start journalnode
master1でNameNodeをフォーマットする。
$HADOOP_HOME/bin/hdfs namenode -format
$HADOOP_HOME/bin/hdfs namenode -initializeSharedEdits -force
$HADOOP_HOME/bin/hdfs zkfc -formatZK -force
master1のNameNodeのみ起動する。
$HADOOP_HOME/bin/hdfs --daemon start namenode
master2、3でスタンバイ用のNameNodeを作成する。
$HADOOP_HOME/bin/hdfs namenode -bootstrapStandby -force
HDFSの起動
全てのNameNode、JournalNodeを停止する。
$HADOOP_HOME/bin/hdfs --daemon stop namenode
$HADOOP_HOME/bin/hdfs --daemon stop journalnode
master1で下記コマンドを実行し、HDFSを再起動する。
$HADOOP_HOME/sbin/start-dfs.sh
次回、ResourceManagerをHA化する。