Hadoop的HA模式搭建

准备三台虚拟机 bigdata007bigdata008bigdata009

1.前置工作

1.修改虚拟机的IP地址和hostname

2.配置集群中的ip映射(/etc/hosts)

XML 复制代码
192.168.111.57 bigdata007
192.168.111.58 bigdata008
192.168.111.59 bigdata009

3.关闭虚拟机的防火墙

4.集群间实现免密登录

XML 复制代码
ssh root@bigdata007

ssh-keygen -t rsa

ssh-copy-id bigdat007

ssh-copy-id bigdat008

ssh-copy-id bigdat009

每台虚拟机都执行类似操作

2.安装zookeeper

导入安装包,解压到/opt/softs目录

XML 复制代码
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz  -C /opt/softs/

修改包名 mv apache-zookeeper-3.5.7-bin/ zookeeper3.5.7

cd ../

在/zookeeper3.5.7目录下创建zkData目录,

里面创建文件myid写入id

配置文件

进入**/opt/softs/zookeeper3.5.7/conf**目录

删除log4j.properties

上传新的

XML 复制代码
# 定义日志输出路径
log4j.appender.file.File=/opt/softs/zookeeper3.5.7/logs/zookeeper.log
# 定义日志轮循策略,按天轮循
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c{1}:%L - %m%n

重要路径


/opt/softs/zookeeper3.5.7 目录下

创建logs目录

修改文件名

zoo_sample.cfg 为 zoo.cfg

修改zoo.cfg

添加

分发给其他两台虚拟机

XML 复制代码
scp -r zookeeper3.5.7/ root@bigdata008:/opt/softs/

修改各个虚拟机上的myid

配置环境变量 /etc/profile
XML 复制代码
#JAVA_HOME
export JAVA_HOME=/opt/softs/jdk1.8.0
export PATH=$PATH:$JAVA_HOME/bin


#ZK_HOME
export ZK_HOME=/opt/softs/zookeeper3.5.7
export PATH=$PATH:$ZK_HOME/bin

记得source一下 source /etc/profile

,直接分发

XML 复制代码
​​​​​​​scp /etc/profile root@bigdata008:/etc/
添加启动脚本

创建目录 /opt/shell

导入脚本

bash 复制代码
#!/bin/bash

# 在调用shell脚本时,需要传入一个参数,用于标识执行开启或者关闭zk集群的开启关闭和查询状态

#判断调用shell脚本时 是否正常的传入参数

#参数小于1
if [ $# -lt 1 ]
then
  echo "调用该脚本时需要传入一个参数"
  exit ;
fi

#传入的第一个参数 有三种情况
case $1 in 
"start")
	echo "----------启动zk集群----------"
	
	for hostname in bigdata007 bigdata008 bigdata009
do
	echo "-------------$hostname------------"
	ssh $hostname "/opt/softs/zookeeper3.5.7/bin/zkServer.sh start"

done
	
;;
"stop")
	echo "----------关闭hadoop集群----------"
		for hostname in bigdata007 bigdata008 bigdata009
do
	echo "-------------$hostname------------"
	ssh $hostname "/opt/softs/zookeeper3.5.7/bin/zkServer.sh stop"

done
	
;;	
"status")
	echo "----------查询zk集群状态-------------"
		for hostname in bigdata007 bigdata008 bigdata009
do
	echo "-------------$hostname------------"
	ssh $hostname "/opt/softs/zookeeper3.5.7/bin/zkServer.sh status"

done
;;	
*)
	echo "输入的参数不符合脚本运行的规则,请输入start或者stop,status"
;;
esac	

将JAVA_HOME=/opt/softs/jdk1.8.0

写入zkServer.sh

​​​​​​​ 分发给其他虚拟机

scp zkServer.sh root@bigdata008:/opt/softs/zookeeper3.5.7/bin/

运行sh /opt/shell/my_zk.sh start 检查脚本是否成功

2.进行集群规划

|------|-------------------|-----------------------------|-----------------------------|
| | bigdata007 | bigdata008 | bigdata009 |
| hdfs | NameNode DataNode | NameNode DataNode | DataNode |
| zk | 有 | 有 | 有 |
| yarn | NodeManager | NodeManager,ResourceManager | NodeManager,ResourceManager |

3.上传hadoop安装包

解压

4.修改配置文件

进入目录
/opt/softs/hadoop3.1.3/etc/hadoop

在hadoop-env.sh 中添加

core-site.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

		<!-- hdfs地址,ha中是连接到nameservice -->
		<property>
			<name>fs.defaultFS</name>
			<value>hdfs://mycluster</value>
		</property>
		
		<!-- 指定hadoop数据的存储目录 -->
		<property>
			<name>hadoop.tmp.dir</name>
			<value>/opt/softs/hadoop3.1.3/data</value>
		</property>
		
		<!-- 故障转移 -->
		<property>
			<name>ha.zookeeper.quorum</name>
			<value>bigdata007:2181,bigdata008:2181,bigdata009:2181</value>
		</property>
		
		
		<!-- 解决HDFS web页面上删除、创建文件权限不足的问题 -->
		<property>
			<name>hadoop.http.staticuser.user</name>
			<value>root</value>
		</property>

		<property>
			<name>hadoop.proxyuser.root.hosts</name>
			<value>*</value>
		</property>
		
		<property>
			<name>hadoop.proxyuser.root.groups</name>
			<value>*</value>
		</property>
		
</configuration>

hdfs-site.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

  <!-- 为namenode集群定义一个services name -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>

  <!-- nameservice包含哪些namenode,为各个namenode起名 -->
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>

  <!-- 名称为nn1的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>bigdata007:8020</value>
  </property>

  <!-- 名称为nn2的namenode的rpc地址和端口号,rpc用来和datanode通讯  -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>bigdata008:8020</value>
  </property>


  <!-- 名称为nn1的namenode的http地址和端口号,web客户端 -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>bigdata007:50070</value>
  </property>

  <!-- 名称为nn2的namenode的http地址和端口号,web客户端 -->
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>bigdata008:50070</value>
  </property>


  <!-- namenode间用于共享编辑日志的journal节点列表 -->	
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://bigdata007:8485;bigdata008:8485;bigdata009:8485/mycluster</value>
  </property>
  
  
  <!-- journalnode 上用于存放edits日志的目录 -->
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/softs/hadoop3.1.3/data/dfs/jn</value>
  </property>

  <!-- 客户端连接可用状态的NameNode所用的代理类 -->
  <property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

 <!--sshfence:防止namenode脑裂,当脑裂时,会自动通过ssh到old-active将其杀掉,将standby切换为active  -->
  <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>

  <!-- 故障转移设置为ture -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>

</configuration>

mapred-site.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <!--指定mapreduce运行在yarn框架上-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <!--设置mapreduce的历史服务器安装在bigdata007节点上-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>bigdata007:10020</value>
    </property>


	<!--设置历史服务器的web页面地址和端口号-->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>bigdata007:19888</value>
    </property>

</configuration>

yarn-site.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<configuration>

  <!-- 配置yarn的默认混洗方式,选择为mapreduce的默认混洗算法 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <!-- 是否启用日志聚集功能 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>

  <!-- 是配置聚集的日志在HDFS上最多保存多长时间 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>

  <!--  启用resourcemanager的ha功能 -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>

  <!--  为resourcemanage ha集群起个id -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property>

  <!--  指定resourcemanger ha有哪些节点名 -->
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>

  <!--  指定第一个节点的所在节点 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>bigdata008</value>
  </property>

  <!--  指定第二个节点所在机器 -->
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>bigdata009</value>
  </property>

  <!-- 指定resourcemanger ha所用的zookeeper节点 -->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>bigdata007:2181,bigdata008:2181,bigdata009:2181</value>
  </property>

 <!-- 开启Recovery后,ResourceManger会将应用的状态等信息保存到yarn.resourcemanager.store.class配置的存储介质中,重启后会load这些信息,并且NodeManger会将还在运行的container信息同步到ResourceManager,整个过程不影响作业的正常运行。 -->
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>

 <!-- 指定yarn.resourcemanager.store.class的存储介质(HA集群只支持ZKRMStateStore) -->
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>

</configuration>

配置运行hadoop中的works

​​​​​​​​​​​​​​

hadoop分发到别的目录

scp -r hadoop3.1.3/ root@bigdata008:/opt/softs/

再次/etc/profile 配置文件
XML 复制代码
#HADOOP_HOME
export HADOOP_HOME=/opt/softs/hadoop3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

export HADOOP_CONF_DIR=/opt/softs/hadoop3.1.3/etc/hadoop
export HADOOP_CLASSPATH=`hadoop classpath`


export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root

配置完成后,传给其他两台虚拟机上,记得source一下

NameNode初始化

1.在每个节点上启动journalnode

hadoop-daemon.sh start journalnode

2.在每个节点上启动zk

zkServer.sh start

3.在某一个NameNode节点(bigdata007)上对NameNode进行初始化

hdfs namenode -format

启动NameNode并进行同步

1.在bigdata007上执行NameNode的启动

hadoop-daemon.sh start namenode

2.在另外一个NameNode节点(bigdata008)上同步元数据信息,然后再启动NameNode

--同步元数据

hdfs namenode -bootstrapStandby

--启动NameNode

hadoop-daemon.sh start namenode

进行zk的初始化

在bigdata007上执行zk的初始化

hdfs zkfc -formatZK

启动hdfs和yarn

start-dfs.sh

start-yarn.sh

windows配置文件

用浏览器访问

http://bigdata007:50070

http://bigdata008:50070

07是活跃的

yarn的

http://bigdata008:8088

http://bigdata009:8088

有一个处于活跃状态

相关推荐
Ray.199810 分钟前
Flink 的核心特点和概念
大数据·数据仓库·数据分析·flink
lisacumt11 分钟前
【kerberos】使用keytab文件,kerberos认证工具类 scala版本
hadoop·scala
极客先躯21 分钟前
如何提升flink的处理速度?
大数据·flink·提高处理速度
BestandW1shEs24 分钟前
快速入门Flink
java·大数据·flink
中东大鹅44 分钟前
MongoDB基本操作
数据库·分布式·mongodb·hbase
苏苏大大2 小时前
zookeeper
java·分布式·zookeeper·云原生
MasterNeverDown2 小时前
WPF 使用iconfont
hadoop·ui·wpf
速融云3 小时前
汽车制造行业案例 | 发动机在制造品管理全解析(附解决方案模板)
大数据·人工智能·自动化·汽车·制造
金融OG3 小时前
99.11 金融难点通俗解释:净资产收益率(ROE)VS投资资本回报率(ROIC)VS总资产收益率(ROA)
大数据·python·算法·机器学习·金融
Linux运维老纪3 小时前
分布式存储的技术选型之HDFS、Ceph、MinIO对比
大数据·分布式·ceph·hdfs·云原生·云计算·运维开发