原创

Hadoop集群部署文档

服务器集群

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

集群规划

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参考以下链接

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)

配置网卡及主机名

编辑文件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

同步服务器时间

# 安装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

切换到hadoop用户!!

切换到hadoop用户!!

切换到hadoop用户!!

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

su - 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.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/目录中,

# 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,不再要求密码。

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

## 生成密钥
## 期间需要输入几次回车,直接回车即可
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的元数据信息的初始化。

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

命令

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的状态!

node01:50070
node02:50070

常见问题

不小心多次格式化namenode

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

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

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

重新起动集群即可。

sev7e0
Write by sev7e0
end
本文目录