服务器准备

服务器购买

抢占式实例三台

此时采用bigdata102、bigdata103、bigdata104

集群(bigdata102、bigdata103、bigdata104)安全组只开放22端口

跳板机设置

本地用xshell连接服务器(ssh)

将bigdata102当作跳板机(公网ip,ssh连接22端口)、开隧道端口为10086,并在浏览器配置代理,只要是服务器内的web端口访问请求,都走10086端口代理

bigdata103、bigdata104通过跳板机代理,用内网ip连接ssh

bigdata102设置:公网ip连接,本地配置hosts

bigdata103、104连接设置:内网ip连接,配置代理

浏览器代理设置:

如此以来,就可以实现在三台服务器均只开放22端口的前提下,访问服务器内网的端口,比如hdfs的bigdata103:9870等等

安装基本工具

yum install -y  net-tools vim psmisc  nc  rsync  lrzsz  ntplibzstd openssl-static tree iotop git 

关防火墙及开机自启

systemctl stop firewalld
systemctl disable firewalld.service
systemctl restart network

创建atguigu用户,修改密码

用root用户创建atguigu用户,密码可以简单点

useradd atguigu
passwd atguigu   #此命令执行之后,输入新密码

给atguigu用户配置root权限

vim /etc/sudoers

添加第三行:

## Allow root to run any commandsanywhere
root    ALL=(ALL)     ALL
atguigu   ALL=(ALL)     NOPASSWD:ALL

记得最后:wq!退出

创建文件夹,修改其所有文件权限为atguigu

mkdir /opt/module
mkdir /opt/software

chown atguigu:atguigu /opt/module
chown atguigu:atguigu /opt/software

修改hosts文件,配置映射(linux全改,windows只需映射bigdata102,其他的走代理)

sudo vim /etc/hosts

服务器间免密登录

三台服务器都创建atguigu用户,密码为1

在bigdata102上atguigu账户生成公钥和私钥

在bigdata103上atguigu账户生成公钥和私钥

在bigdata104上atguigu账户生成公钥和私钥

在bigdata102上root账户生成公钥和私钥

ssh-keygen -t rsa

bigdata102上atguigu账户将公钥发送到102、103、104

bigdata103上atguigu账户将公钥发送到102、103、104

bigdata104上atguigu账户将公钥发送到102、103、104

bigdata102上root账户将公钥发送到102、103、104

ssh-copy-id bigdata102
ssh-copy-id bigdata103
ssh-copy-id bigdata104

xcall脚本需要依赖pdsh,安装:

 sudo yum install -y pdsh

注意:昊哥的xsync脚本依赖xcall脚本,xcall又依赖pdsh包,局限性很大,出现了root用户都不能分发环境变量的bug,此处用老版本的xsync,如下:

#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
   echo Not Enough Arguement!
   exit;
fi
#2. 遍历集群所有机器
for host in bigdata102 bigdata103 bigdata104
do
 echo ====================  $host ====================
   #3. 遍历所有目录,挨个发送
   for file in $@
   do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file);pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
   done
done

环境变量

sudo vim /etc/profile.d/my_env.sh

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk8
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/sbin

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

切换到root用户执行xsync分发环境变量

su root
xsync /etc/profile.d/my_env.sh

zookeeper

/opt/module/zookeeper/zkData/myid

2
3
4

zoo.cfg

dataDir=/opt/module/zookeeper/zkData

server.2=bigdata102:2888:3888
server.3=bigdata103:2888:3888
server.4=bigdata104:2888:3888

分发该文件

群起脚本zk.sh

#!/bin/bash

case $1 in
"start"){
        for i in bigdata102 bigdata103 bigdata104
        do
        echo ---------- zookeeper $i 启动 ------------
                ssh $i "/opt/module/zookeeper/bin/zkServer.sh start"
        done
};;
"stop"){
        for i in bigdata102 bigdata103 bigdata104
        do
        echo ---------- zookeeper $i 停止 ------------
                ssh $i "/opt/module/zookeeper/bin/zkServer.sh stop"
        done
};;
"status"){
        for i in bigdata102 bigdata103 bigdata104
        do
        echo ---------- zookeeper $i 状态 ------------
                ssh $i "/opt/module/zookeeper/bin/zkServer.sh status"
        done
};;
esac

HadoopHA

此配置文件很全,下次直接用

删除hadoop/share/目录下的doc

cd /opt/module/hadoop/share/
rm -rf doc

workers

bigdata102
bigdata103
bigdata104

core-site.xml

<!-- 指定NameNode的地址-->
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://mycluster</value>
    </property>

    <!-- 指定hadoop数据的存储目录-->
    <property>
       <name>hadoop.tmp.dir</name>
       <value>/opt/module/hadoop/data</value>
    </property>
                <!-- 配置HDFS网页登录使用的静态用户为atguigu -->
                <property>
                        <name>hadoop.http.staticuser.user</name>
                        <value>atguigu</value>
                </property>

                <!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
                <property>
                        <name>hadoop.proxyuser.atguigu.hosts</name>
                        <value>*</value>
                </property>
                <!-- 配置该atguigu(superUser)允许通过代理用户所属组 -->
                <property>
                        <name>hadoop.proxyuser.atguigu.groups</name>
                        <value>*</value>
                </property>

		<!-- 配置该atguigu(superUser)允许通过代理的用户-->
		<property>
			<name>hadoop.proxyuser.atguigu.users</name>
			<value>*</value>
		</property>
		<!-- 指定zkfc要连接的zkServer地址 -->
<property>
	<name>ha.zookeeper.quorum</name>
	<value>bigdata102:2181,bigdata103:2181</value>
</property>

mapred-site.xml

添加:

 <!-- 指定MapReduce程序运行在Yarn上-->
    <property>
       <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
   <value>bigdata102:10020</value>
</property>
<!-- 历史服务器web端地址-->
<property>
   <name>mapreduce.jobhistory.webapp.address</name>
    <value>bigdata102:19888</value>
</property>

hdfs-site.xml

注意:file://${bigdata.tmp.dir}为相对路径,如果出现bug,将其替换为绝对路径/opt/module/hadoop/data

(莫名奇妙的bug,别人用变量能直接启动集群,我就只能改为绝对路径才能启动)

配置两个NN

<!-- NameNode数据存储目录 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${bigdata.tmp.dir}/name</value>
  </property>

  <!-- DataNode数据存储目录 -->
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file://${bigdata.tmp.dir}/data</value>
  </property>

  <!-- JournalNode数据存储目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>${bigdata.tmp.dir}/jn</value>
  </property>

  <!-- 完全分布式集群名称 -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>

  <!-- 集群中NameNode节点都有哪些 -->
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>

  <!-- NameNode的RPC通信地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>bigdata102:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>bigdata103:8020</value>
  </property>

  <!-- NameNode的http通信地址 -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>bigdata102:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>bigdata103:9870</value>
  </property>

  <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata102:8485;bigdata103:8485/mycluster</value>
  </property>

  <!-- 访问代理类:client用于确定哪个NameNode为Active -->
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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>/home/atguigu/.ssh/id_rsa</value>
  </property>
  <!-- 启用nn故障自动转移 -->
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>

yarn-site.xml

将下面这一行代表的部分替换为第二个代码块即可

替换我

   <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
   </property>
   
   <!--替换我-->
   
    <!-- 环境变量的继承-->
   <property>
       <name>yarn.nodemanager.env-whitelist</name>
       <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
   </property>

<!-- 开启日志聚集功能 -->
<property>
   <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
   <name>yarn.log.server.url</name>
   <value>http://bigdata102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
   <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

配置ha添加以下内容:

 <!-- 启用resourcemanager ha -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!-- 声明两台resourcemanager的地址 -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <!--指定resourcemanager的逻辑列表-->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2,rm3</value>
    </property>
<!-- ========== rm1的配置 ========== -->
    <!-- 指定rm1的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>bigdata102</value>
    </property>

    <!-- 指定rm1的web端地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>bigdata102:8088</value>
    </property>

    <!-- 指定rm1的内部通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>bigdata102:8032</value>
    </property>

    <!-- 指定AM向rm1申请资源的地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>  
        <value>bigdata102:8030</value>
    </property>

    <!-- 指定供NM连接的地址 -->  
    <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>bigdata102:8031</value>
    </property>

<!-- ========== rm2的配置 ========== -->
    <!-- 指定rm2的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>bigdata103</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>bigdata103:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>bigdata103:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>bigdata103:8030</value>
    </property>

    <property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>bigdata103:8031</value>
    </property>

<!-- ========== rm3的配置 ========== -->
    <!-- 指定rm1的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm3</name>
        <value>bigdata104</value>
    </property>
    <!-- 指定rm1的web端地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm3</name>
        <value>bigdata104:8088</value>
    </property>
    <!-- 指定rm1的内部通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm3</name>
        <value>bigdata104:8032</value>
    </property>
    <!-- 指定AM向rm1申请资源的地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm3</name>  
        <value>bigdata104:8030</value>
    </property>

    <!-- 指定供NM连接的地址 -->  
    <property>
    <name>yarn.resourcemanager.resource-tracker.address.rm3</name>
        <value>bigdata104:8031</value>
    </property>

    <!-- 指定zookeeper集群的地址 --> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>bigdata102:2181,bigdata103:2181,bigdata104:2181</value>
    </property>

    <!-- 启用自动恢复 --> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!-- 指定resourcemanager的状态信息存储在zookeeper集群 --> 
    <property>
        <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

分发

启动

先启动zk集群

zk.sh start

再启动hadoop-ha

start-dfs.sh
start-yarn.sh

resourcemanager起不动的bug

原因是全文替换主机名hadoop–>bigdata的时候,把人家类路径里的hadoop也改了,导致找不到

搞定!!!

一切正常,小小bug,可笑可笑,芜湖~~~~

Q.E.D.