Hadoop+zookeeper集群部署
(本文是工作过程中,一位同事整理编写的,非常全面详细,在此对其表示由衷的感谢,同时也分享给大家,希望对有此需求的朋友能给予帮助)
一、集群服务器情况
IP | 主机名 | 进程 |
192.168.0.202 | hadoop-master | NameNode/ DataNode/ JournalNode/ QuorumPeerMain/ DFSZKFailoverController |
192.168.0.203 | hadoop-slave1 | NameNode/ DataNode/ JournalNode/ QuorumPeerMain/ DFSZKFailoverController |
192.168.0.205 | hadoop-slave2 | DataNode/ JournalNode/ QuorumPeerMain/ |
进程说明:
NameNode:Hadoop管理者进程,即master,负责管理HDFS文件系统
DataNode:Hadoop工作者进程,即slave,负责文件存储读写
JournalNode:负责多个(目前最多为2个)NameNode之间数据同步,数量必须为奇数
QuorumPeerMain:ZooKeeper进程,数量必须为奇数
DFSZKFailoverController:负责监控NameNode的状态,当active状态的NameNode出现问题的时候,自动将standby状态的NameNode置为active状态,以保证HDFS系统的稳定
二、集群部署
1、服务器网络环境配置
(1)修改主机名
vi /etc/sysconfig/network
分别修改3台机器主机名为hadoop-master、hadoop-slave1、hadoop-slave2
分别执行sysctl kernel.hostname=相应主机名,使配置生效
(2)修改IP地址,设置为静态IP
vi /etc/sysconfig/network-scripts/ifcfg-eth0
增加以下内容:
BOOTPROTO=static
DNS1=192.168.0.1
IPV6INIT=no
USERCTL=no
IPADDR=192.168.0.202
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
同理修改另外两台机器IP。
(3)增加IP与主机映射
vi /etc/hosts
增加以下内容:
192.168.0.202 hadoop-master
192.168.0.203 hadoop-slave1
192.168.0.205 hadoop-slave2
2、SSH免密码登录
(1)在每台机器上根目录创建ssh公钥:ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
(2)在hadoop-master中,进入.ssh目录,并将公钥写到authorized_keys:
cat~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
sshhadoop-slave1 cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys
sshhadoop-slave2 cat ~/.ssh/id_rsa.pub>>~/.ssh/authorized_keys
(3)更改authorized_keys属性,使之不能被修改:chmod 600 ~/.ssh/authorized_keys
(4)将hadoop-master中生成的known_hosts和authorized_keys复制到其他机器中:
scp~/.ssh/authorized_keys root@hadoop-slave1:~/.ssh/
scp ~/.ssh/authorized_keysroot@hadoop-slave2:~/.ssh/
scp ~/.ssh/known_hostsroot@hadoop-slave1:~/.ssh/
scp ~/.ssh/known_hostsroot@hadoop-slave2:~/.ssh/
(5)验证ssh的免密码登录:在hadoop-master中输入:ssh hadoop-slave1、ssh hadoop-slave2是否需要密码,如果不需要,则ssh免密码配置成功。
3、安装JDK
在hadoop-master上进行操作
(1)JDK下载
wget http://download.oracle.com/otn-pub/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
(2)解压
tar –xvzf jdk-7u80-linux-x64.tar.gz
(3)解压后的文件夹重命名
mv jdk1.7.0_80 java
(4)配置环境变量
vi /etc/profile
在文件末尾增加如下内容:
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存文件退出,source /etc/profile 使配置生效
(5)将JDK复制到其他机器,并在其他机器上配置环境变量
scp -r /opt/java root@hadoop-slave1:/opt/
scp -r /opt/java root@hadoop-slave2:/opt/
4、安装Hadoop
在hadoop-master上进行操作
(1)Hadoop下载
wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
(2)解压
tar –xvzf hadoop-2.7.3.tar.gz
(3)解压后的文件夹重命名
mv hadoop-2.7.3 hadoop
(4)配置Hadoop环境变量
vi /etc/profile
在文件末尾增加如下内容:
export HADOOP_HOME=/opt/hadoop
exportPATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
exportHADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
exportHADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
保存文件退出,source /etc/profile 使配置生效
(5)Hadoop配置文件修改
配置文件目录:/opt/hadoop/etc/hadoop/
l hadoop-env.sh
添加jdk环境变量: exportJAVA_HOME=/opt/java
l coer-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp/</value>
<description>A base for othertemporary directories.</description>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-master:2181,hadoop-slave1:2181,hadoop-slave2:2181</value>
</property>
</configuration>
l hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为cluster1,需要和core-site.xml中的保持一致-->
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<!-- cluster1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn1</name>
<value>hadoop-master:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nn1</name>
<value>hadoop-master:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn2</name>
<value>hadoop-slave1:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nn2</name>
<value>hadoop-slave1:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-master:8485;hadoop-slave1:8485;hadoop-slave2:8485/cluster1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/tmp/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 使用隔离机制时超时时间-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!—NameNode数据存储路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/tmp/dfs/name</value>
</property>
<!—DataNode数据存储路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/tmp/dfs/data,/home/hadoop/tmp/dfs/data</value>
</property>
<!—复制因子-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
l slaves
hadoop-slave1
hadoop-slave2
hadoop-master
(6)将Hadoop复制到其他机器上
scp -r /opt/hadoop root@hadoop-slave1:/opt/
scp -r /opt/hadoop root@hadoop-slave2:/opt/
5、安装ZooKeeper
在hadoop-master上进行操作
(1)ZooKeeper下载
wget http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
(2)解压
tar –xvzf zookeeper-3.4.9.tar.gz
(3)解压后的文件夹重命名
mv zookeeper-3.4.9 zookeeper
(4)配置环境变量
vi /etc/profile
在文件末尾增加如下内容:
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
保存文件退出,source /etc/profile 使配置生效
(5)ZooKeeper配置文件修改
配置文件目录:/opt/zookeeper/conf/
复制zoo_sample.cfg并命名为zoo.cfg,命令:cp zoo_sample.cfg zoo.cfg
编辑zoo.cfg,vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting anacknowledgement
syncLimit=5
# the directory where the snapshot isstored.
# do not use /tmp for storage, /tmp here isjust
# example sakes.
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdatalog
# the port at which the clients willconnect
clientPort=2181
server.1=hadoop-master:2888:3888
server.2=hadoop-slave1:2888:3888
server.3=hadoop-slave2:2888:3888
(6)创建myid文件
在zookeeper的目录中,创建上述两个文件夹zkdata和zkdatalog。进入zkdata文件夹,创建文件myid,填入1。这里写入的1,是在zoo.cfg文本中的server.1中的1。
(7)将ZooKeeper复制到其他机器,并在其他机器上配置环境变量,修改相应的myid
scp -r /opt/zookeeper root@hadoop-slave1:/opt/
scp -r /opt/zookeeper root@hadoop-slave2:/opt/
6、集群启动
(1)启动ZooKeeper集群
在hadoop-master、hadoop-slave1、hadoop-slave2上zookeeper目录下分别执行命令:bin/zkServer.sh start
检查是否正常启动,在每台机器上执行:bin/zkServer.sh status 查看每台机器zookeeper的状态,正确的话,只有一台机器是leader,其余机器都是显示folower
(2)格式化ZooKeeper集群
格式化zookeeper集群,目的是在ZooKeeper集群上建立HA的相应节点。
在hadoop-master上的hadoop的目录执行:hdfs zkfc –formatZK,注意该命令需要手动输入,复制会有问题
(3)启动JournalNode集群
在hadoop-master上执行命令hadoop-daemons.sh start journalnode
在每台机器上使用jps命令查看JournalNode是否正常启动,正常情况下可以看到JournalNode进程
(4)格式化NameNode
在hadoop-master上格式化NameNode,命令:hdfs namenode –format
将/opt/hadoop/tmp/dfs/name 文件复制到hadoop-slave1的/opt/hadoop/tmp/dfs目录下
(5)启动HDFS集群
在hadoop-master上启动HDFS集群,命令:start-dfs.sh
在每台机器上使用jps命令查看进程,各个机器上进程如果与集群服务器情况表中所写的进程相同,则表示整个集群启动成功。
查看HDFS管理界面:
http://192.168.0.202:50070/dfshealth.html#tab-overview
http://192.168.0.203:50070/dfshealth.html#tab-overview
可以看到两个NameNode的状态,一个为active,一个为standby
三、常用命令
1、NameNode手动主备切换
hdfs haadmin -failover nn1 nn2
说明:执行命令前,NameNodeId为nn1的节点为active状态,NameNodeId为nn2的节点为standby状态,执行该命令后,两个节点状态互换。