服务器集群
hostname | IP | user | password | path | os | |
---|---|---|---|---|---|---|
node01 | 192.168.218.110 | hadoop | java | /hadoop | Centos7 | |
node02 | 192.168.218.120 | hadoop | java | /hadoop | Centos7 | |
node03 | 192.168.218.130 | hadoop | java | /hadoop | Centos7 |
<span id="Plan">集群规划</span>
node01 | node02 | node03 |
---|---|---|
namenode | namenode | |
datanode | datanode | datanode |
zookeeper | zookeeper | zookeeper |
ResourceManage | ResourceManage | |
NodeManage | NodeManage | NodeManage |
JournalNode | JournalNode | JournalNode |
DFSZKFailoverController | DFSZKFailoverController |
组件版本
组件 | 版本 | 下载地址 |
---|---|---|
Centos7 | CentOS-7-x86_64-DVD-1908.iso | linux服务器下载地址 |
JDK | jdk1.8.0_141 | Jdk |
Zookeeper | zookeeper-3.4.5-cdh5.14.2 | zookeeper下载地址 |
Hadoop | hadoop-2.6.0-cdh5.14.2 | hadoop下载地址 |
虚拟机安装跳过
网卡配置
mac参考以下链接
Mac VMware Fusion CentOS7配置静态IP
windows参考以下链接
配置服务器
从此步开始,开始进行服务器基础环境配置。
将集群中所有的机器hostname ip 映射,添加到/etc/hosts
映射后集群间将不在需要使用ip
192.168.218.110 node01
192.168.218.120 node02
192.168.218.130 node03
关闭防火墙
关闭防火墙主要是为了集群机器间的通信
# 关闭防火墙
systemctl disable firewalld.service
# 查看防火墙状态
systemctl status firewalld.service
# 已关闭将输出 Active: inactive (dead)
<span id="jump">配置网卡及主机名</span>
编辑文件vim /etc/sysconfig/network-scripts/ifcfg-eth0
,写入如下配置:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
IPV6_PRIVACY=no
PREFIX=24
## 下边的几项配置是修改的
#UUID=f22334e3-05d1-450e-a50a-1da9f5f27915
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.218.110 # 当前机器的ip
GATEWAY=192.168.218.2 # 路由 要求网段一直 218 数字与ip的一样
DNS1=192.168.218.2 # 同上
配置主机名编辑文件/etc/hostname
,添加下列
node01
配置完成后,重启网络服务。
service network restart
<span id="ntpdate">同步服务器时间</span>
# 安装ntpdate
yum -y install ntpdate
# 安装完成执行命令
crontab -e
# 此时进入文本编辑模式 使用 i 插入下列命令
*/1 * * * * /usr/sbin/ntpdate time1.aliyun.com
# 填写完成后,输入 :wq 保存退出
添加用户
按步骤执行以下命令
# 添加用户组
groupadd hadoop
# 创建用户并添加到hadoop组中
useradd -g hadoop hadoop
# 使用id命令查看hadoop用户组和hadoop用户创建是否成功
id hadoop
# 正常输出 uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
# 设置hadoop用户密码为hadoop
passwd hadoop
创建应用安装包以及数据存储目录
mkdir -p /hadoop/soft # 软件压缩包存放目录
mkdir -p /hadoop/install # 软件解压后存放目录
mkdir -p /hadoop/datadir # 各应用的数据存放目录
chown -R hadoop:hadoop /hadoop # 将文件夹权限更改为hadoop用户
上传安装包以及解压
上传
根据下载链接将需要组件下载到宿主机,由宿主机上传到虚拟机中
注意:这里上传时要使用hadoop
用户,不然还需要更改文件所属用户!!
上传路径为 /hadoop/soft
~
至于用什么方式,sftp、scp或其他工具都可!
解压
使用hadoop
用户登录,解压命令直接解压即可
注意:一定要用hadoop
用户!!!
tar -xzvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /hadoop/install/
配置jdk
jdk可选择配置全局,也可以选择配置只针对hadoop
用户。
这里我选择配置只针对hadoop
用户~
命令 vim ~/.bash_profile
export JAVA_HOME=/hadoop/install/jdk1.8.0_141
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
修改完成使用命令 source ~/.bash_profile
,更新用户环境变量。
验证环境:
java -verison
# 正常输出。jdk版本
# 错误输出 找不到命令
配置zookeeper
zookeeper的配置较为简单,只需要添加两个文件即可
第一个文件 zoo.cfg,命令 vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
# 路径需要根据你的真实情况进行修改
dataDir=/hadoop/datadir/zookeeper/
# 只修改你的主机hostname就可以,我这里三台机器命名为,`node01`、`node02`、`node03`
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第二个文件 myid,进入第一个配置文件中dataDir
配置的目录,命令 vim myid
,添加 1
,即可(**这块每台机器不一样,在我们克隆虚拟机镜像后
需要手动将其修改!!稍后介绍**)。
配置hadoop
hadoop的配置文件不需要区分节点,也就是说每个几点的配置文件都是相同的,所以我们在克隆虚拟机镜像前先将其配置好,
这样在克隆镜像后尽量最小的配置文件改动!
配置环境变量(参考jdk配置)
export HADOOP_HOME=/hadoop/install/hadoop-2.6.0-cdh5.14.2
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改完成使用命令 source ~/.bash_profile
,更新用户环境变量。
配置xml
需要修改的xml一共四个,都存放在/hadoop/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/
目录下,core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-site.xml
。
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
更改slaves
slaves
文件同样存在/hadoop/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/
目录中,
# vi slaves
#将localhost这一行删除掉,添加下边三个节点
node01
node02
node03
手动创建hadoop所需数据目录
下边给出命令,直接整体复制执行即可,若你修改了路径,则需要对应的修改。
mkdir -p /hadoop/datadir/hadoop/tempDatas
mkdir -p /hadoop/datadir/hadoop/namenodeDatas
mkdir -p /hadoop/datadir/hadoop/datanodeDatas
mkdir -p /hadoop/datadir/hadoop/dfs/nn/edits
mkdir -p /hadoop/datadir/hadoop/dfs/snn/name
mkdir -p /hadoop/datadir/hadoop/dfs/nn/snn/edits
mkdir -p /hadoop/datadir/hadoop/yarn/local
mkdir -p /hadoop/datadir/hadoop/journal
注意:有的同学这块没有注意到上边提到的hadoop
用户的读写权限,或者用了root创建,导致目录无法写入的异常。该路径一定要属于hadoop
用户!!!
复制虚拟机镜像
这一步直接关机完整克隆就好了
注意:有的同学复制镜像的同时把虚拟机的mac地址也复制了,这样将会导致其他两台启动后无法使用,若mac地址相同,
那么重新生成一个mac地址。
更改其他两台hostname、ip
参考配置网卡及主机名
启动每一个节点虚拟机
启动每一台虚拟机!
配置免密登录
Linux免密登录,本质上是使用了公钥登录
。原理很简单,就是用户将自己的公钥
储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥
加密后,再发回来。远程主机用事先储存的公钥
进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
注意:以下命令要在每一台机器上都执行~~~
## 生成密钥
## 期间需要输入几次回车,直接回车即可
ssh-keygen -t rsa
## 发送自己的公钥到每一台机器上,包括自己本身
## 由于每条命令都需要输入对方的密码,所以要一条一条的执行!!!
ssh-copy-id -i ~/.ssh/id_rsa.pub node01
ssh-copy-id -i ~/.ssh/id_rsa.pub node02
ssh-copy-id -i ~/.ssh/id_rsa.pub node03
注意:一定要验证是否成功,在每台机器上相互ssh
不需要密码就能登录,那么就说明免密登录配置成功!!!
ssh node01
zookeeper启动
手动启动每一台节点
注意:在启动前,我们要把刚刚的zookeeper配置中myid更改一下,才可以启动!!!
不同的机器对应不同的myid,从下边配置中获取,node01对应1,以此类推。
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
# 启动zk
# 在每一台机器上执行
/hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh start
# 检查状态
/hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh status
脚本启动所有节点
#!/bin/bash --login
zookeeper=$1
path=$2
command=$3
A=start status stop
start(){
echo "$1 zookeeper on $2"
ssh -l hadoop $2 "$3 $1"
}
if [ "$zookeeper" == "" ] || [ "$command" == "" ];then
echo "usage:'node01 node02 node03' ./zkServer.sh [start status stop]"
exit 0
fi
# 判断是否为支持的命令
for c in $A
do
if [ "$command" != "$c" ];then
echo "当前只支持:[start status stop]命令"
exit 0
fi
done
if [ "$command" != "" ];then
for zk in $zookeeper
do
start $command $zk $path
done
else
echo "请输入正确命令"
echo "'node01 node02 node03' ./zkServer.sh [start status stop]"
fi
启动只需要在主节点执行脚本即可!!!
./zkcluster_run.sh 'node01 node02 node03' /hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh start
hadoop格式化并启动
格式化namenode
初始化的目的就是为了hdfs的元数据信息的初始化。
命令
hdfs namenode -format
成功的标志:
19/08/23 04:32:34 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: user = hadoop
STARTUP_MSG: host = ......
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.6.0-cdh5.14.2
#显示格式化成功。。。
cdh5.14.2/hadoopDatas/namenodeDatas has been successfully formatted.
19/08/23 04:32:35 INFO common.Storage: Storage directory /hadoop/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/dfs/nn/edits has been successfully formatted.
19/08/23 04:32:35 INFO namenode.FSImageFormatProtobuf: Saving image file /hadoop/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/current/fsimage.ckpt_0000000000000000000 using no compression
19/08/23 04:32:35 INFO namenode.FSImageFormatProtobuf: Image file /hadoop/install/hadoop-2.6.0-cdh5.14.2/hadoopDatas/namenodeDatas/current/fsimage.ckpt_0000000000000000000 of size 323 bytes saved in 0 seconds.
19/08/23 04:32:35 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
19/08/23 04:32:35 INFO util.ExitUtil: Exiting with status 0
19/08/23 04:32:35 INFO namenode.NameNode: SHUTDOWN_MSG:
#此处省略部分日志
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at .....
************************************************************/
同步namenode
在master的NameNode启动之后,我们进行对NameNode的数据同步
在standby-master(也就是我们node02)输入以下命令,输出的日志和上边的相仿
hdfs namenode -bootstrapStandby
如上步骤都顺利的话接下来就可以启动集群了!
启动集群
两种方式~
start-all.sh
# 不过这种方式官方已经不在推荐了
可以使用如下启动
# 启动hdfs
start-dfs.sh
# 启动yarn
start-yarn.sh
查看进程
node01大概长这样,其他两台节点参考集群规划,部署了的那么一定存在进程,若不存在进程,那么需要查看日志解决问题~
12707 DFSZKFailoverController
12820 ResourceManager
12327 DataNode
12521 JournalNode
12220 NameNode
12941 NodeManager
1578 QuorumPeerMain # zookeeper进程,其余全都是hadoop进程
查看webUI
启动完成后可以通过webUI查看集群的信息,打开下边链接即可查看!!
两个节点都可以查看,要确保一个为active,另一个为standby的状态!
常见问题
yarn启动异常
2019-09-30 18:15:49,231 FATAL org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
org.apache.hadoop.HadoopIllegalArgumentException: Configuration doesn't specify yarn.resourcemanager.cluster-id
at org.apache.hadoop.yarn.conf.YarnConfiguration.getClusterId(YarnConfiguration.java:1785)
at org.apache.hadoop.yarn.server.resourcemanager.EmbeddedElectorService.serviceInit(EmbeddedElectorService.java:82)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.resourcemanager.AdminService.serviceInit(AdminService.java:145)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.serviceInit(ResourceManager.java:276)
at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.main(ResourceManager.java:1309)
解决办法:在yarn-site.xml中配置一个id,如下。
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
ZKFailoverController启动失败问题
异常一
2019-09-30 18:15:45,010 FATAL org.apache.hadoop.hdfs.tools.DFSZKFailoverController: Got a fatal error, exiting now
java.lang.IllegalArgumentException: Missing required configuration 'ha.zookeeper.quorum' for ZooKeeper quorum
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
at org.apache.hadoop.ha.ZKFailoverController.initZK(ZKFailoverController.java:340)
at org.apache.hadoop.ha.ZKFailoverController.doRun(ZKFailoverController.java:190)
at org.apache.hadoop.ha.ZKFailoverController.access$000(ZKFailoverController.java:60)
at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:171)
at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:167)
at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:444)
at org.apache.hadoop.ha.ZKFailoverController.run(ZKFailoverController.java:167)
at org.apache.hadoop.hdfs.tools.DFSZKFailoverController.main(DFSZKFailoverController.java:192)
解决办法:
- 确认是否配置了
<!--zookeeper配置,hadoop依赖zk进行选主-->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
- 检查服务器时间是否同步
注意: 同步需要在root用户下。
异常二
2019-09-30 15:42:05,418 FATAL org.apache.hadoop.ha.ZKFailoverController: Unable to start failover controller. Parent znode does not exist.
Run with -formatZK flag to initialize ZooKeeper.
解决办法: 此刻以为这你的hadoop节点还没有注册到zookeeper中,需要初始化。
# 执行命令进行初始化
hdfs zkfc -formatZK
重新起动集群即可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。