IP | HostName | 用途 | 安装软件 |
---|---|---|---|
192.168.100.131 | lzjnn1 | NameNode1 | hadoop |
192.168.100.132 | lzjnn2 | NameNode2 | hadoop |
192.168.100.141 | lzjdn1 | DateNode1 | hadoop,zookeeper |
192.168.100.142 | lzjdn2 | DateNode2 | hadoop,zookeeper |
192.168.100.143 | lzjdn3 | DateNode3 | hadoop,zookeeper |
这就不写了,操作系统安装一般都会。规划的5台服务器都装好操作系统
按照集群规划配置好相应的IP地址和主机名。
修改/etc/hosts文件,增加如下内容:
192.168.100.131 lzjnn1
192.168.100.132 lzjnn2
192.168.100.141 lzjdn1
192.168.100.142 lzjdn2
192.168.100.143 lzjdn3
所有服务器上新建用户
#新建hadoop用户
useradd hadoop
#设置hadoop用户的密码
passwd hadoop xxxx
#每台服务器上使用hadoop用户登录执行以下命令生成公私钥文件
ssh-keygen -t rsa
#统一在一台f服务器上整合authorized_keys文件,这里选lzjnn1
#lzjnn1上执行
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
#在lzjnn1以外的f服务器上执行,按需输入对应用户的密码
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@lzjnn1
#在lzjnn1上执行以下命令将authorized_keys文件复制到其他所有服务器上
scp ~/.ssh/authorized_keys lzjnn2:~/.ssh/
scp ~/.ssh/authorized_keys lzjdn1:~/.ssh/
scp ~/.ssh/authorized_keys lzjdn2:~/.ssh/
scp ~/.ssh/authorized_keys lzjdn3:~/.ssh/
#每台服务器上分别对其他服务器执行ssh命令测试免密登录
ssh 主机名
每台服务器上都需要安装配置jdk
进入Oracle官网下载jdk,这里使用的是jdk8u192
下载页面链接
选择jdk-8u192-linux-x64.tar.gz下载
#在/usr/local目录下新建java目录
mkdir /usr/local/java
#复制下载的jdk文件到此目录下
cp /download/path/jdk-8u192-linux-x64.tar.gz /usr/local/java
#cd到对应目录下解压文件
tar zxvf jdk-8u192-linux-x64.tar.gz
在/etc/profile.d目录下新建 hadoop.sh文件,新增如下内容:
# for java
export JAVA_HOME=/usr/local/java/jdk1.8.0_192
export JRE_HOME=/usr/local/java/jdk1.8.0_192/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
在规划需要安装zookeeper的服务器上安装zookeeper
进入zookeeper官网下载,这里使用的是zookeeper-3.4.13
下载页面链接
选择zookeeper-3.4.13.tar.gz下载
#在/usr/local目录下新建zookeeper目录
mkdir /usr/local/zookeeper
#复制下载的文件到此目录下
cp /download/path/zookeeper-3.4.13.tar.gz /usr/local/zookeeper
#cd到对应目录下解压文件
tar zxvf zookeeper-3.4.13.tar.gz
1、在/etc/profile.d目录下刚才新建的hadoop.sh文件中,新增如下内容:
#for zookeeper
export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.13
2、修改 $ZOOKEEPER_HOME/conf/zoo.cfg文件,对应配置改为如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/app/zookeeper/data
clientPort=2181
server.1=lzjdn1:2888:3888
server.2=lzjdn2:2888:3888
server.3=lzjdn3:2888:3888
3、在dataDir所指定的目录下创建myid文件
每台服务器取zoo.cfg文件中对应 server.A=B:C:D中的A的值
echo A的值 > /app/zookeeper/data/myid
修改zookeeper的日志配置,分日期存放日志在指定目录下,是为了便于查看管理日志,不需要修改的可以略过本节
1、修改$ZOOKEEPER_HOME/conf/log4j.properties文件,找到对应zookeeper.root.logger的配置改为如下:
zookeeper.root.logger=INFO, ROLLINGFILE
2、修改$ZOOKEEPER_HOME/bin/zkEnv.sh文件中的对应内容如下:
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="/app/logs/zookeeper"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
1、在所有zookeeper节点上启动zookeeper:
$ZOOKEEPER_HOME/bin/zkServer.sh start
2、查看节点状态:
$ZOOKEEPER_HOME/bin/zkServer.sh status
正常情况下有一台节点会是leader,其他节点是follower
3、测试zookeeper
任意一台节点上执行以下命令行进入client模式,可以create一些node,修改查看数据的同步情况,这里不再赘述了
$ZOOKEEPER_HOME/bin/zkCli.sh -server 127.0.0.1:2181
在规划中需要安装hadoop的服务器上安装hadoop
进入hadoop官网下载,这里使用的是hadoop-3.1.1
下载页面链接
选择hadoop-3.1.1对应的binary包hadoop-3.1.1.tar.gz下载
#在/usr/local目录下新建hadoop目录
mkdir /usr/local/hadoop
#复制下载的文件到此目录下
cp /download/path/hadoop-3.1.1.tar.gz /usr/local/hadoop
#cd到对应目录下解压文件
tar zxvf hadoop-3.1.1.tar.gz
1、在/etc/profile.d目录下刚才新建的hadoop.sh文件中,新增如下内容:
# for hadoop
export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.1
2、修改$HADOOP_HOME/etc/hadoop/core-site.xml:
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://lzjclustervalue>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/app/hadoop/tempvalue>
property>
<property>
<name>io.file.buffer.sizename>
<value>4096value>
property>
<property>
<name>ha.zookeeper.quorumname>
<value>lzjdn1:2181,lzjdn2:2181,lzjdn3:2181value>
property>
configuration>
3、修改$HADOOP_HOME/etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.nameservicesname>
<value>lzjclustervalue>
property>
<property>
<name>dfs.ha.namenodes.lzjclustername>
<value>lzjnn1,lzjnn2value>
property>
<property>
<name>dfs.namenode.rpc-address.lzjcluster.lzjnn1name>
<value>lzjnn1:9000value>
property>
<property>
<name>dfs.namenode.http-address.lzjcluster.lzjnn1name>
<value>lzjnn1:50070value>
property>
<property>
<name>dfs.namenode.rpc-address.lzjcluster.lzjnn2name>
<value>lzjnn2:9000value>
property>
<property>
<name>dfs.namenode.http-address.lzjcluster.lzjnn2name>
<value>lzjnn2:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://lzjdn1:8485;lzjdn2:8485;lzjdn3:8485/lzjclustervalue>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/app/hadoop/journal/datavalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.lzjclustername>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/hadoop/.ssh/id_rsavalue>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:/app/hadoop/hdfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:/app/hadoop/hdfs/datavalue>
property>
<property>
<name>dfs.replicationname>
<value>2value>
property>
<property>
<name>dfs.webhdfs.enabledname>
<value>truevalue>
property>
configuration>
4、修改$HADOOP_HOME/etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
configuration>
5、修改$HADOOP_HOME/etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.classname>
<value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>lzjclustervalue>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>lzjrm1,lzjrm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.lzjrm1name>
<value>lzjnn1value>
property>
<property>
<name>yarn.resourcemanager.hostname.lzjrm2name>
<value>lzjnn2value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.lzjrm1name>
<value>lzjnn1:8088value>
property>
<property>
<name>yarn.resourcemanager.webapp.address.lzjrm2name>
<value>lzjnn2:8088value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>lzjdn1:2181,lzjdn2:2181,lzjdn3:2181value>
property>
configuration>
6、$HADOOP_HOME/etc/hadoop下新建workers文件,写入如下内容(删除原先的localhost):
lzjdn1
lzjdn2
lzjdn3
7、配置hadoop的日志目录(不需要修改的可以跳过这段):
$HADOOP_HOME/etc/hadoop/hadoop-env.sh 找到HADOOP_LOG_DIR修改:
export HADOOP_LOG_DIR=/app/logs/hadoop/logs
第一次启动比较繁琐,之后直接start-all就好了
1、初始化zookeeper的命名空间:
$HADOOP_HOME/bin/hdfs zkfc -formatZK
2、在每个journalnode节点用如下命令启动journalnode:
$HADOOP_HOME/bin/hdfs --daemon start journalnode
3、在主namenode节点格式化namenode和journalnode目录
$HADOOP_HOME/bin/hdfs namenode -format
4、全新安装的集群,可在主namenode节点执行start-all.sh启动
$HADOOP_HOME/sbin/start-all.sh
5、如果是运行中的集群,hdfs从非HA模式修改为HA模式,需要如下操作:
#在备namenode节点执行如下命令,格式化并复制主节点的元数据
$HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
#在主节点执行如下命令,初始化JournalNodes的edit数据
$HADOOP_HOME/bin/hdfs namenode -initializeSharedEdits
#然后在备节点上启动namenode
$HADOOP_HOME/bin/hdfs --daemon start namenode
1、查看NameNode的状态,应该是一个active,一个standby
$HADOOP_HOME/bin/hdfs haadmin -getAllServiceState
2、模拟故障
#在NameNode为active的服务器上jps查看进程和进程号
jps
#kill NameNode进程,模拟程序crash的情况
kill -9 NameNode的进程号
3、等待一会,再次查看节点状态:如果一切正常,是会自动切换Active的NameNode到备用服务器上。如果没有正常切换,请检查之前的配置是否正常。如果都正确,则查看standby节点上$HADOOP_LOG_DIR下的zkfc日志来找具体的问题。
4、问题小记
我在首次测试的时候遇到了无法正常切换的问题,查找日志定位到了问题。由于centos是最小安装的,日志中报了几个错误:
fuser: 未找到命令
nc: 未找到命令
应该是hadoop采用的是ssh的shell方式来实现切换的,我的CentOS是最小安装的,缺少了这些命令导致无法正常切换,解决方法如下:
在2台namenode上:
#安装psmisc包解决fuser命令找不到问题
yum install psmisc
#安装nmap-ncat包解决nc命令找不到问题
yum install nmap-ncat
安装完成后等待一会,再检查状态,发现已经自动切换。
5、强制手动切换的方法(不推荐,谨慎操作)
$HADOOP_HOME/bin/hdfs haadmin -transitionToActive --forcemanual lzjnn2
1、查看ResourceManager的状态,应该是一个active,一个standby
$HADOOP_HOME/bin/yarn rmadmin -getAllServiceState
2、模拟故障
#在ResourceManager为active的服务器上jps查看进程和进程号
jps
#kill ResourceManager进程,模拟程序crash的情况
kill -9 ResourceManager的进程号
3、等待一会,再次查看节点状态:如果一切正常,是会自动切换Active的ResourceManager到备用服务器上。如果没有正常切换,请检查之前的配置是否正常。如果都正确,则查看standby节点上$HADOOP_LOG_DIR下的yarn日志来找具体的问题。
4、强制手动切换的方法
$HADOOP_HOME/bin/yarn rmadmin -transitionToActive lzjnn2
Hadoop3.1.1官方HDFS的HA文档页面
Hadoop3.1.1官方RM的HA文档页面