基于Hadoop3的HA集群搭建

集群规划

node01node02node03
NameNodeNameNodeNameNode
ZKFCZKFCZKFC
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZKZKZK
ResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

准备模板虚拟机

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

systemctl stop firewalld systemctl disable firewalld

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

useradd lixuan passwd lixuan

配置lixuan用户具有root权限

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

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

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

卸载虚拟机自带的openJDK

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

重启虚拟机

reboot

克隆虚拟机node01

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

vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static NAME="ens33" IPADDR=192.168.50.100 PREFIX=24 GATEWAY=192.168.50.2 DNS1=192.168.50.2

查看虚拟网络编辑器

修改克隆主机名

vim /etc/hostname

配置host文件

vim /etc/hosts
192.168.50.100 node01 192.168.50.110 node02 192.168.50.120 node03

重启

修改windows主机的hosts文件

安装JDK

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

解压JDK

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

配置JDK环境变量

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

安装hadoop

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

将Hadoop添加到环境变量

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

SSH免密登录配置

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

安装Zookeeper

解压安装

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

配置服务编号

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

配置zoo.cfg文件

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

Hadoop配置文件修改

core-site.xml

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 指定NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop数据的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> <!-- 配置HDFS网页登录使用的静态用户为lixuan --> <property> <name>hadoop.http.staticuser.user</name> <value>lixuan</value> </property> <!-- 配置该lixuan(superUser)允许通过代理访问的主机节点 --> <property> <name>hadoop.proxyuser.lixuan.hosts</name> <value>*</value> </property> <!-- 配置该lixuan(superUser)允许通过代理用户所属组 --> <property> <name>hadoop.proxyuser.lixuan.groups</name> <value>*</value> </property> <!-- 配置该lixuan(superUser)允许通过代理的用户--> <property> <name>hadoop.proxyuser.lixuan.groups</name> <value>*</value> </property> <!-- 指定zkfc要连接的zkServer地址 --> <property> <name>ha.zookeeper.quorum</name> <value>node01:2181,node02:2181,node03:2181</value> </property> </configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- nn web端访问地址--> <property> <name>dfs.namenode.http-address</name> <value>node01:9870</value> </property> <!-- 2nn web端访问地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>node03:9868</value> </property> <!-- NameNode数据存储目录 --> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/name</value> </property> <!-- DataNode数据存储目录 --> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/data</value> </property> <!-- JournalNode数据存储目录 --> <property> <name>dfs.journalnode.edits.dir</name> <value>${hadoop.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,nn3</value> </property> <!-- NameNode的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node02:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn3</name> <value>node03:8020</value> </property> <!-- NameNode的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node01:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node02:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn3</name> <value>node03:9870</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node01:8485;node02:8485;node03: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/lixuan/.ssh/id_rsa</value> </property> <!-- 启用nn故障自动转移 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>

yarn-site.xml

<configuration> <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> <!-- 声明两台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</value> </property> <!-- ========== rm1的配置 ========== --> <!-- 指定rm1的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node01</value> </property> <!-- 指定rm1的web端地址 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>node01:8088</value> </property> <!-- 指定rm1的内部通信地址 --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>node01:8032</value> </property> <!-- 指定AM向rm1申请资源的地址 --> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>node01:8030</value> </property> <!-- 指定供NM连接的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>node01:8031</value> </property> <!-- ========== rm2的配置 ========== --> <!-- 指定rm2的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node02</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>node02:8088</value> </property> <property> <name>yarn.resourcemanager.address.rm2</name> <value>node02:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>node02:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>node02:8031</value> </property> <!-- 指定zookeeper集群的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>node01:2181,node02:2181,node03: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> <!-- 环境变量的继承 --> <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> </configuration>
<!-- 开启日志聚集功能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置日志聚集服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node01:19888/jobhistory/logs</value> </property> <!-- 设置日志保留时间为7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>

mapred-site.xml

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

workers

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

启动集群

第一次启动

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

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

  • nn1格式化hdfs,并启动

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

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

  • 启动Zookeeper集群

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

    hdfs zkfc -formatZK
  • 启动HDFS服务

查看Web端

# 查看NameNode node01:9870 # 查看ResourceManager node02:8088 # 查看JobHistory node01:19888

常用脚本

集群分发脚本xsync.sh

cd /home/lixuan mkdir bin cd bin vim xsync.sh
#!/bin/bash #1. 判断参数个数 if [ $# -lt 1 ] then echo Input Path You Need Give Others exit; fi #2. 遍历集群所有机器 for host in node01 node02 node03 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
chmod +x xsync.sh

jpsall.sh

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

HA一键启动脚本

#!/bin/bash if [ $# -lt 1 ] then echo "please input start | stop" exit ; fi case $1 in "start") echo " =================== 启动 HA-hadoop集群 ===================" echo " ======== 启动 ZK ========" for i in node01 node02 node03 do ssh $i "cd /opt/module/zookeeper-3.5.7/; bin/zkServer.sh start;" # hdfs --daemon start journalnode done echo " ======== 启动 Hadoop ========" ssh node01 "cd /opt/module/hadoop-3.1.3/; sbin/start-dfs.sh; sbin/start-yarn.sh; bin/mapred --daemon start historyserver" ;; "stop") echo " =================== 关闭 HA-hadoop集群 ===================" echo " ======== 停止 ZK ========" for i in node01 node02 node03 do ssh $i "cd /opt/module/zookeeper-3.5.7/; bin/zkServer.sh stop;" #hdfs --daemon stop journalnode done echo " ======== 停止 Hadoop ========" ssh node01 "cd /opt/module/hadoop-3.1.3/; sbin/stop-dfs.sh; sbin/stop-yarn.sh; bin/mapred --daemon stop historyserver" ;; *) echo "Input Error..." ;; esac

常见问题

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

方式1

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

方式2

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

解决8485端口拒绝连接问题

core-site..xml

<property> <name>ipc.client.connect.max.retries</name> <value>100</value> </property> <property> <name>ipc.client.connect.retry.interval</name> <value>10000</value> </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