Hadoop3高可用集群搭建_hadoop如何实现高可用

集群规划

  1. 本次安装拟使用的各软件版本如下
  • CentOS 7.6
  • Zookeeper 3.6.3
  • Hadoop 3.2.2
  • Hive 3.1.2
  • Spark 3.0.2
  • Sqoop 1.4.7
  • MySQL 8.0.21
  1. 机器规划



一、安装CentOS 7.6

若使用虚拟机,建议选择2CPU2线程,4G或以上内存,至少50G硬盘。

安装过程注意事项主要包括:

  1. 日期和时间:选择上海
  2. 语言支持:简体中文和英语
  3. 软件选择:最小安装,选择其中的调试工具、兼容性程序库、开发工具、安全性工具、和系统管理工具
  4. 设置root密码:root123

安装完成后,重启即可登录系统

二、配置Linux

使用root用户登录机器,进行相关配置

2.1 配置IP地址

修改文件/etc/sysconfig/network-scripts/ifcfg-ens33,变更相关配置,应保证hadoop集群机器IP地址不变

ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.100.124
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
DNS1=114.114.114.114
DNS2=218.2.135.1

2.2 基础配置

  1. 配置主机名。根据机器不同,设置不同的主机名,从hadoop101开始。命令:hostnamectl set-hostname hadoop101
  2. 关闭防火墙。依次执行下列命令,最后查看防火墙状态
systemctl stop firewalld.service            #停止firewall
systemctl disable firewalld.service         #禁止firewall开机启动
systemctl status firewalld.service   #查看firewall状态
  1. 关闭selinux。修改文件/etc/sysconfig/selinux,将SELINUX=enforcing改为SELINUX=disabled。然后重启后用sestatus命令查看状态
# sestatus
SELinux status:                 disabled
  1. 安装net-tools。可在线或离线安装
# 在线安装命令
sudo yum -y install net-tools

# 离线安装
# 下载net-tools包,centos7版本: 
http://mirrors.163.com/centos/7/os/x86_64/Packages/net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
# 离线安装命令
sudo rpm -Uvh net-tools-2.0-0.25.20131004git.el7.x86_64.rpm

# 验证安装是否成功
netstat -nltp

2.3 配置hadoop用户

本次安装计划在hadoop用户下,安装和使用hadoop集群 。命令如下:

# 首先创建用户
useradd hadoop
# 配置密码
passwd hadoop  # 将hadoop的密码设置为:hadoop123
# 配置sudo权限
vi /etc/sudoers
# 在101行左右,添加一行:
hadoop  ALL=(ALL)       NOPASSWD:ALL

2.4 配置基本目录

为hadoop集群安排3个目录存放相关内容

  • 程序目录:/app
  • 数据目录:/data
  • 日志目录:/applogs
mkdir /app /applogs /data
chown -R hadoop: /app /data /applogs

从本步骤之后,不做特别说明,均使用hadoop用户进行相关操作

2.5 安装jdk

  1. 下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  2. 上传到Centos后解压并安装
# 解压上传的文件
tar zxvf jdk-8u281-linux-x64.tar.gz -C /app/
# 配置环境变量
sudo vi /etc/profile.d/env.sh
sudo chmod 777 /etc/profile.d/env.sh
# 在文件中添加下列配置
export JAVA_HOME=/app/jdk1.8.0_281
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
# 完成后,启用环境变量
source /etc/profile
  1. 验证是否安装完成

2.6 配置管理脚本

创建脚本存放目录:mkdir -p /home/hadoop/bin

2.6.1 配置分发脚本

创建脚本/home/hadoop/xsync,文件写入下列内容,并赋予执行权限chmod +x xsync

#!/bin/bash

#1. 判断参数个数
[ $# -lt 1 ] && {
    echo Not Enough Arguement!
    exit
}

# 遍历所有目标,同步所有文件
for file in $@
    do 
    echo ====================== sync $file =====================
 [ -e $file ] && {
        for host in hadoop101 hadoop102 hadoop103 
            do
  echo ----------------- $host --------------------
         #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)
        
         #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            done
 } || {
     echo $file does not exists, please check again!
 }
done

2.6.2 配置进程查看脚本

创建文件 /home/hadoop/bin/jpsall,输入下列内容,并授予执行权限

#!/bin/bash

for host in hadoop101 hadoop102 hadoop103
do
    echo =============== $host ===============
    ssh $host jps
done

2.7 克隆虚拟机

将本基础机器关闭,再克隆生成三台新的虚拟机,注意克隆时选择创建完整克隆

2.8 依次配置3台机器

  • 配置ip地址
  • 配置主机名,主机名配置为hadoop101、hadoop102、hadoop103 hostnamectl set-hostname hadoop101
  • 修改所有机器的 /etc/hosts,添加以下内容: 192.168.100.124 hadoop101 192.168.100.129 hadoop102 192.168.100.130 hadoop103
  • 为3台机器做ssh免密访问。要求效果root之间免密访问,hadoop用户之间免密访问。 ssh-keygen -t rsa
    # 将所有服务器的 id_rsa.pub 内容汇总到 authorized_keys
    # !!! 伪分布式,也必须要先生成 authorized_keys 文件!!!

    #
    复制到其他服务器
    # scp authorized_keys @hadoop002:$PWD
    # ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件中
    ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop101
    # 修改hadoop用户的.ssh下的权限(root不用修改)
    sudo chmod 700 /home/hadoop/.ssh
    sudo chmod 600 /home/hadoop/.ssh/*

2.9 配置时间同步

首先从服务器先同步时间,再执行以下操作

sudo ntpdate ntp1.aliyun.com或者使用命令sudo ntpdate 192.168.100.124

  1. 编辑 hadoop101 时间服务器配置文件 sudo vi /etc/ntp.conf #这一行的含义是授权172.16.128.0网段上的所有机器可以从这台机器上查询和同步时间. restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap # 修改server段内容 server 210.72.145.44 server ntp1.aliyun.com server ntp2.aliyun.com server ntp3.aliyun.com server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst server 127.127.1.0 fudge 127.127.1.0 stratum 10
  2. 编辑其他机器的时间服务配置文件sudo vi /etc/ntp.conf server 192.168.100.124 fudge 192.168.100.124 stratum 10
  3. 启动ntpd服务并设置开机启动 sudo service ntpd start sudo systemctl enable ntpd sudo systemctl enable ntpdate sudo systemctl is-enabled ntpd

参考文档:

https://blog.csdn.net/vic_qxz/article/details/80343351 https://www.linuxprobe.com/centos7-ntp-time.html

三、安装Zookeeper

1. 安装步骤

  1. 下载zookeeper3.6.3版本,解压文件到/app路径下 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz tar zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /app/
  2. 建立相关的目录,存放数据和日志 mkdir -p /data/zookeeper/zdata/data
    mkdir -p /data/zookeeper/zdata/logs
  3. 为各服务器在data目录下,生成myid文件,不同服务器myid内值不能相同。从1开始,依次增加 echo 1 > /data/zookeeper/zdata/data/myid
  4. 修改zookeeper的配置文件,复制zoo_sample.cfg为zoo.cfg cd /app
    ln -s apache-zookeeper-3.6.3-bin zookeeper
    cd zookeeper/conf
    cp zoo_sample.cfg zoo.cfg
    # 修改zoo.cfg,以下为配置信息
    dataDir=/data/zookeeper/zdata/data
    dataLogsDir=/data/zookeeper/zdata/logs
    # 副本数
    autopurge.snapRetainCount=3
    server.1=hadoop101:2888:3888
    server.2=hadoop102:2888:3888
    server.3=hadoop103:2888:3888
    4lw.commands.whitelist=*
  5. 分发zookeeper到各服务器,注意修改各服务器的myid cd /app
    xsync apache-zookeeper-3.6.3-bin zookeeper
    cd /data
    xsync zookeeper

    #
    在hadoop102执行
    echo 2 > /data/zookeeper/zdata/data/myid
    # 在hadoop103执行
    echo 3 > /data/zookeeper/zdata/data/myid
  6. 配置环境变量 # 在/etc/profile.d/env.sh中添加
    export ZOOKEEPER_HOME=/app/apache-zookeeper-3.6.3

    #
    同步到各机器
    sudo /home/hadoop/bin/xsync /etc/profile.d/env.sh
    # 在所有服务器应用新的环境变量
  7. 编写集群管理脚本 myzookeeper.sh,脚本放置在home目录下面的bin目录中(/home/hadoop/bin) #!/bin/bash
    if [ $# -lt 1 ]
    then
    echo "No Args Input..."
    exit ;
    fi
    case $1 in
    "start")
    echo " =================== 启动 zookeeper 集群 ======================"
    for host in hadoop101 hadoop102 hadoop103
    do
    echo "----------------- 启动 $host -------------------"
    ssh $host "/app/apache-zookeeper-3.6.3/bin/zkServer.sh start"
    done
    ;;
    "stop")
    echo " =================== 关闭 zookeeper 集群 ======================"
    for host in hadoop101 hadoop102 hadoop103
    do
    echo "----------------- 关闭 $host -------------------"
    ssh $host "/app/apache-zookeeper-3.6.3/bin/zkServer.sh stop"
    done
    ;;
    "status")
    echo " =================== 检查 zookeeper 集群 ======================"
    for host in hadoop101 hadoop102 hadoop103
    do
    echo "----------------- 检查 $host -------------------"
    ssh $host "/app/apache-zookeeper-3.6.3/bin/zkServer.sh status"
    done
    esac

2. 启动验证

myzookeeper.sh start

四、安装Hadoop

1. 安装说明

  1. 本次使用Hadoop3.2.2版本,重点参考文档 https://blog.csdn.net/u012760435/article/details/104401268
  2. 本次安装程序是基于zookeeper搭建HA环境,请先安装zookeeper

2. 文件配置

  1. 下载解压hadoop:https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
tar zxvf hadoop-3.2.2.tar.gz -C /app
cd /app
ln -s hadoop-3.2.2 hadoop

2.2 配置core-site.xml



 fs.defaultFS
 hdfs://mycluster




 hadoop.tmp.dir
 /data/hadoop/tmp




 hadoop.http.staticuser.user
 hadoop




 ha.zookeeper.quorum
 hadoop101:2181,hadoop102:2181,hadoop103:2181




 hadoop.proxyuser.hadoop.hosts
 *


 hadoop.proxyuser.hadoop.groups
 *






 ipc.client.connect.max.retries
 100
 Indicates the number of retries a client will make to establish a server connection.



 ipc.client.connect.retry.interval
 10000
 Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.

2.3 配置hadoop-env.sh

export JAVA_HOME=/app/jdk1.8.0_281
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_ZKFC_USER="hadoop"
export HDFS_JOURNALNODE_USER="hadoop"

2.4 配置hdfs-site.xml



 dfs.replication
 2




 dfs.nameservices
 mycluster



 dfs.ha.namenodes.mycluster
 nn1,nn2





 dfs.namenode.rpc-address.mycluster.nn1
 hadoop101:8020


 dfs.namenode.rpc-address.mycluster.nn2
 hadoop102:8020




 dfs.namenode.http-address.mycluster.nn1
 hadoop101:9870


 dfs.namenode.http-address.mycluster.nn2
 hadoop102:9870







 dfs.namenode.shared.edits.dir
 qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485/mycluster




 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/hadoop/.ssh/id_rsa




 dfs.journalnode.edits.dir
 /data/hadoop/journalnode




 dfs.ha.automatic-failover.enabled
 true



 dfs.webhdfs.enabled
 true




 dfs.datanode.max.transfer.threads
 8192
  
     Specifies the maximum number of threads to use for transferring data
     in and out of the DN. 
 

2.5 配置workers

填入所有datanode的主机名称,不能留有空格

hadoop101
hadoop102
hadoop103

2.6 配置环境变量

export HADOOP_HOME=/app/hadoop-3.2.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

# 同步到各机器
sudo /home/hadoop/bin/xsync /etc/profile.d/env.sh
# 在所有服务器应用新的环境变量

2.7 修改进程最大文件打开数

sudo vi /etc/security/limits.conf

# 参考 https://blog.csdn.net/knowledgeaaa/article/details/21240247
# 添加以下内容
*               -      nofile          1000000
*               -      nproc           1000000

3. 首次启动集群

  1. 将同步hadoop目录及配置文件到所有机器
cd /app
xsync hadoop-3.2.2
  1. 启动journalnode,在所有journalnode节点上启动journalnode(本例中是所有机器)
hdfs --daemon start journalnode
  1. 初始化namenode,在任意namenode节点上执行格式化命令,出现successfully formated即为执行成功(本次在hadoop101执行)
hdfs namenode -format
# 安装时出现过一次错误:Unable to check if JNs are ready for formatting.
# 类似 https://blog.csdn.net/Maricle_Again/article/details/96481845
# 解决办法是删除所有机器 /data/hadoop/journalnode/mycluster 目录下的文件
# cd /data/hadoop/journalnode/mycluster
# rm -rf in_use.lock current edits.sync
# 也有可能是网络的问题,参考该文章:https://blog.csdn.net/tototuzuoquan/article/details/89644127
# 在dev环境中出现连不上journalnode问题,添加该配置,以增加重试次数和间隔

   ipc.client.connect.max.retries
   100
   Indicates the number of retries a client will make to establish a server connection.



   ipc.client.connect.retry.interval
   10000
   Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.

  1. 随后启动格式化后的namenode(在hadoop101执行)
hdfs --daemon start namenode
  1. 在其他namenode节点同步信息(在hadoop102执行) 伪分布式部署时,不用执行本步骤
hdfs namenode -bootstrapStandby
  1. 格式化zookeeper节点,出现以下信息即为执行成功(在hadoop101执行) 伪分布式不用执行本步骤
hdfs zkfc -formatZKssh 
  1. 启动hdfs集群(在hadoop101执行)
start-dfs.sh
# 随后查看各机器进程
jpsall

4. 日常启停HDFS集群

  1. 启动hdfs
start-dfs.sh
# 若报错:publickey,gssapi-keyex,gssapi-with-mic,password
# 是因为ssh配置问题,需要生成~/.ssh/authorized_keys文件
  1. 关闭hdfs
stop-dfs.sh

5. 页面查看集群

6. 配置YARN及其HA

使用yarn来管理hdfs集群的资源分配,yarn的功能概述参见:https://blog.csdn.net/scgaliguodong123_/article/details/46603827

6.1. 文件配置

参考文档:https://blog.csdn.net/u012760435/article/details/104541021

6.1.1 配置hadoop-env.sh

因为hadoop3限制必须要声明角色运行进程,vi /app/hadoop-3.2.2/etc/hadoop/hadoop-env.sh

export YARN_NODEMANAGER_USER="hadoop"
export YARN_RESOURCEMANAGER_USER="hadoop"

6.1.2 配置mapred-site.xml

vi /app/hadoop-3.2.2/etc/hadoop/mapred-site.xml


    mapreduce.framework.name
    yarn



    mapreduce.application.classpath
    $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*




    mapreduce.jobhistory.address
    hadoop102:10020




    mapreduce.jobhistory.webapp.address
    hadoop102:19888




    mapreduce.map.memory.mb
    1024


    mapreduce.map.java.opts
    -Xmx1024M


    mapreduce.reduce.memory.mb
    1024


    mapreduce.reduce.java.opts
    -Xmx1024M

6.1.3 配置yarn-site.xml



    yarn.nodemanager.aux-services
    mapreduce_shuffle



    yarn.nodemanager.env-whitelist
    JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME




    yarn.resourcemanager.cluster-id
    yarncluster





    yarn.resourcemanager.ha.enabled
    true



    yarn.resourcemanager.ha.rm-ids
    rm1,rm2



    yarn.resourcemanager.hostname.rm1
    hadoop101



    yarn.resourcemanager.hostname.rm2
    hadoop103




    yarn.resourcemanager.webapp.address.rm1
    hadoop101:8088



    yarn.resourcemanager.webapp.address.rm2
    hadoop103:8088



    hadoop.zk.address
    hadoop101:2181,hadoop102:2181,hadoop103:2181




    yarn.resourcemanager.recovery.enabled
    true




    yarn.resourcemanager.store.class
    org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore




    yarn.nodemanager.resource.detect-hardware-capabilities
    false




    yarn.log-aggregation-enable
    true


  
    yarn.log.server.url
    http://hadoop102:19888/jobhistory/logs



    yarn.log-aggregation.retain-seconds
    604800





    yarn.nodemanager.resource.memory-mb
    4096


    yarn.nodemanager.resource.cpu-vcores
    4


    yarn.nodemanager.vmem-check-enabled
    true
    Whether virtual memory limits will be enforced for containers


    yarn.nodemanager.vemem-pmem-ration
    2.1
    Ration between virtual memory to physical memory when setting memoery limits for containers


    yarn.nodemanager.pmem-check-enabled
    true


    yarn.scheduler.minimum-allocation-mb
    1024


    yarn.scheduler.maximum-allocation-mb
    4096




6.2. 启动yarn

# 先同步配置文件到各服务器
xsync /app/hadoop-3.2.2/etc/hadoop
# 启动yarn
start-yarn.sh

6.3. web页面查看

7. 历史服务器配置

? 为了查看程序的历史运行情况,需要配置一下历史服务器,步骤如下:

7.1. 配置mapred-site.xml

vi /app/hadoop-3.2.2/etc/hadoop/mapred-site.xml , 添加下列配置



    mapreduce.jobhistory.address
    hadoop102:10020




    mapreduce.jobhistory.webapp.address
    hadoop102:19888

7.2. 启动历史服务器

mapred --daemon start historyserver
# 关闭
mapred --daemon stop historyserver

8. 日志聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

配置yarn-site.xml

vi /app/hadoop-3.2.2/etc/hadoop/yarn-site.xml



    yarn.log-aggregation-enable
    true



    yarn.log.server.url
    http://hadoop102:19888/jobhistory/logs



    yarn.log-aggregation.retain-seconds
    604800

同步配置到各服务器

# 先同步配置文件到各服务器
xsync /app/hadoop-3.2.2/etc/hadoop

9. 常用命令

# 查看集群可用空间等
hdfs dfsadmin -report

# 查看空间使用情况
hadoop fs -du -h /

# 查看namenode是否处于只读模式下
hdfs dfsadmin -safemode get

关注本头条号回复:hadoop ,获取完整文档


未完待续!