大讲台Hadoop3.0分布式集群搭建(HA)详细文档
张老师2017/06/14         
在搭建Hadoop分布式集群之前,我们需要先准备好3台主机,分别安装好Linux系统,并完成Linux系统的网络配置和系统配置。 没有准备好的同学可以免费学习大讲台的Linux课程:http://www.dajiangtai.com/course/26.do,已经准备好的同学可以接着往后学习。
1.集群安装规划
1.1 主机规划
这里我们选择3台主机搭建Hadoop3.0高可用的分布式集群,虽然节点有点少,但是足以完成分布式集群搭建,并进行合
理的主机规划。
大家需要注意的是:从Hadoop3.0开始支持更多的Namenode,因为我们只有3台机器,所以这3台机器都配置问Namenode,实际工作中Namenode也不宜过多,否则对集群造成压力。其他角色保持跟Hadoop2.x一致即可,如果Hadoop2.x集群不熟悉可以参考大讲台课程:http://www.dajiangtai.com/course/4.do
1.2 软件规划
需要注意的是:Hadoop3.0最低支持Java8,如果大家还在使用Java7或者更低版本,请升级到Java8。
1.3用户规划
出于权限考虑,Hadoop集群环境安装不要使用root用户,需要大家自己创建相关的用户和用户组,注意创建用户的时候需要设置密码。
在搭建Hadoop集群之前,需要规划好所有的软件目录和数据存放目录,便于后期的管理与维护。
2. 集群安装前的环境检查
2.1时钟同步
所有节点的系统时间要与当前时间保持一致,否则集群运行会出现异常。时钟同步在3台机器上都需要操作,这里以master节点为例。
首先查看master节点的当前系统时间
如果系统时间与当前网络时间不一致,进行以下操作。
[root@master ~]# cd /usr/share/zoneinfo/ [root@master zoneinfo]# ls //找到Asia [root@master zoneinfo]# cd Asia/ //进入Asia目录 [root@master Asia]# ls //找到Shanghai [root@master Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //当前时区替换为上海
我们可以保持当前系统时间与NTP(网络时间协议)一致。
[root@master Asia]# yum install ntp //如果ntp命令不存在,在线安装ntp [root@master Asia]# ntpdate pool.ntp.org //执行此命令同步日期时间 [root@master Asia]# date //查看当前系统时间
2.2 hosts文件检查
为了便于集群的操作,所有节点的hosts文件需要配置静态ip与hostname之间的对应关系。

2.2 hosts文件检查
为了便于集群的操作,所有节点的hosts文件需要配置静态ip与hostname之间的对应关系。
[root@master ~]# service iptables status
执行以下命令可以临时关闭防火墙
[root@master ~]# service iptables stop
执行以下命令才可以永久关闭防火墙
[root@master ~]# chkconfig iptables off
如果防火墙状态如下,则说明防火墙已经关闭。
3. 配置SSH免密码通信
Hadoop 集群中各个节点间会通过 SSH 访问,每次访问都输入密码是不切实际的,所以需要配置各个节点间的 SSH 是无密码登录的。
首先在各个节点上生成公钥,这里以master节点、Hadoop3用户为例
[root@master ~]# su hadoop3 //切换到hadoop3用户下 [hadoop3@master root]$ cd //切换到hadoop3用户目录 [hadoop3@master ~]$ mkdir .ssh [hadoop3@master ~]$ ssh-keygen -t rsa //执行命令一路回车,生成秘钥 [hadoop3@master ~]$cd .ssh [hadoop3@master .ssh]$ ls id_rsa id_rsa.pub [hadoop3@master .ssh]$ cat id_rsa.pub >> authorized_keys //将公钥保存到authorized_keys认证文件中 [hadoop3@master .ssh]$ ls authorized_keys id_rsa id_rsa.pub [hadoop3@master .ssh]$ cd .. [hadoop3@master ~]$ chmod 700 .ssh [hadoop3@master ~]$ chmod 600 .ssh/* [hadoop3@master ~]$ ssh master //第一次执行需要输入yes [hadoop3@master ~]$ ssh master //第二次以后就可以直接访问
将另外2个节点中的共钥id_ras.pub拷贝到master节点中的authorized_keys文件中。
cat ~/.ssh/id_rsa.pub | ssh hadoop3@master 'cat >> ~/.ssh/authorized_keys'
然后将master中的authorized_keys文件分发到其他2个节点上。
scp -r authorized_keys hadoop3@slave1:~/.ssh/ scp -r authorized_keys hadoop3@slave2:~/.ssh/
各个节点如果能通过ssh相互访问,且不需要输入密码,则代表ssh配置成功。
4. 脚本工具的使用
在master节点,hadoop3用户下创建/home/hadoop3/tools目录。
[hadoop3@master ~]$ mkdir /home/hadoop3/tools cd /home/hadoop3/tools
将本地脚本文件上传至/home/hadoop3/tools目录下,这些脚本大家可以自己写, 如果不熟练也可以直接使用。
[hadoop3@master tools]$ rz deploy.conf [hadoop3@master tools]$ rz deploy.sh [hadoop3@master tools]$ rz runRemoteCmd.sh [hadoop3@master tools]$ ls deploy.conf deploy.sh runRemoteCmd.sh
查看一下deploy.conf配置文件内容。
[hadoop3@master tools]$ cat deploy.conf master,all,namenode,zookeeper,resourcemanager, slave1,all,slave,namenode,zookeeper,resourcemanager, slave2,all,slave,datanode,zookeeper,
查看一下deploy.sh远程复制文件脚本内容。
[hadoop3@master tools]$ cat deploy.sh #!/bin/bash #set -x if [ $# -lt 3 ] then echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag" echo "Usage: ./deply.sh srcFile(or Dir) descFile(or Dir) MachineTag confFile" exit fi src=$1 dest=$2 tag=$3 if [ 'a'$4'a' == 'aa' ] then confFile=/home/hadoop3/tools/deploy.conf else confFile=$4 fi if [ -f $confFile ] then if [ -f $src ] then for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do scp $src $server":"${dest} done elif [ -d $src ] then for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do scp -r $src $server":"${dest} done else echo "Error: No source file exist" fi else echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory" fi
查看一下runRemoteCmd.sh远程执行命令脚本内容。
[hadoop3@master tools]$ cat runRemoteCmd.sh #!/bin/bash #set -x if [ $# -lt 2 ] then echo "Usage: ./runRemoteCmd.sh Command MachineTag" echo "Usage: ./runRemoteCmd.sh Command MachineTag confFile" exit fi cmd=$1 tag=$2 if [ 'a'$3'a' == 'aa' ] then confFile=/home/hadoop3/tools/deploy.conf else confFile=$3 fi if [ -f $confFile ] then for server in `cat $confFile|grep -v '^#'|grep ','$tag','|awk -F',' '{print $1}'` do echo "*******************$server***************************" ssh $server "source /etc/profile; $cmd" done else echo "Error: Please assign config file or run deploy.sh command with deploy.conf in same directory" fi
三个文件,方便我们搭建hadoop3分布式集群。具体如何使用看后面如何操作。
如果我们想直接使用脚本,还需要给脚本添加执行权限。
[hadoop3@master tools]$ chmod u+x deploy.sh [hadoop3@master tools]$ chmod u+x runRemoteCmd.sh
同时我们需要将/home/hadoop3/tools目录配置到PATH路径中。
[hadoop3@master tools]$vi ~/.bashrc PATH=/home/hadoop3/tools:$PATH export PATH我们在master节点上,通过runRemoteCmd.sh脚本,一键创建所有节点的软件安装目录
/home/hadoop3/app。 [hadoop3@master tools]$ runRemoteCmd.sh "mkdir /home/hadoop3/app" all
我们可以在所有节点查看到/home/hadoop3/app目录已经创建成功。
5. jdk安装
下载jdk1.8至本地,然后将jdk1.8上传至/home/hadoop3/app目录下。
[hadoop3@master app]$ ls jdk-8u51-linux-x64.tar.gz
解压
[hadoop3@master app]$ tar –zxvf jdk-8u51-linux-x64.tar.gz
删除安装包
[hadoop3@master app]$ rm –rf jdk-8u51-linux-x64.tar.gz [hadoop3@master app]$ ls jdk1.8.0_51
创建jdk软链接
[hadoop3@master app]$ ln –s jdk1.8.0_51 jdk
在hadoop3用户下,配置jdk环境变量
[hadoop3@master app]$ vi ~/.bashrc JAVA_HOME=/home/hadoop3/app/jdk CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$JAVA_HOME/bin:/home/hadoop3/tools:$PATH export JAVA_HOME CLASSPATH PATH
生效配置文件
[hadoop3@master app]$ source ~/.bashrc
确认jdk配置成功
[hadoop3@master app]$ java -version java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
通过deploy.sh脚本将jdk安装目录分发到另外两个节点
[hadoop3@master app]$ deploy.sh jdk1.8.0_51 /home/hadoop3/app/ slave
在另外两个节点做相关操作,完成jdk配置
6. Zookeeper安装
6.1解压
下载zookeeper-3.4.6.tar.gz安装包,然后上传至/home/hadoop3/app目录
[hadoop3@master app]$ ls zookeeper-3.4.6.tar.gz [hadoop3@master app]$ tar –zxvf zookeeper-3.4.6.tar.gz [hadoop3@master app]$ ls zookeeper-3.4.6 [hadoop3@master app]$ rm –rf zookeeper-3.4.6.tar.gz
6.2修改配置文件
[hadoop3@master app]$ cd zookeeper-3.4.6/conf/ [hadoop3@master conf]$ ls configuration.xsl log4j.properties zoo_sample.cfg [hadoop3@master conf]$ cp zoo_sample.cfg zoo.cfg [hadoop3@master conf]$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 an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/home/hadoop3/data/zookeeper/zkdata dataLogDir=/home/hadoop3/data/zookeeper/zkdatalog # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888
备注:
1 2 3代表服务编号;2888代表Zookeeper节点通信端口;3888代表zook选举端口
6.3远程拷贝
通过远程脚本deploy.sh将Zookeeper安装目录拷贝到其他节点。
[hadoop3@master app]$ deploy.sh zookeeper-3.4.6 /home/hadoop3/app/ slave所有节点创建数据目录和日志目录
[hadoop3@master app]$ runRemoteCmd.sh "mkdir -p /home/hadoop3/data/zookeeper/zkdata" all [hadoop3@master app]$ runRemoteCmd.sh "mkdir -p /home/hadoop3/data/zookeeper/zkdatalog" all
6.4创建myid文件
在各个节点上,在 dataDir 所指定的目录下创一个名为 myid 的文件, 文件内容为各个server 点后面的数字。
[hadoop3@master zkdata]$ vi myid

[hadoop3@slave1 zkdata]$ vi myid

[hadoop3@slave2 zkdata]$ vi myid

6.5测试运行
使用runRemoteCmd.sh 脚本,启动所有节点上面的Zookeeper。
[hadoop3@master zookeeper-3.4.6]$runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh start" zookeeper

查看所有节点上面的QuorumPeerMain进程是否启动。
[hadoop3@master zookeeper-3.4.6]$ runRemoteCmd.sh "jps" all

查看所有Zookeeper节点状态。
[hadoop3@master zookeeper-3.4.6]$ runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh status" all

如果一个节点为leader,另两个节点为follower,则说明Zookeeper安装成功。
7.Hadoop3.0分布式集群搭建
7.1配置HDFS
7.1.1下载解压Hadoop3.0
到Hadoop官网下载hadoop-3.0.0-alpha2.tar.gz,并上传至/home/hadoop3/app目录
[hadoop3@master app]$ ls hadoop-3.0.0-alpha2.tar.gz [hadoop3@master app]$tar –zxvf hadoop-3.0.0-alpha2.tar.gz [hadoop3@master app]$ ls hadoop-3.0.0-alpha2.tar.gz hadoop-3.0.0-alpha3 [hadoop3@master app]$ rm –rf hadoop-3.0.0-alpha2.tar.gz [hadoop3@master app]$ mv hadoop-3.0.0-alpha3 hadoop-3.0.0
7.1.2配置hadoop-env.sh
[hadoop3@master app]$ cd hadoop-3.0.0/etc/hadoop/ [hadoop3@master hadoop]$ vi hadoop-env.sh export JAVA_HOME=/home/hadoop3/app/jdk export HADOOP_HOME=/home/hadoop3/app/hadoop
7.1.3配置core-site.xml
[hadoop3@master hadoop]$ vi core-site.xmlfs.defaultFS hdfs://mycluster hadoop.tmp.dir /home/hadoop3/data/tmp ha.zookeeper.quorum master:2181,slave1:2181,slave2:2181
7.1.4配置hdfs-site.xml
[hadoop3@master hadoop]$ vi hdfs-site.xmldfs.nameservices mycluster dfs.permissions.enabled false dfs.ha.namenodes.mycluster nn1,nn2,nn3 dfs.namenode.rpc-address.mycluster.nn1 master:9820 dfs.namenode.rpc-address.mycluster.nn2 slave1:9820 dfs.namenode.rpc-address.mycluster.nn3 slave2:9820 dfs.namenode.http-address.mycluster.nn1 master:9870 dfs.namenode.http-address.mycluster.nn2 slave1:9870 dfs.namenode.http-address.mycluster.nn3 slave2:9870 dfs.ha.automatic-failover.enabled true dfs.namenode.shared.edits.dir qjournal://master:8485;slave1:8485;slave2:8485/mycluster dfs.journalnode.edits.dir /home/hadoop3/data/journaldata/jn dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /home/hadoop3/.ssh/id_rsa dfs.ha.fencing.ssh.connect-timeout 10000 dfs.namenode.handler.count 100 dfs.ha.automatic-failover.enabled true
7.1.5配置workers
[hadoop3@master hadoop]$ vi workers master slave1 slave2
注意:hadoop2.x配置的是slaves文件,这里有所改变。
7.1.6将hadoop3.0安装包分发到其他节点
[hadoop3@master app]$ deploy.sh hadoop-3.0.0 /home/hadoop3/app/ slave
7.1.7创建hadoop3.0软连接
在所有节点上创建hadoop3.0软连接,这里以master节点为例。
[hadoop3@master app]$ ln -s hadoop-3.0.0 hadoop [hadoop3@master app]$ ls hadoop hadoop-3.0.0
7.1.8配置hadoop3.0环境变量
在所有节点上配置hadoop3.0环境变量,这里以master节点为例
[hadoop3@master app]$ vi ~/.bashrc JAVA_HOME=/home/hadoop3/app/jdk HADOOP_HOME=/home/hadoop3/app/hadoop CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar PATH=$JAVA_HOME/bin:HADOOP_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH HADOOP_HOME
7.1.9格式化hdfs
第一次安装hdfs的时候,需要对hdfs进行相关的格式化操作,以后就不需要了。
7.1.9.1先启动Zookeeper
[hadoop3@master app]$runRemoteCmd.sh "/home/hadoop3/app/zookeeper-3.4.6/bin/zkServer.sh start" all7.1.9.2接着启动journalnode
[hadoop3@master app]$ runRemoteCmd.sh "/home/hadoop3/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
7.1.9.3在master节点上执行格式化
[hadoop3@master hadoop]$ bin/hdfs namenode -format / /namenode 格式化
[hadoop3@master hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop3@master hadoop]$bin/hdfs namenode //启动namenode
7.1.9.4备用节点slave1 slave2通过master节点元数据信息,分别在slave1、slave2节点上执行。
[hadoop3@slave1 hadoop]$ bin/hdfs namenode -bootstrapStandby [hadoop3@slave2 hadoop]$ bin/hdfs namenode -bootstrapStandby
7.1.9.5slave1 slave2节点同步完master上的元数据之后,在master节点上按下ctrl+c来结束namenode进程。
7.1.9.6关闭所有节点journalnode
[hadoop3@master app]$ runRemoteCmd.sh "/home/hadoop3/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all
7.1.10 启动HDFS
一键启动hdfs
[hadoop3@master hadoop]$ sbin/start-dfs.sh

7.1.11 测试运行HDFS
7.1.11.1查看HDFS Web界面,这里配置的master slave1 slave2节点都为namenode。

关闭active状态的namenode,检查是否会自动切换其他节点
7.1.11.2测试hdfs文件上传
[hadoop3@master hadoop]$ vi djt.txt hadoop hadoop hadoop dajiangtai dajiangtai dajiangtai [hadoop3@master hadoop]$ bin/hdfs dfs -mkdir /dajiangtai [hadoop3@master hadoop]$ bin/hdfs dfs -put djt.txt /dajiangtai [hadoop3@master hadoop]$ bin/hdfs dfs -cat /dajiangtai/djt.txt

7.2配置YARN
7.2.1配置mapred-site.xml
[hadoop3@master hadoop]$ vi mapred-site.xmlmapreduce.framework.name yarn mapreduce.application.classpath /home/hadoop3/app/hadoop/etc/hadoop, /home/hadoop3/app/hadoop/share/hadoop/common/*, /home/hadoop3/app/hadoop/share/hadoop/common/lib/*, /home/hadoop3/app/hadoop/share/hadoop/hdfs/*, /home/hadoop3/app/hadoop/share/hadoop/hdfs/lib/*, /home/hadoop3/app/hadoop/share/hadoop/mapreduce/*, /home/hadoop3/app/hadoop/share/hadoop/mapreduce/lib/*, /home/hadoop3/app/hadoop/share/hadoop/yarn/*, /home/hadoop3/app/hadoop/share/hadoop/yarn/lib/*
7.2.2配置yarn-site.xml
[hadoop3@master hadoop]$ vi yarn-site.xmlyarn.resourcemanager.connect.retry-interval.ms 2000 yarn.resourcemanager.ha.enabled true yarn.resourcemanager.ha.automatic-failover.enabled true yarn.resourcemanager.ha.automatic-failover.embedded true yarn.resourcemanager.cluster-id yarn-rm-cluster yarn.resourcemanager.ha.rm-ids rm1,rm2 yarn.resourcemanager.hostname.rm1 master yarn.resourcemanager.hostname.rm2 slave1 yarn.resourcemanager.recovery.enabled true The class to use as the persistent store. yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore yarn.resourcemanager.zk.state-store.address master:2181,slave1:2181,slave2:2181 yarn.resourcemanager.zk-address master:2181,slave1:2181,slave2:2181 yarn.resourcemanager.address.rm1 master:8032 yarn.resourcemanager.scheduler.address.rm1 master:8034 yarn.resourcemanager.webapp.address.rm1 master:8088 yarn.resourcemanager.address.rm2 slave1:8032 yarn.resourcemanager.scheduler.address.rm2 slave1:8034 yarn.resourcemanager.webapp.address.rm2 slave1:8088 yarn.nodemanager.aux-services mapreduce_shuffle yarn.nodemanager.aux-services.mapreduce_shuffle.class org.apache.hadoop.mapred.ShuffleHandler
7.2.3脚本分发修改的yarn配置
[hadoop3@master hadoop]$ deploy.sh mapred-site.xml /home/hadoop3/app/hadoop-3.0.0/etc/hadoop/ slave [hadoop3@master hadoop]$ deploy.sh yarn-site.xml /home/hadoop3/app/hadoop-3.0.0/etc/hadoop/ slave
7.2.4启动yarn
在master节点启动resourcemanager
[hadoop3@master hadoop]$ bin/yarn --daemon start resourcemanager
在slave1节点启动resourcemanager
[hadoop3@slave1 hadoop]$ bin/yarn --daemon start resourcemanager
在3个节点分别启动nodemanager
[hadoop3@master hadoop]$ bin/yarn --daemon start nodemanager [hadoop3@slave1 hadoop]$ bin/yarn --daemon start nodemanager [hadoop3@slave2 hadoop]$ bin/yarn --daemon start nodemanager
7.2.5 通过Web查看YARN

7.2.6检查ResourceManager状态

关闭active 状态的resourcemanager,检查另外一个节点是否能称为active状态。
7.2.7测试运行WordCount
[hadoop3@master hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0-alpha2.jar wordcount /dajiangtai/djt.txt /dajiangtai/output

查看yarn的Web界面

查看运行结果
[hadoop3@master hadoop]$ bin/hdfs dfs -cat /dajiangtai/output/*

如果以上操作没有问题,说明Hadoop3.0分布式高可用集群成功搭建完毕。
Hadoop3.0集群搭建所有资料 下载提取码:iqui
看完这篇文章的人大多学习了更多课程>>

151****3153 2021/06/02
回复
黄金之兽 2020/07/19
回复
我爱大讲台 2019/06/04
回复
157****3058 2019/04/08
回复
Flink带头大哥 2019/01/24
回复