基于Hadoop3的HA集群搭建

集群规划

node01node02node03
NameNodeNameNodeNameNode
ZKFCZKFCZKFC
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZKZKZK
ResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

准备模板虚拟机

关闭防火墙,关闭防火墙开机自启

1systemctl stop firewalld 2systemctl disable firewalld

创建普通用户,并修改密码

1useradd lixuan 2passwd lixuan

配置lixuan用户具有root权限

1vim /etc/sudoers
1## Allow root to run any commands anywhere 2root ALL=(ALL) ALL 3lixuan ALL=(ALL) NOPASSWD:ALL

在/opt目录下创建文件加,并修改所属主和所属主

1mkdir /opt/module 2mkdir /opt/software
1chown lixuan:lixuan /opt/module 2chown lixuan:lixuan /opt/software

卸载虚拟机自带的openJDK

1rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

重启虚拟机

1reboot

克隆虚拟机node01

修改克隆机静态IP(三台都要改)

1vim /etc/sysconfig/network-scripts/ifcfg-ens33
1DEVICE=ens33 2TYPE=Ethernet 3ONBOOT=yes 4BOOTPROTO=static 5NAME="ens33" 6IPADDR=192.168.50.100 7PREFIX=24 8GATEWAY=192.168.50.2 9DNS1=192.168.50.2

查看虚拟网络编辑器

修改克隆主机名

1vim /etc/hostname

配置host文件

1vim /etc/hosts
1192.168.50.100 node01 2192.168.50.110 node02 3192.168.50.120 node03

重启

修改windows主机的hosts文件

安装JDK

1ls /opt/software/ 2 3hadoop-3.1.3.tar.gz jdk-8u212-linux-x64.tar.gz

解压JDK

1tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

配置JDK环境变量

1sudo vim /etc/profile.d/my_env.sh
1#JAVA_HOME 2export JAVA_HOME=/opt/module/jdk1.8.0_212 3export PATH=$PATH:$JAVA_HOME/bin
1source /etc/profile

安装hadoop

1tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

将Hadoop添加到环境变量

1sudo vim /etc/profile.d/my_env.sh
1#HADOOP_HOME 2export HADOOP_HOME=/opt/module/hadoop-3.1.3 3export PATH=$PATH:$HADOOP_HOME/bin 4export PATH=$PATH:$HADOOP_HOME/sbin
1source /etc/profile

SSH免密登录配置

1ssh-keygen -t rsa #然后敲3个回车
1# 另外两台机器也要执行同样的操作 2ssh-copy-id node01 3ssh-copy-id node02 4ssh-copy-id node03

安装Zookeeper

解压安装

1tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/
1xsync.sh zookeeper-3.5.7/

配置服务编号

1# 在/opt/module/zookeeper-3.5.7/这个目录下创建zkData 2mkdir -p zkData 3 4# 在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的文件 5touch myid 6 7# 编辑myid文件,添加对应的编号(1,2,3) 8 9xsync.sh zookeeper-3.5.7/

配置zoo.cfg文件

1# 重命名/opt/module/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg 2mv zoo_sample.cfg zoo.cfg 3vim zoo.cfg 4 5# 修改数据存储路径配置 6dataDir=/opt/module/zookeeper-3.5.7/zkData 7 8# 增加如下配置 9# 2888是Follower与Leader服务器交换信息的端口 10# 3888是Leader挂了后用来执行选举时服务器互相通信的端口 11 12#######################cluster########################## 13server.1=node01:2888:3888 14server.2=node02:2888:3888 15server.3=node03:2888:3888 16 17# 同步zoo.cfg配置文件 18xsync.sh zoo.cfg

Hadoop配置文件修改

core-site.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 4<configuration> 5<!-- 指定NameNode的地址 --> 6 <property> 7 <name>fs.defaultFS</name> 8 <value>hdfs://mycluster</value> 9 </property> 10<!-- 指定hadoop数据的存储目录 --> 11 <property> 12 <name>hadoop.tmp.dir</name> 13 <value>/opt/module/hadoop-3.1.3/data</value> 14 </property> 15 16<!-- 配置HDFS网页登录使用的静态用户为lixuan --> 17 <property> 18 <name>hadoop.http.staticuser.user</name> 19 <value>lixuan</value> 20 </property> 21 22<!-- 配置该lixuan(superUser)允许通过代理访问的主机节点 --> 23 <property> 24 <name>hadoop.proxyuser.lixuan.hosts</name> 25 <value>*</value> 26 </property> 27<!-- 配置该lixuan(superUser)允许通过代理用户所属组 --> 28 <property> 29 <name>hadoop.proxyuser.lixuan.groups</name> 30 <value>*</value> 31 </property> 32<!-- 配置该lixuan(superUser)允许通过代理的用户--> 33 <property> 34 <name>hadoop.proxyuser.lixuan.groups</name> 35 <value>*</value> 36 </property> 37<!-- 指定zkfc要连接的zkServer地址 --> 38 <property> 39 <name>ha.zookeeper.quorum</name> 40 <value>node01:2181,node02:2181,node03:2181</value> 41 </property> 42</configuration>

hdfs-site.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 4<configuration> 5<!-- nn web端访问地址--> 6 <property> 7 <name>dfs.namenode.http-address</name> 8 <value>node01:9870</value> 9 </property> 10<!-- 2nn web端访问地址--> 11 <property> 12 <name>dfs.namenode.secondary.http-address</name> 13 <value>node03:9868</value> 14 </property> 15<!-- NameNode数据存储目录 --> 16 <property> 17 <name>dfs.namenode.name.dir</name> 18 <value>file://${hadoop.tmp.dir}/name</value> 19 </property> 20<!-- DataNode数据存储目录 --> 21 <property> 22 <name>dfs.datanode.data.dir</name> 23 <value>file://${hadoop.tmp.dir}/data</value> 24 </property> 25<!-- JournalNode数据存储目录 --> 26 <property> 27 <name>dfs.journalnode.edits.dir</name> 28 <value>${hadoop.tmp.dir}/jn</value> 29 </property> 30<!-- 完全分布式集群名称 --> 31 <property> 32 <name>dfs.nameservices</name> 33 <value>mycluster</value> 34 </property> 35<!-- 集群中NameNode节点都有哪些 --> 36 <property> 37 <name>dfs.ha.namenodes.mycluster</name> 38 <value>nn1,nn2,nn3</value> 39 </property> 40<!-- NameNode的RPC通信地址 --> 41 <property> 42 <name>dfs.namenode.rpc-address.mycluster.nn1</name> 43 <value>node01:8020</value> 44 </property> 45 <property> 46 <name>dfs.namenode.rpc-address.mycluster.nn2</name> 47 <value>node02:8020</value> 48 </property> 49 <property> 50 <name>dfs.namenode.rpc-address.mycluster.nn3</name> 51 <value>node03:8020</value> 52 </property> 53<!-- NameNode的http通信地址 --> 54 <property> 55 <name>dfs.namenode.http-address.mycluster.nn1</name> 56 <value>node01:9870</value> 57 </property> 58 <property> 59 <name>dfs.namenode.http-address.mycluster.nn2</name> 60 <value>node02:9870</value> 61 </property> 62 <property> 63 <name>dfs.namenode.http-address.mycluster.nn3</name> 64 <value>node03:9870</value> 65 </property> 66<!-- 指定NameNode元数据在JournalNode上的存放位置 --> 67 <property> 68<name>dfs.namenode.shared.edits.dir</name> 69<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value> 70 </property> 71<!-- 访问代理类:client用于确定哪个NameNode为Active --> 72 <property> 73 <name>dfs.client.failover.proxy.provider.mycluster</name> 74 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 75 </property> 76<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> 77 <property> 78 <name>dfs.ha.fencing.methods</name> 79 <value>sshfence</value> 80 </property> 81<!-- 使用隔离机制时需要ssh秘钥登录--> 82 <property> 83 <name>dfs.ha.fencing.ssh.private-key-files</name> 84 <value>/home/lixuan/.ssh/id_rsa</value> 85 </property> 86 <!-- 启用nn故障自动转移 --> 87 <property> 88 <name>dfs.ha.automatic-failover.enabled</name> 89 <value>true</value> 90 </property> 91</configuration>

yarn-site.xml

1<configuration> 2 3 <property> 4 <name>yarn.nodemanager.aux-services</name> 5 <value>mapreduce_shuffle</value> 6 </property> 7 8 <!-- 启用resourcemanager ha --> 9 <property> 10 <name>yarn.resourcemanager.ha.enabled</name> 11 <value>true</value> 12 </property> 13 14 <!-- 声明两台resourcemanager的地址 --> 15 <property> 16 <name>yarn.resourcemanager.cluster-id</name> 17 <value>cluster-yarn1</value> 18 </property> 19 <!--指定resourcemanager的逻辑列表--> 20 <property> 21 <name>yarn.resourcemanager.ha.rm-ids</name> 22 <value>rm1,rm2</value> 23</property> 24<!-- ========== rm1的配置 ========== --> 25<!-- 指定rm1的主机名 --> 26 <property> 27 <name>yarn.resourcemanager.hostname.rm1</name> 28 <value>node01</value> 29</property> 30<!-- 指定rm1的web端地址 --> 31<property> 32 <name>yarn.resourcemanager.webapp.address.rm1</name> 33 <value>node01:8088</value> 34</property> 35<!-- 指定rm1的内部通信地址 --> 36<property> 37 <name>yarn.resourcemanager.address.rm1</name> 38 <value>node01:8032</value> 39</property> 40<!-- 指定AM向rm1申请资源的地址 --> 41<property> 42 <name>yarn.resourcemanager.scheduler.address.rm1</name> 43 <value>node01:8030</value> 44</property> 45<!-- 指定供NM连接的地址 --> 46<property> 47 <name>yarn.resourcemanager.resource-tracker.address.rm1</name> 48 <value>node01:8031</value> 49</property> 50<!-- ========== rm2的配置 ========== --> 51 <!-- 指定rm2的主机名 --> 52 <property> 53 <name>yarn.resourcemanager.hostname.rm2</name> 54 <value>node02</value> 55</property> 56<property> 57 <name>yarn.resourcemanager.webapp.address.rm2</name> 58 <value>node02:8088</value> 59</property> 60<property> 61 <name>yarn.resourcemanager.address.rm2</name> 62 <value>node02:8032</value> 63</property> 64<property> 65 <name>yarn.resourcemanager.scheduler.address.rm2</name> 66 <value>node02:8030</value> 67</property> 68<property> 69 <name>yarn.resourcemanager.resource-tracker.address.rm2</name> 70 <value>node02:8031</value> 71</property> 72 73 <!-- 指定zookeeper集群的地址 --> 74 <property> 75 <name>yarn.resourcemanager.zk-address</name> 76 <value>node01:2181,node02:2181,node03:2181</value> 77 </property> 78 79 <!-- 启用自动恢复 --> 80 <property> 81 <name>yarn.resourcemanager.recovery.enabled</name> 82 <value>true</value> 83 </property> 84 85 <!-- 指定resourcemanager的状态信息存储在zookeeper集群 --> 86 <property> 87 <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> 88</property> 89<!-- 环境变量的继承 --> 90 <property> 91 <name>yarn.nodemanager.env-whitelist</name> 92 <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> 93 </property> 94 95</configuration>
1<!-- 开启日志聚集功能 --> 2<property> 3 <name>yarn.log-aggregation-enable</name> 4 <value>true</value> 5</property> 6<!-- 设置日志聚集服务器地址 --> 7<property> 8 <name>yarn.log.server.url</name> 9 <value>http://node01:19888/jobhistory/logs</value> 10</property> 11<!-- 设置日志保留时间为7天 --> 12<property> 13 <name>yarn.log-aggregation.retain-seconds</name> 14 <value>604800</value> 15</property>

mapred-site.xml

1<?xml version="1.0" encoding="UTF-8"?> 2<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 3 4<configuration> 5 <!-- 指定MapReduce程序运行在Yarn上 --> 6 <property> 7 <name>mapreduce.framework.name</name> 8 <value>yarn</value> 9 </property> 10</configuration>
1<!-- 历史服务器端地址 --> 2<property> 3 <name>mapreduce.jobhistory.address</name> 4 <value>node01:10020</value> 5</property> 6 7<!-- 历史服务器web端地址 --> 8<property> 9 <name>mapreduce.jobhistory.webapp.address</name> 10 <value>node01:19888</value> 11</property>

workers

1vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
1#添加如下内容, 结尾不能有空格,文件中不允许有空行 2 3node01 4node02 5node03
1#同步所有节点配置文件 2xsync.sh /opt/module/hadoop-3.1.3/etc

启动集群

第一次启动

  • 各个节点启动journalnode服务和zkServer服务

    1hdfs --daemon start journalnode 2zkServer.sh start
  • 删除每个节点的data和logs文件

  • nn1格式化hdfs,并启动

    1hdfs namenode -format 2hdfs --daemon start namenode
  • nn2,nn3上同步nn1的元数据信息

    1hdfs namenode -bootstrapStandby
  • 关闭所有HDFS服务

  • 启动Zookeeper集群

    1zkServer.sh start
  • 初始化HA在Zookeeper中的状态

    1hdfs zkfc -formatZK
  • 启动HDFS服务

查看Web端

1# 查看NameNode 2node01:9870 3# 查看ResourceManager 4node02:8088 5# 查看JobHistory 6node01:19888

常用脚本

集群分发脚本xsync.sh

1cd /home/lixuan 2mkdir bin 3cd bin 4vim xsync.sh
1#!/bin/bash 2#1. 判断参数个数 3if [ $# -lt 1 ] 4then 5 echo Input Path You Need Give Others 6 exit; 7fi 8#2. 遍历集群所有机器 9for host in node01 node02 node03 10do 11 echo ==================== $host ==================== 12 #3. 遍历所有目录,挨个发送 13 for file in $@ 14 do 15 #4. 判断文件是否存在 16 if [ -e $file ] 17 then 18 #5. 获取父目录 19 pdir=$(cd -P $(dirname $file); pwd) 20 #6. 获取当前文件的名称 21 fname=$(basename $file) 22 ssh $host "mkdir -p $pdir" 23 rsync -av $pdir/$fname $host:$pdir 24 else 25 echo $file does not exists! 26 fi 27 done 28done
1chmod +x xsync.sh

jpsall.sh

1#!/bin/bash 2for host in node01 node02 node03 3do 4 echo =============== $host =============== 5 ssh $host jps $@ | grep -v Jps 6done

HA一键启动脚本

1#!/bin/bash 2if [ $# -lt 1 ] 3then 4 echo "please input start | stop" 5 exit ; 6fi 7 8case $1 in 9"start") 10 echo " =================== 启动 HA-hadoop集群 ===================" 11 12 echo " ======== 启动 ZK ========" 13 14 for i in node01 node02 node03 15 do 16 ssh $i "cd /opt/module/zookeeper-3.5.7/; 17 bin/zkServer.sh start;" 18 # hdfs --daemon start journalnode 19 done 20 21 echo " ======== 启动 Hadoop ========" 22 23 ssh node01 "cd /opt/module/hadoop-3.1.3/; 24 sbin/start-dfs.sh; 25 sbin/start-yarn.sh; 26 bin/mapred --daemon start historyserver" 27;; 28"stop") 29 echo " =================== 关闭 HA-hadoop集群 ===================" 30 31 echo " ======== 停止 ZK ========" 32 for i in node01 node02 node03 33 do 34 ssh $i "cd /opt/module/zookeeper-3.5.7/; 35 bin/zkServer.sh stop;" 36 #hdfs --daemon stop journalnode 37 done 38 39 echo " ======== 停止 Hadoop ========" 40 41 ssh node01 "cd /opt/module/hadoop-3.1.3/; 42 sbin/stop-dfs.sh; 43 sbin/stop-yarn.sh; 44 bin/mapred --daemon stop historyserver" 45;; 46*) 47 echo "Input Error..." 48;; 49esac

常见问题

解决XShell连接虚拟机慢的问题

方式1

1vim /etc/ssh/sshd_config 2 3#将UseDNS=yes的注释符去掉并改为no 4 5systemctl restart sshd

方式2

1Xshell -> 属性 -> SSH -> 隧道 -> 将转发x11这个选项关闭

解决8485端口拒绝连接问题

core-site..xml

1<property> 2 <name>ipc.client.connect.max.retries</name> 3 <value>100</value> 4 </property> 5 <property> 6 <name>ipc.client.connect.retry.interval</name> 7 <value>10000</value> 8 </property>
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Hadoop调优

HDFS核心参数NameNode,DataNode内存配置查看NameNode,DataNode占用内存shelljpsjmapheap2611jmapheap2744经验shellNameNode最小值1G,每增加100w个block,增加1G内存DataNode最小值4G,副本总数超过400w时,每增加1

JAVA API 连接 HA(High Available) Hadoop集群

使用JAVAAPI连接HDFS时我们需要使用NameNode的地址,开启HA后,两个NameNode可能会主备切换,如果连接的那台主机NameNode挂掉了,连接就会失败.HDFS提供了nameservices的方式进行访问,这样只要有一个NameNode活着,都可以正常访问.HDFSNameNodeHA

Hadoop2.7.3完全分布式集群安装过程

需要安装的软件Hadoop包含HDFS集群和YARN集群。部署Hadoop就是部署HDFS和YARN集群。机器数量、角色4台。NameNode1台、DataNode3台主机名IP角色amaster192.168.37.143NameNode:9000ResourceManag

ubuntu18.04.2 hadoop3.1.2+zookeeper3.5.5高可用完全分布式集群搭建

ubuntu18.04.2hadoop3.1.2zookeeper3.5.5高可用完全分布式集群搭建集群规划:hostnameNameNodeDataNodeJournalNodeResourceManagerZookeepernode01√√√node02√√node03√√

Hadoop 2.7.4 HDFS+YRAN HA删除datanode和nodemanager

当前集群主机名称IP地址角色统一安装目录统一安装用户shtsgmhadoopnn01172.16.101.55namenode,resourcemanager/usr/local/hadoop(软连接)/usr/local/hadoop2.7.4/usr/lo

基于Hadoop3的HA集群搭建 - HelloWorld