阶段一(非实操):搭建普通集群(非HA,了解一下即可) 

 一、完全分布式集群

1.规划
    Hadoop中的进程在多台机器运行!

    HDFS:  1个NN+N个DN N个2NN
    YARN:  1个RM+N个NM

避免单点故障,NN和RM建议分散到多台机器!
    注意负载均衡

hadoop101    hadoop102     hadoop103
      DN                 DN                 DN
      NM                 NM                NM
      NN                 RM                2NN

2.准备集群,安装软件

①克隆三台虚拟机
        a)在每台机器的/etc/hosts中配置集群所有机器的ip和主机名的映射
        b)提供atguigu用户,配置atguigu用户具有root权限
        c)保证三台机器可以互相联通
②安装软件,在一台机器安装,再将这台机器的软件复制到其他机器

二、常用命令

1. scp(安全拷贝)
        全量复制!
        使用: scp -r  源文件用户名A@主机名1:path1    目标文件用户名B@主机名2:path2
                -r: 递归,复制目录
                
                如果从本机执行读取或写入,用户名B@主机名2:可以省略!
        
        在主机1上,使用A用户读取path1的文件,再使用用户B登录到主机2,在主机2的path2路径执行写入!
        
        要求: 用户名A@主机名1 对path1有读权限
               用户名B@主机名2 对path2有写权限
               
2. rsync (远程同步)
        可以只同步变化的文件(对比文件的修改时间)!增量同步!
        
        使用: rsync -rvlt   path1    目标文件用户名B@主机名2:path2
                -r: 递归,复制目录
                -v: 显示复制的过程
                -l:  同步软连接
                -t:  基于文件的修改时间进行对比,只同步修改时间不同的文件
                
        只能将本机的文件同步到其他机器!
        
        注意:  rsync -rvlt   path1    目标文件用户名B@主机名2:path2
        
        path1是个目录,目录以/结尾,只会同步目录中的内容,不会同步目录本身!
        path1是个目录,目录不以/结尾,同步目录中的内容,也会同步目录本身!
            
3. 免输入密码登录,借助SSH实现

        举例:  A机器的a用户,希望在A机器上,使用b用户的身份登录到B机器!
        
        实现步骤: ①A机器的a用户,在A机器上生成一对密钥
                                    ssh-keygen -t rsa

                           ②密钥分为公钥和私钥,a用户需要将公钥拷贝到B机器上b用户的家目录下的
                                authorithxxxx_keys

                                    a)使用b用户登录到B机器
                                    b)编辑authorithxxxx_keys,将公钥的内容进行添加
                                    
                                也可以在A机器,使用a用户执行以下命令: ssh-copy-id  b@B
                                
                           ③A机器的a用户,可以使用 ssh  b@B进行登录!
                           
                注意: 如果使用ssh 直接登录 主机名
                            默认使用当前用户对目标主机进行登录!
                            
4. 编写同步脚本xsync

        作用: 将当前机器的文件,同步到集群所有机器的相同路径下!
                    hadoop102:/A/a , 执行脚本后,将此文件同步到集群中所有机器的 /A/a
        
        用户在使用xsync时,只需要传入要同步的文件即可
                xysnc a 
                不管a是一个相对路径还是绝对路径,都需要将a转换为绝对路径!
                
        文件的绝对路径:  
                父路径:  dirpath=$(cd `dirname /home/atguigu/hi`; pwd -P)
                文件名:  filename=`basename hi`
                    
        核心命令:  
                for(())
                do
                    rsync -rvlt   path1
                done

一、使用ssh执行命令

①ssh 目标机器 

        登录之后,执行某个命令!
        属于Login-shell,会自动读取 /etc/profile文件中定义的所有的变量!
        
②ssh 目标机器  命令

        属于non-login-shell
        不会读取/etc/profile
        
        如果在使用命令时,我们需要使用/etc/profile定义的一些变量,需要在
        目标机器的对应的用户的家目录/.bashrc中添加以下代码
        
        source /etc/profile
        
        如果不添加以上代码,在执行start-all.sh | stop-all.sh一定会报错!
        
二、启动Hadoop

HDFS
    ①需要在NN所配置的节点进行格式化
    ②在不同的节点启动不同的进程
    
三、运行群起脚本

①群起脚本的原理是获取集群中所有的节点的主机名
            默认读取当前机器 HADOOP_HOME/etc/hadoop/slaves,获取集群中所有的节点的主机名
        
②循环执行 ssh 主机名 hadoop-daemon.sh start xxx
            保证当前机器到其他节点,已经配置了ssh免密登录
            保证集群中所有当前用户的家目录/.bashrc中,已经配置source /etc/profile
        
注意: start-all.sh时,其实分别调用了start-dfs.sh和start-yarn.sh
            start-dfs.sh可以在集群的任意一台机器使用!可以启动HDFS中的所有进程!
            start-yarn.sh在集群的非RM所在的机器使用,不会启动resourcemanager!
            
建议: 只需要配置RM所在机器到其他机器的SSH免密登录!
            都在RM所在的机器执行群起和群停脚本!
            xsync和xcall只放在RM所在的机器即可!

设置集群时间同步 

方式:

        找一个机器作为时间服务器,所有的机器与这台集群时间进行定时的同步。比如每隔十分钟同步一次时间。

原因:

        很多集群操作对时间同步的要求性很高,最高的像HBase,要求不差不能超过秒级。

注意:

        这只是“同步”,并不保证时间一定是正确的。

协议:

        ntp协议

xsync 集群分发脚本

#!/bin/bash #校验参数是否合法 if(($#==0)); then echo "请输入要分发的文件" exit; fi #获取分发文件的绝对路径 dirpath=$(cd `dirname $1`;pwd -P) filename=`basename $1` echo "要分发的文件的路径是:$dirpath/$filename" #循环执行rsync分发文件到集群的每条机器 for (( i = 101; i <= 103; i++ )); do echo "--------------------hadoop$i-------------------" rsync -rvlt $dirpath/$filename root@hadoop$i:$dirpath done

xcall 集群群起脚本

#!/bin/bash
#在集群的所有机器上批量执行统一条命令
if(($#==0));then
	echo "请输入您要操作的命令!"
fi

echo "要执行的命令是$*"

#循环执行此命令
for (( i = 101; i <= 103; i++ )); do
	echo "---------------------hadoop$i-------------------"
	ssh hadoop$i "source /etc/profile ; $*"
done

配置文件 

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop101:9000</value>
</property>

<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>

</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
	<name>dfs.namenode.secondary.http-address</name>
	<value>hadoop103:50090</value>
</property>

</configuration>

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 告诉mapreduce使用yarn运行程序 -->
<property>
	<name>mapreduce.framework.name</name>
	<value>yarn</value>
</property>
<!-- 配置job历史服务器 -->
<property>
	<name>mapreduce.jobhistory.address</name>
	<value>hadoop101:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop101:19888</value>
</property>
<!--第三方框架使用yarn计算的日志聚集功能 -->
<property> 
	<name>yarn.log.server.url</name>         
	<value>http://hadoop101:19888/jobhistory/logs</value> 
</property>

</configuration>

yarn-site.xml

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<!-- nodemanager启动shuffle线程 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>hadoop102</value>
</property>
<!-- 日志聚集功能使能 -->
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>
<!-- 表示单个容器可以申请的最小内存(1G) -->
<property>
	<name>yarn.scheduler.minimum-allocation-mb</name>
	<value>1024</value>
</property>
<!-- 表示单个容器可以申请的最大内存(8G) -->
<property>
	<name>yarn.scheduler.maximum-allocation-mb</name>
	<value>8192</value>
</property>
<!-- 表示单个节点可用的最大内存,RM中的两个值都不应该超过该值 -->
<property>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>8192</value>
</property>
<!-- 表示虚拟内存率,即占task所用内存的百分比,默认为2.1 -->
<property>
	<name>yarn.nodemanager.vmem-pmem-ratio</name>
	<value>2.1</value>
</property>

</configuration>

 阶段二(非实操):搭建 HDFS-HA 和 YARN-HA

 一、Hadoop的HA

1. HA
        H(high)A(avilable): 高可用,意味着必须有容错机制,不能因为集群故障导致不可用!
        
        HDFS: 满足高可用
                    NN:  一个集群只有一个,负责接受客户端请求!
                    DN:  一个集群可以启动N个
        YARN: 满足高可用
                    RM:  一个集群只有一个,负责接受客户端请求!
                    NM:  一个集群可以启动N个
                    
        实现hadoop的HA,必须保证在NN和RM故障时,采取容错机制,可以让集群继续使用!
        
2. 防止故障
    核心: 避免NN和RM单点故障
    以HDFS的HA为例:
            ①NN启动多个进程,一旦当前正在提供服务的NN故障了,让其他的备用的NN继续顶上
            ②NN负责接受客户端的请求

                    在接收客户端的写请求时,NN还负责记录用户上传文件的元数据

                    保证: 正在提供服务的NN,必须和备用的NN之中的元数据必须是一致的!
                
    元数据的同步:    

           ①在active的nn格式化后,将空白的fsimage文件拷贝到所有的nn的机器上

           ②active的nn在启动后,将edits文件中的内容发送给Journalnode进程,standby状态的nn主动从Journalnode进程拷贝数据,保证元数据的同步
                                  
    注意:  

        ①Journalnode在设计时,采用paxos协议, Journalnode适合在奇数台机器上启动!在hadoop中,要求至少需要3个Journalnode进程

        ②如果开启了hdfs的ha,不能再启动2nn
                
        ③当启动了多个NN时,是否允许多个NN同时提供服务?
                不允许多个NN同时对外提供服务,因为如果多个NN同时对外提供服务,那么
                在同步元数据时,非常消耗性能,而且容易出错!
                
                在同一时刻,最多只能有一个NN作为主节点,对外提供服务!
                其余的NN,作为备用节点!
                
                使用active状态来标记主节点,使用standby状态标记备用节点! 

3. HDFS HA的搭建步骤
①配置
        ①对 fs.defaultFS=hdfs://hadoop101:9000 进行修改
        
        ②在整个集群中需要启动N个NN,配置N个NN运行的主机和开放的端口!
        
        ③配置Journalnode
        
②启动
        ①先启动Journalnode
        ②格式化NN,精格式化后的fsimage文件同步到其他的NN
        ③启动所有的NN,需要将其中之一转为active状态

core-site.xml

hdfs-site.xml

yarn-site.xml

mapred-site.xml


阶段三(实操部分):半小时快速搭建HA集群

安装前环境搭建

1、准备三台虚拟机,三台虚拟机的静态ip和主机名分别是:

• 192.168.1.101 hadoop101
• 192.168.1.102 hadoop102
• 192.168.1.103 hadoop103

分别修改三台机器的主机名,命令:

• hostnamectl set-hostname hadoop101
• hostnamectl set-hostname hadoop102
• hostnamectl set-hostname hadoop103

分别修改三台机器的静态ip,命令:

• sed -i 's/dhcp/static/' /etc/sysconfig/network-scripts/ifcfg-ens33
• echo "IPADDR=192.168.1.104" >> /etc/sysconfig/network-scripts/ifcfg-ens33
• echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-ens33
• echo "GATEWAY=192.168.1.2" >> /etc/sysconfig/network-scripts/ifcfg-ens33
• echo "DNS1=114.114.114.114" >> /etc/sysconfig/network-scripts/ifcfg-ens33
• echo "DNS2=8.8.8.8" >> /etc/sysconfig/network-scripts/ifcfg-ens33

如下图所示:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
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="ens33"
UUID="4e1e2799-2457-4fbd-8f14-e182cacb0898"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.101
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
DNS1=114.114.114.114
DNS2=8.8.8.8

分别重启三台机器的网卡

  • systemctl restart network

2、在hadoop102节点编辑 /etc/hosts 主机映射文件

• sed -i '$a192.168.1.102 hadoop102' /etc/hosts
• sed -i '$a192.168.1.103 hadoop103' /etc/hosts
• sed -i '$a192.168.1.104 hadoop104' /etc/hosts
  • vi /etc/hosts 查看

内容如下:

hadoop 配置高可用后 hadoop高可用搭建_1024程序员节

192.168.1.101 hadoop101 192.168.1.102 hadoop102 192.168.1.103 hadoop103

3、配置ssh免登录,先把hadoop102节点到其他节点的免密登录配好

  • 生成私钥和公钥
  • ssh-keygen -t rsa
  • 将公钥拷贝分别拷贝到 hadoop101、hadoop102、hadoop103节点
• ssh-copy-id hadoop102
• ssh-copy-id hadoop103
• ssh-copy-id hadoop104

4、编写hadoop102节点 xcall 脚本保存在 /root/bin,没有则创建这个目录,提升可执行权限(xcall脚本核心命令:ssh 用户名@主机名 需要执行的操作)

• mkdir /root/bin
• touch /root/bin/xcall
• chmod -R +x /root/bin/xcall
• vi /root/bin/xcall
#!/bin/bash
#在集群的所有机器上批量执行统一条命令
if(($#==0));then
	echo "请输入您要操作的命令!"
fi

#获取用户名
user=`whoami`

echo "要执行的命令是$*"

#循环执行此命令
for (( host = 102; host <= 104; host++ )); do
	echo "---------------------hadoop$host-------------------"
	ssh $user@hadoop$host "source /etc/profile ; $*"
done


7、更改下载源,安装必要软件

更改三台机器下载源为阿里云

• xcall cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
• xcall yum -y install wget
• xcall wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
• xcall yum clean all
• xcall yum makecache

在三台机器安装vim

  • xcall yum -y install vim

在三台机器安装psmisc

  • xcall yum -y install psmisc

安装分发软件rsync

  • xcall yum -y install rsync

5、编写hadoop102节点 xsync 脚本保存在 /root/bin,没有则创建这个目录,提升可执行权限(xsync核心脚本:rsync -rvlt 源目录或文件 用户名@主机名:目标目录或文件)

• touch /root/bin/xsync
• chmod -R +x /root/bin/xsync
• vim /root/bin/xsync
#!/bin/bash
#校验参数是否合法
if(($#==0)); then
	echo "请输入要分发的文件"
	exit;
fi

#获取分发文件的绝对路径
dirpath=$(cd `dirname $1`;pwd -P)
filename=`basename $1`

echo "要分发的文件的路径是:$dirpath/$filename"

#循环执行rsync分发文件到集群的每条机器
for (( i = 102; i <= 104; i++ )); do
	echo "--------------------hadoop$i-------------------"
	rsync -rvlt $dirpath/$filename root@hadoop$i:$dirpath
done


6、使用xsync脚本将 /etc/hosts 和 /root/bin 分发到每个节点

• xsync /etc/hosts
• xsync /root/bin

7、在hadoop102节点的 /root/bashrc文件末尾加上 source /etc/profile命令,并使用xsync脚本分发一下

• sed -i '$asource /etc/profile' /root/.bashrc
• xsync /root/.bashrc

8、将另外两个节点登录到其他节点的免密登录全部配好(最好全部搭,要么就只搭有NN的节点)

• hadoop101 登录 hadoop101、102、103(必须搭!!!)
• hadoop103 登录 hadoop101、102、103

9、关闭防火墙,并设置开机不自启动

  • xcall systemctl stop firewalld
  • xcall systemctl disable firewalld

软件安装配置

1、将 jdk、hadoop、zookeeper的tar包都解压安装到hadoop102节点的安装目录,并配置环境变量

  • 创建安装目录:jdk180、hadoop260、zookeeper345
•    
• mkdir -p /opt/soft/jdk180
• mkdir -p /opt/soft/hadoop260
• mkdir -p /opt/soft/zookeeper345
  • 将所有的tar包上传到 /opt 目录下
  • tar -zxvf 压缩包名 -C 安装目录 --strip-components 1
•  
• tar -zxvf /opt/jdk-8u251-linux-x64.tar.gz -C /opt/soft/jdk180/ --strip-components 1
• tar -zxvf /opt/hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/soft/hadoop260/ --strip-components 1
• tar -zxvf /opt/zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/soft/zookeeper345/ --strip-components 1
  • 配置 /etc/profile 各个软件的环境变量
•    
• sed -i '$a\\n' /etc/profile
• echo "#java environment" >> /etc/profile
• echo "export JAVA_HOME=/opt/soft/jdk180" >> /etc/profile
• echo "export CLASSPATH=.:\${JAVA_HOME}/jre/lib/rt.jar:\${JAVA_HOME}/lib/dt.jar:\${JAVA_HOME}/lib/tools.jar
 export PATH=\$PATH:\${JAVA_HOME}/bin" >> /etc/profile• sed -i '$a\\n' /etc/profile
• echo "#hadoop environment" >> /etc/profile
• echo "export HADOOP_HOME=/opt/soft/hadoop260" >> /etc/profile
• echo "export HADOOP_MAPRED_HOME=\$HADOOP_HOME" >> /etc/profile
• echo "export HADOOP_COMMON_HOME=\$HADOOP_HOME" >> /etc/profile
• echo "export HADOOP_HDFS_HOME=\$HADOOP_HOME" >> /etc/profile
• echo "export YARN_HOME=\$HADOOP_HOME" >> /etc/profile
• echo "export HADOOP_COMMON_LIB_NATIVE_DIR=\$HADOOP_HOME/lib/native" >> /etc/profile
• echo "export PATH=\$PATH:\$HADOOP_HOME/sbin:\$HADOOP_HOME/bin" >> /etc/profile
• echo "export HADOOP_INSTALL=\$HADOOP_HOME" >> /etc/profile
• sed -i '$a\\n' /etc/profile
• echo "#zookeeper environment" >> /etc/profile
• echo "export ZOOKEEPER_HOME=/opt/soft/zookeeper345" >> /etc/profile
  • echo "export PATH=\$PATH:\$ZOOKEEPER_HOME/bin" >> /etc/profile

重新编译 profile文件

source /etc/profile

如下图所示:

#java environment
export JAVA_HOME=/opt/soft/jdk180
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

#hadoop environment
export HADOOP_HOME=/opt/soft/hadoop260
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

#zookeeper environment
export ZOOKEEPER_HOME=/opt/soft/zookeeper345
export PATH=$PATH:$ZOOKEEPER_HOME/bin

2、将 $HADOOP_HOME/etc/hadoop下的四个配置文件改为前面阶段二的四个配置文件的内容

  • hadoop-env.sh ,将里面的 export JAVA_HOME= 改为jdk安装目录的绝对地址
  • sed -i 's/${JAVA_HOME}/\/opt\/soft\/jdk180/' $HADOOP_HOME/etc/hadoop/hadoop-env.sh
  • core-site.xml ,原来就有 ,直接改内容
  • vim $HADOOP_HOME/etc/hadoop/core-site.xml

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<!--指定hadoop集群在zookeeper上注册的节点名-->
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://mycluster</value>
	</property>

	<!-- 指定Hadoop运行时产生文件的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>file:///opt/soft/hadoop260/tmp</value>
	</property>
	
	<!--设置缓存大小 默认4KB-->
	<property>
		<name>io.file.buffer.size</name>
		<value>4096</value>
	</property>

	<!-- 指定zookepper主机名和端口号 -->
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
	</property>
	
	<!--配置允许root代理访问主机节点-->
	<property>
		<name>hadoop.proxyuser.root.hosts</name>
		<value>*</value>
	</property>
	<!--配置该节点允许root用户所属的组-->
	<property>
		<name>hadoop.proxyuser.root.groups</name>
		<value>*</value>
	</property>

</configuration>
  • hdfs-site.xml ,原来就有 ,直接改内容
  • vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<!--数据块默认大小128M-->
	<property>
		<name>dfs.block.size</name>
		<value>134217728</value>
	</property>
	
	<!--指定HDFS副本的数量,默认是3-->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
	
	<!--namenode节点数据(元数据)的存放位置-->
	<property>
		<name>dfs.name.dir</name>
		<value>file:///opt/soft/hadoop260/dfs/namenode_data</value>
	</property>
	
	<!--datanode节点数据(元数据)的存放位置-->
	<property>
		<name>dfs.data.dir</name>
		<value>file:///opt/soft/hadoop260/dfs/datanode_data</value>
	</property>
	
	<!--开启hdfs的webui界面-->
	<property>
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
	
	<!--datanode上负责进行文件操作的线程数-->
	<property> 
		<name>dfs.datanode.max.transfer.threads</name>
		<value>4096</value>
	</property>
	
	<!--指定hadoop集群在zookeeper上的注册名-->
	<property>
		<name>dfs.nameservices</name>
		<value>mycluster</value>
	</property>

	<!--hacluster集群下有两个namenode分别是nn1,nn2-->
	<property>
		<name>dfs.ha.namenodes.mycluster</name>
		<value>nn1,nn2</value>
	</property>

	<!-- nn1的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
		<value>hadoop101:9000</value>
	</property>
	<!-- nn1的servicepc通信地址 -->
	<property>
		<name>dfs.namenode.servicepc-address.mycluster.nn1</name>
		<value>hadoop101:53310</value>
	</property>
	<!-- nn1的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.mycluster.nn1</name>
		<value>hadoop101:50070</value>
	</property>

	<!-- nn2的RPC通信地址 -->
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
		<value>hadoop102:9000</value>
	</property>
	<!-- nn2的servicepc通信地址 -->
	<property>
		<name>dfs.namenode.servicepc-address.mycluster.nn2</name>
		<value>hadoop102:53310</value>
	</property>
	<!-- nn2的http通信地址 -->
	<property>
		<name>dfs.namenode.http-address.mycluster.nn2</name>
		<value>hadoop102:50070</value>
	</property>

	<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster</value>
	</property>
	
	<!-- 声明journalnode服务器存储目录-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/opt/soft/hadoop260/dfs/journalnode_data</value>
	</property>
	
	<!--指定namenode操作日志存储位置-->
	<property>
		<name>dfs.namenode.edits.dir</name>
		<value>/opt/soft/hadoop260/dfs/edits</value>
	</property>

	<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>

	<!-- 使用隔离机制时需要ssh无秘钥登录-->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>

	<!-- 关闭权限检查-->
	<property>
		<name>dfs.permissions.enable</name>
		<value>false</value>
	</property>

	<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
	<property>
  		<name>dfs.client.failover.proxy.provider.mycluster</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>

	<!--开启namenode故障转移自动切换-->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>

</configuration>
  • yarn-site.xml ,原来就有 ,直接改内容
  • vim $HADOOP_HOME/etc/hadoop/yarn-site.xml

yarn-site.xml

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
	<!--nodemanager获取数据的方式-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!-- 指定Yarn集群在zookeeper上注册的节点名-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

	<!--指定两个resourcemanager的名称-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

	<!--指定rm1的主机-->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop102</value>
    </property>

	<!--指定rm2的主机-->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop103</value>
    </property>
 
    <!--指定zookeeper集群的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value>
    </property>

    <!--启用yarn自动恢复--> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!--配置执行resourcemanager恢复机制实现类--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
	
	<!--指定主resourcemanager的地址-->
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop103</value>
	</property>
	
	<!-- 日志聚集功能使能 -->
	<property>
		<name>yarn.log-aggregation-enable</name>
		<value>true</value>
	</property>
	<!-- 日志保留时间设置7天 -->
	<property>
		<name>yarn.log-aggregation.retain-seconds</name>
		<value>604800</value>
	</property>
	
    <!-- 表示单个容器可以申请的最小内存(1G) -->
    <property>
	    <name>yarn.scheduler.minimum-allocation-mb</name>
	    <value>1024</value>
    </property>
    <!-- 表示单个容器可以申请的最大内存(8G) -->
    <property>
	    <name>yarn.scheduler.maximum-allocation-mb</name>
	    <value>8192</value>
    </property>
    <!-- 表示单个节点可用的最大内存,RM中的两个值都不应该超过该值 -->
    <property>
	    <name>yarn.nodemanager.resource.memory-mb</name>
	    <value>8192</value>
    </property>
	
</configuration>
  • mapred-site.xml ,原来没有,将mapred-site.xml.template拷一份改名后改内容
  • cd $HADOOP_HOME/etc/hadoop/
  • cp mapred-site.xml.template mapred-site.xml
  • vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
	<!-- 指定mapreduce使用yarn上运行 -->
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
	
	<!-- 配置job历史服务器 -->
	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>hadoop101:10020</value>
	</property>
	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>hadoop101:19888</value>
	</property>
	
	<!--开启uber模式-->
	<property>
		<name>mapreduce.job.ubertask.enable</name>
		<value>true</value>
	</property>
	
	<!--第三方框架使用yarn计算的日志聚集功能 -->
	<property> 
		<name>yarn.log.server.url</name>         
		<value>http://hadoop101:19888/jobhistory/logs</value> 
	</property>

</configuration>

3、配置hadoop种slaves集群启动配置文件

  • sed -i 's/localhost/hadoop101/' $HADOOP_HOME/etc/hadoop/slaves
  • sed -i '$ahadoop102' $HADOOP_HOME/etc/hadoop/slaves
  • sed -i '$ahadoop103' $HADOOP_HOME/etc/hadoop/slaves

4、在 $ZOOKEEPER_HOME/ 这个目录下创建zkData

  • mkdir -p $ZOOKEEPER_HOME/zkData

5、拷贝 $ZOOKEEPER_HOME/conf 这个目录下的zoo_sample.cfg为zoo.cfg

  • cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg

6、修改zoo.cfg文件的内容,

  • sed -i 's/\/tmp\/zookeeper/\/opt\/soft\/zookeeper345\/zkData/' $ZOOKEEPER_HOME/conf/zoo.cfg
  • sed -i '17aserver.101=hadoop101:2888:3888' $ZOOKEEPER_HOME/conf/zoo.cfg
  • sed -i '18aserver.102=hadoop102:2888:3888' $ZOOKEEPER_HOME/conf/zoo.cfg
  • sed -i '19aserver.103=hadoop103:2888:3888' $ZOOKEEPER_HOME/conf/zoo.cfg
  • vim $ZOOKEEPER_HOME/conf/zoo.cfg 查看

如下图:

hadoop 配置高可用后 hadoop高可用搭建_hadoop 配置高可用后_02

7、在 $ZOOKEEPER_HOME/zkData 目录下创建一个myid的文件,在文件中添加与server对应的编号:如这台为hadoop101,那么就在里面写个101,跟上面zoo.cfg里内容对应

  • touch $ZOOKEEPER_HOME/zkData/myid
  • echo "102" >> $ZOOKEEPER_HOME/zkData/myid

8、使用xsync脚本分发 /opt目录和 /etc/profile文件

  • xsync /opt
  • xsync /etc/profile

重新编译3台节点 profile 文件

source /etc/profile

9、将另外两台节点 $ZOOKEEPER_HOME/zkData/myid 配置好

  • hadoop01节点:sed -i 's/102/101/' $ZOOKEEPER_HOME/zkData/myid
  • hadoop03节点:sed -i 's/102/103/' $ZOOKEEPER_HOME/zkData/myid

10、使用xcall脚本启动zookeeper,并查看状态,一个leader两个follower

  • xcall zkServer.sh start
  • xcall zkServer.sh status

11、使用xcall脚本在各个JournalNode节点上,输入以下命令启动journalnode服务

  • xcall hadoop-daemon.sh start journalnode

12、切换至hadoop101节点,对NN1进行格式化,并启动

  • hdfs namenode -format
  • hadoop-daemon.sh start namenode

13、切换至hadoop102节点,在NN2上,同步NN1的元数据信息

  • hdfs namenode -bootstrapStandby

14、在hadoop102节点上启动NN2

  • hadoop-daemon.sh start namenode

15、使用xcall脚本启动所有datanode

  • xcall hadoop-daemon.sh start datanode

16、在hadoop102节点上关闭hdfs

  • stop-dfs.sh

17、初始化HA在Zookeeper中状态

  • hdfs zkfc -formatZK

16、在hadoop102节点上群起HDFS服务

  • start-dfs.sh

13、验证:将Active NameNode进程kill,看另外的Standby节点是否变成了Active

14、在hadoop102节点群起YARN

  • start-yarn.sh

15、在hadoop103中启动RM2

  • yarn-daemon.sh start resourcemanager

16、查看服务状态

  • yarn rmadmin -getServiceState rm1 或者 rm2

17、设置集群同步

1. 检查ntp是否安装,需要有ntp和ntpdate

  • rpm -qa | grep ntp

如未安装输入命令安装:

  • xcall yum -y install ntp
  • xcall yum -y install ntpdate

2.检查ntp服务是否处于关闭状态,必须要确保当前ntp处于关闭状态

如未关闭,输入命令

  • xcall systemctl stop ntpd

3. 修改ntp配置文件

  • vim /etc/ntp.conf
  • 将restrict 192.168.*.*那行取消注释
  • 将server 0-3那行注释掉
  • sed -i '24aserver 127.127.1.0' /etc/ntp.conf
  • sed -i '25afudge 127.127.1.0 stratum 10' /etc/ntp.conf

hadoop 配置高可用后 hadoop高可用搭建_hadoop_03

4. 修改/etc/sysconfig/ntpd 文件,让硬件时间与系统时间一起同步

  • echo "SYNC_HWCLOCK=yes" >> /etc/sysconfig/ntpd

5. 启动ntpd服务

  • systemctl restart ntpd

6. 设置ntpd服务开机启动

  • systemctl enable ntpd

7. 其他机器配置

在其他机器上配置10分钟与时间服务器(hadoop102)同步一次

  • crontab -e

编写定时任务

  • */10 * * * * /usr/sbin/ntpdate hadoop102

测试:修改任意及其实践

        date -s "2020-01-01 11:11:11"

测试:十分钟后查看及其实践是否与时间服务器同步

        date