Skip to content
Sev7e0

hadoop集群部署文档

bigdata1 min read

服务器集群

hostnameIPuserpasswordpathos
node01192.168.218.110hadoopjava/hadoopCentos7
node02192.168.218.120hadoopjava/hadoopCentos7
node03192.168.218.130hadoopjava/hadoopCentos7

集群规划

node01node02node03
namenodenamenode
datanodedatanodedatanode
zookeeperzookeeperzookeeper
ResourceManageResourceManage
NodeManageNodeManageNodeManage
JournalNodeJournalNodeJournalNode
DFSZKFailoverControllerDFSZKFailoverController

组件版本

组件版本下载地址
Centos7CentOS-7-x86_64-DVD-1908.isolinux服务器下载地址
JDKjdk1.8.0_141Jdk
Zookeeperzookeeper-3.4.5-cdh5.14.2zookeeper下载地址
Hadoophadoop-2.6.0-cdh5.14.2hadoop下载地址

虚拟机安装跳过

网卡配置

mac参考以下链接

Mac VMware Fusion CentOS7配置静态IP

windows参考以下链接

windows配置链接

配置服务器

从此步开始,开始进行服务器基础环境配置。

将集群中所有的机器hostname ip 映射,添加到/etc/hosts

映射后集群间将不在需要使用ip

1192.168.218.110 node01
2192.168.218.120 node02
3192.168.218.130 node03

关闭防火墙

关闭防火墙主要是为了集群机器间的通信

1# 关闭防火墙
2systemctl disable firewalld.service
3
4# 查看防火墙状态
5systemctl status firewalld.service
6# 已关闭将输出 Active: inactive (dead)

配置网卡及主机名

编辑文件vim /etc/sysconfig/network-scripts/ifcfg-eth0 ,写入如下配置:

1TYPE=Ethernet
2PROXY_METHOD=none
3BROWSER_ONLY=no
4DEFROUTE=yes
5IPV4_FAILURE_FATAL=no
6IPV6INIT=yes
7IPV6_AUTOCONF=yes
8IPV6_DEFROUTE=yes
9IPV6_FAILURE_FATAL=no
10IPV6_ADDR_GEN_MODE=stable-privacy
11NAME=eth0
12DEVICE=eth0
13IPV6_PRIVACY=no
14PREFIX=24
15
16## 下边的几项配置是修改的
17#UUID=f22334e3-05d1-450e-a50a-1da9f5f27915
18ONBOOT=yes
19BOOTPROTO=static
20IPADDR=192.168.218.110 # 当前机器的ip
21GATEWAY=192.168.218.2 # 路由 要求网段一直 218 数字与ip的一样
22DNS1=192.168.218.2 # 同上

配置主机名编辑文件/etc/hostname,添加下列

1node01

配置完成后,重启网络服务。

1service network restart

同步服务器时间

1# 安装ntpdate
2yum -y install ntpdate
3
4
5# 安装完成执行命令
6crontab -e
7
8
9# 此时进入文本编辑模式 使用 i 插入下列命令
10*/1 * * * * /usr/sbin/ntpdate time1.aliyun.com
11# 填写完成后,输入 :wq 保存退出

添加用户

按步骤执行以下命令

1# 添加用户组
2groupadd hadoop
3
4
5# 创建用户并添加到hadoop组中
6useradd -g hadoop hadoop
7
8
9# 使用id命令查看hadoop用户组和hadoop用户创建是否成功
10id hadoop
11# 正常输出 uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
12
13
14# 设置hadoop用户密码为hadoop
15passwd hadoop

切换到hadoop用户!!

切换到hadoop用户!!

切换到hadoop用户!!

谨记:从这里开始未声明使用root用户,默认都是用hadoop用户操作!!! 谨记:从这里开始未声明使用root用户,默认都是用hadoop用户操作!!! 谨记:从这里开始未声明使用root用户,默认都是用hadoop用户操作!!!

1su - hadoop

创建应用安装包以及数据存储目录

1mkdir -p /hadoop/soft # 软件压缩包存放目录
2 mkdir -p /hadoop/install # 软件解压后存放目录
3 mkdir -p /hadoop/datadir # 各应用的数据存放目录
4 chown -R hadoop:hadoop /hadoop # 将文件夹权限更改为hadoop用户

上传安装包以及解压

上传

根据下载链接将需要组件下载到宿主机,由宿主机上传到虚拟机中

注意:这里上传时要使用hadoop用户,不然还需要更改文件所属用户!!

上传路径为 /hadoop/soft~

至于用什么方式,sftp、scp或其他工具都可!

解压

使用hadoop用户登录,解压命令直接解压即可

注意:一定要用hadoop用户!!!

1tar -xzvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /hadoop/install/

配置jdk

jdk可选择配置全局,也可以选择配置只针对hadoop用户。

这里我选择配置只针对hadoop用户~

命令 vim ~/.bash_profile

1export JAVA_HOME=/hadoop/install/jdk1.8.0_141
2
3PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

修改完成使用命令 source ~/.bash_profile,更新用户环境变量。

验证环境

1java -verison
2
3# 正常输出。jdk版本
4# 错误输出 找不到命令

配置zookeeper

zookeeper的配置较为简单,只需要添加两个文件即可

第一个文件 zoo.cfg,命令 vim zoo.cfg

1tickTime=2000
2initLimit=10
3syncLimit=5
4clientPort=2181
5
6# 路径需要根据你的真实情况进行修改
7dataDir=/hadoop/datadir/zookeeper/
8# 只修改你的主机hostname就可以,我这里三台机器命名为,`node01`、`node02`、`node03`
9server.1=node01:2888:3888
10server.2=node02:2888:3888
11server.3=node03:2888:3888

第二个文件 myid,进入第一个配置文件中dataDir配置的目录,命令 vim myid,添加 1,即可(这块每台机器不一样,在我们克隆虚拟机镜像后 需要手动将其修改!!稍后介绍)。

配置hadoop

hadoop的配置文件不需要区分节点,也就是说每个几点的配置文件都是相同的,所以我们在克隆虚拟机镜像前先将其配置好, 这样在克隆镜像后尽量最小的配置文件改动!

配置环境变量(参考jdk配置)

1export HADOOP_HOME=/hadoop/install/hadoop-2.6.0-cdh5.14.2
2
3PATH=$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.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml

core-site.xml

获取core-site.xml

hdfs-site.xml

获取hdfs-site.xml

yarn-site.xml

获取yarn-site.xml

mapred-site.xml

获取mapred-site.xml

更改slaves

slaves文件同样存在/hadoop/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop/目录中,

1# vi slaves
2#将localhost这一行删除掉,添加下边三个节点
3node01
4node02
5node03

手动创建hadoop所需数据目录

下边给出命令,直接整体复制执行即可,若你修改了路径,则需要对应的修改。

1mkdir -p /hadoop/datadir/hadoop/tempDatas
2mkdir -p /hadoop/datadir/hadoop/namenodeDatas
3mkdir -p /hadoop/datadir/hadoop/datanodeDatas
4mkdir -p /hadoop/datadir/hadoop/dfs/nn/edits
5mkdir -p /hadoop/datadir/hadoop/dfs/snn/name
6mkdir -p /hadoop/datadir/hadoop/dfs/nn/snn/edits
7mkdir -p /hadoop/datadir/hadoop/yarn/local
8mkdir -p /hadoop/datadir/hadoop/journal

注意:有的同学这块没有注意到上边提到的hadoop用户的读写权限,或者用了root创建,导致目录无法写入的异常。该路径一定要属于hadoop用户!!!

复制虚拟机镜像

这一步直接关机完整克隆就好了

注意:有的同学复制镜像的同时把虚拟机的mac地址也复制了,这样将会导致其他两台启动后无法使用,若mac地址相同, 那么重新生成一个mac地址。

更改其他两台hostname、ip

参考配置网卡及主机名

启动每一个节点虚拟机

启动每一台虚拟机!

配置免密登录

Linux免密登录,本质上是使用了公钥登录。原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

注意:免密登录是针对每一个不同用户的,所以我们一定要在hadoop用户下执行。以下命令要在每一台机器上都执行~~~

1## 生成密钥
2## 期间需要输入几次回车,直接回车即可
3ssh-keygen -t rsa
4
5## 发送自己的公钥到每一台机器上,包括自己本身
6## 由于每条命令都需要输入对方的密码,所以要一条一条的执行!!!
7ssh-copy-id -i ~/.ssh/id_rsa.pub node01
8ssh-copy-id -i ~/.ssh/id_rsa.pub node02
9ssh-copy-id -i ~/.ssh/id_rsa.pub node03

注意:一定要验证是否成功,在每台机器上相互ssh不需要密码就能登录,那么就说明免密登录配置成功!!!

1ssh node01

zookeeper启动

手动启动每一台节点

注意:在启动前,我们要把刚刚的zookeeper配置中myid更改一下,才可以启动!!!

不同的机器对应不同的myid,从下边配置中获取,node01对应1,以此类推。

1server.1=node01:2888:3888
2server.2=node02:2888:3888
3server.3=node03:2888:3888
1# 启动zk
2# 在每一台机器上执行
3/hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh start
4# 检查状态
5/hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh status

脚本启动所有节点

1#!/bin/bash --login
2
3zookeeper=$1
4path=$2
5command=$3
6
7A=start status stop
8
9start(){
10 echo "$1 zookeeper on $2"
11 ssh -l hadoop $2 "$3 $1"
12}
13
14if [ "$zookeeper" == "" ] || [ "$command" == "" ];then
15 echo "usage:'node01 node02 node03' ./zkServer.sh [start status stop]"
16 exit 0
17fi
18
19# 判断是否为支持的命令
20for c in $A
21do
22 if [ "$command" != "$c" ];then
23 echo "当前只支持:[start status stop]命令"
24 exit 0
25 fi
26done
27
28if [ "$command" != "" ];then
29 for zk in $zookeeper
30 do
31 start $command $zk $path
32 done
33 else
34 echo "请输入正确命令"
35 echo "'node01 node02 node03' ./zkServer.sh [start status stop]"
36fi

启动只需要在主节点执行脚本即可!!!

1./zkcluster_run.sh 'node01 node02 node03' /hadoop/install/zookeeper-3.4.5-cdh5.14.2/bin/zkServer.sh start

hadoop格式化并启动

格式化namenode

初始化的目的就是为了hdfs的元数据信息的初始化。

注意: NameNode格式化只能在node01执行一次,不然会导致集群启动失败,!!!!

命令

1hdfs namenode -format

成功的标志:

119/08/23 04:32:34 INFO namenode.NameNode: STARTUP_MSG:
2/************************************************************
3STARTUP_MSG: Starting NameNode
4STARTUP_MSG: user = hadoop
5STARTUP_MSG: host = ......
6STARTUP_MSG: args = [-format]
7STARTUP_MSG: version = 2.6.0-cdh5.14.2
8#显示格式化成功。。。
9cdh5.14.2/hadoopDatas/namenodeDatas has been successfully formatted.
1019/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.
1119/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
1219/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.
1319/08/23 04:32:35 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
1419/08/23 04:32:35 INFO util.ExitUtil: Exiting with status 0
1519/08/23 04:32:35 INFO namenode.NameNode: SHUTDOWN_MSG:
16#此处省略部分日志
17/************************************************************
18SHUTDOWN_MSG: Shutting down NameNode at .....
19************************************************************/

同步namenode

在master的NameNode启动之后,我们进行对NameNode的数据同步 在standby-master(也就是我们node02)输入以下命令,输出的日志和上边的相仿

1hdfs namenode -bootstrapStandby

如上步骤都顺利的话接下来就可以启动集群了!

启动集群

两种方式~

1start-all.sh
2# 不过这种方式官方已经不在推荐了

可以使用如下启动

1# 启动hdfs
2start-dfs.sh
3# 启动yarn
4start-yarn.sh

查看进程

node01大概长这样,其他两台节点参考集群规划,部署了的那么一定存在进程,若不存在进程,那么需要查看日志解决问题~

112707 DFSZKFailoverController
212820 ResourceManager
312327 DataNode
412521 JournalNode
512220 NameNode
612941 NodeManager
71578 QuorumPeerMain # zookeeper进程,其余全都是hadoop进程

查看webUI

启动完成后可以通过webUI查看集群的信息,打开下边链接即可查看!!

两个节点都可以查看,要确保一个为active,另一个为standby的状态!

node01:50070 node02:50070

常见问题

不小心多次格式化namenode

若不小心在每台机器上都执行了hdfs namenode -format,此时每台节点的集群id将会不一致会导致其他机器无法加入集群!

解决办法:清空创建的每一个数据目录!重新执行hdfs namenode -format即可!切记!!!只在node01上执行,执行完后要在node02同步

yarn启动异常

12019-09-30 18:15:49,231 FATAL org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
2org.apache.hadoop.HadoopIllegalArgumentException: Configuration doesn't specify yarn.resourcemanager.cluster-id
3 at org.apache.hadoop.yarn.conf.YarnConfiguration.getClusterId(YarnConfiguration.java:1785)
4 at org.apache.hadoop.yarn.server.resourcemanager.EmbeddedElectorService.serviceInit(EmbeddedElectorService.java:82)
5 at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
6 at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
7 at org.apache.hadoop.yarn.server.resourcemanager.AdminService.serviceInit(AdminService.java:145)
8 at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
9 at org.apache.hadoop.service.CompositeService.serviceInit(CompositeService.java:107)
10 at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.serviceInit(ResourceManager.java:276)
11 at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163)
12 at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.main(ResourceManager.java:1309)

解决办法:在yarn-site.xml中配置一个id,如下。

1<property>
2 <name>yarn.resourcemanager.cluster-id</name>
3 <value>cluster1</value>
4</property>

ZKFailoverController启动失败问题

异常一

12019-09-30 18:15:45,010 FATAL org.apache.hadoop.hdfs.tools.DFSZKFailoverController: Got a fatal error, exiting now
2java.lang.IllegalArgumentException: Missing required configuration 'ha.zookeeper.quorum' for ZooKeeper quorum
3 at com.google.common.base.Preconditions.checkArgument(Preconditions.java:115)
4 at org.apache.hadoop.ha.ZKFailoverController.initZK(ZKFailoverController.java:340)
5 at org.apache.hadoop.ha.ZKFailoverController.doRun(ZKFailoverController.java:190)
6 at org.apache.hadoop.ha.ZKFailoverController.access$000(ZKFailoverController.java:60)
7 at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:171)
8 at org.apache.hadoop.ha.ZKFailoverController$1.run(ZKFailoverController.java:167)
9 at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:444)
10 at org.apache.hadoop.ha.ZKFailoverController.run(ZKFailoverController.java:167)
11 at org.apache.hadoop.hdfs.tools.DFSZKFailoverController.main(DFSZKFailoverController.java:192)

解决办法:

  • 确认是否配置了
1<!--zookeeper配置,hadoop依赖zk进行选主-->
2<property>
3 <name>ha.zookeeper.quorum</name>
4 <value>node01:2181,node02:2181,node03:2181</value>
5</property>
  • 检查服务器时间是否同步

如何同步服务器时间

注意: 同步需要在root用户下。

异常二

12019-09-30 15:42:05,418 FATAL org.apache.hadoop.ha.ZKFailoverController: Unable to start failover controller. Parent znode does not exist.
2Run with -formatZK flag to initialize ZooKeeper.

解决办法: 此刻以为这你的hadoop节点还没有注册到zookeeper中,需要初始化。

1# 执行命令进行初始化
2hdfs zkfc -formatZK

重新起动集群即可。