hadoop配置 HA+联邦

HA:解决了NameNode存在的单点故障问题
联邦机制:拓展了NameNode的容量,提升集群所能存储数据的上限,各个HA之间不会通信,各自负责各自的数据管理

集群规划

t1	zookeeper	JournalNode		NameNode	zkfc	DataNode	ResourceManager		NodeManager
t2	zookeeper	JournalNode		NameNode	zkfc	DataNode	ResourceManager		NodeManager
t3	zookeeper	JournalNode		NameNode	zkfc	DataNode						NodeManager
t4								NameNode	zkfc	DataNode						NodeManager

集群配置

hosts

192.168.28.128	t1
192.168.28.129	t2
192.168.28.130	t3
192.168.28.131	t4

配置hadoop集群环境

设置每台机器的hostname:
hostnamectl set-hostname t1


配置环境变量:
###########java############
export JAVA_HOME=/bigdata/jdk1.8.0_11
export CLASSPATH=.:$JAVA_HOME/lib$:JRE_HOME/lib:$CLASSPATH
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin/$JAVA_HOME

#set zookeeper
export ZOOKEEPER_HOME=/bigdata/zookeeper-3.4.12/
export PATH=$PATH:$ZOOKEEPER_HOME/bin

#hadoop
export HADOOP_HOME=/bigdata/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

生效配置:
source /etc/profile

关闭防火墙:
	查看防火墙状态:
	firewall-cmd --state
	
	停止firewall:
	systemctl stop firewalld.service
	
	禁止firewall开机启动:
	systemctl disable firewalld.service 


配置免密登录:
每台机器执行:ssh-keygen -t rsa
ssh t1 cat /root/.ssh/id_rsa.pub >> authorized_keys
scp /root/.ssh/authorized_keys root@t1:/root/.ssh/

hadoop-env.sh

 export JAVA_HOME=/bigdata/jdk1.8.0_11/

core-site.xml

<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>viewfs://my-cluster</value>
	</property>
	<!-- 第一套namenode集群 --> 
	<property>
		<name>fs.viewfs.mounttable.my-cluster.link./app</name>
		<value>hdfs://ha1/</value>
	</property>
	<!-- 第二套namenode集群 --> 
	<property>
		<name>fs.viewfs.mounttable.my-cluster.link./doc</name>
		<value>hdfs://ha2/</value>
	</property>
	<!-- 数据总目录,其他需要生成日志,数据的目录都在这个目录下 -->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/bigdata/hadoop-2.9.2/tmp</value>
	</property>
	<!-- zookeeper集群 -->
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>t1:2181,t2:2181,t3:2181</value>
	</property>
</configuration>

hdfs-site.xml

<configuration>
<!-- 两套namenode集群的名字 --> 
  <property>
	<name>dfs.nameservices</name>
	<value>ha1,ha2</value>
  </property>
  <!-- ha1下面有两个NameNode,逻辑地址,分别是nn1,nn2 -->
  <property>
	<name>dfs.ha.namenodes.ha1</name>
	<value>nn1,nn2</value>
  </property>
  <!-- nn1的RPC通信地址 -->
  <property>
	<name>dfs.namenode.rpc-address.ha1.nn1</name>
	<value>t1:9000</value>
  </property>
  <!-- nn1的http通信地址 -->
  <property>
	<name>dfs.namenode.http-address.ha1.nn1</name>
	<value>t1:50070</value>
  </property>
  <!-- nn2的RPC通信地址 -->
  <property>
	<name>dfs.namenode.rpc-address.ha1.nn2</name>
	<value>t2:9000</value>
  </property>
  <!-- nn2的http通信地址 -->
  <property>
	<name>dfs.namenode.http-address.ha1.nn2</name>
	<value>t2:50070</value>
  </property>
  <!-- 配置失败自动切换实现方式,zkfc,一个类 -->
  <property>
	<name>dfs.client.failover.proxy.provider.ha1</name>
	<value>         org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
	</value>
  </property>

  <!-- ha2下面有两个NameNode,逻辑地址,分别是nn3,nn4 -->
  <property>
	<name>dfs.ha.namenodes.ha2</name>
	<value>nn3,nn4</value>
  </property>
  <!-- nn1的RPC通信地址 -->
  <property>
	<name>dfs.namenode.rpc-address.ha2.nn3</name>
	<value>t3:9000</value>
  </property>
  <!-- nn1的http通信地址 -->
  <property>
	<name>dfs.namenode.http-address.ha2.nn3</name>
	<value>t3:50070</value>
  </property>
  <!-- nn2的RPC通信地址 -->
  <property>
	<name>dfs.namenode.rpc-address.ha2.nn4</name>
	<value>t4:9000</value>
  </property>
  <!-- nn2的http通信地址 -->
  <property>
	<name>dfs.namenode.http-address.ha2.nn4</name>
	<value>t4:50070</value>
  </property>
  <!-- 配置失败自动切换实现方式,zkfc,一组一个 -->
  <property>
	<name>dfs.client.failover.proxy.provider.ha2</name>
	<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  
  <property>
	<name>dfs.namenode.name.dir</name>
	<value>/bigdata/hadoop-2.9.2/tmp/namedir</value>
  </property>
    <property>
	<name>dfs.datanode.data.dir</name>
	<value>/bigdata/hadoop-2.9.2/tmp/datadir</value>
  </property>

<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 
     	因为这里具体设置了不同节点的具体位置,可以一同复制该配置给其他机器而不影响使用,

	另一种配置:
		集群1,下面4个具体的dfs.namenode.shared.edits.dir配置可改为这里的1个配置,集群1的两台namenode配置这个
		<property> 
			<name>dfs.namenode.shared.edits.dir</name> 
			<value>qjournal://t1:8485;t2:8485;t3:8485/HA-1</value> 
		</property>

		集群2,对应的下面4个dfs.namenode.shared.edits.dir配置同理,改为这里的1,集群2的两台namenode配置这个
		<property> 
			<name>dfs.namenode.shared.edits.dir</name> 
			<value>qjournal://t1:8485;t2:8485;t3:8485/HA-2</value> 
		</property>
	这种方式在两个集群配置两个,多个集群略有不变,不能一同传输给其他机器,喜好随自己.后面的启动操作都一样

-->
  <property>
	<name>dfs.namenode.shared.edits.dir.ha1.nn1</name>
	<value>qjournal://t1:8485;t2:8485;t3:8485/HA-1</value> 
  </property>
  <property>
	<name>dfs.namenode.shared.edits.dir.ha1.nn2</name>
	<value>qjournal://t1:8485;t2:8485;t3:8485/HA-1</value> 
  </property>
  <property>
	<name>dfs.namenode.shared.edits.dir.ha2.nn3</name>
	<value>qjournal://t1:8485;t2:8485;t3:8485/HA-2</value> 
  </property>
  <property>
	<name>dfs.namenode.shared.edits.dir.ha2.nn4</name>
	<value>qjournal://t1:8485;t2:8485;t3:8485/HA-2</value> 
  </property>


<!-- 开启NameNode失败自动切换 -->
  <property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
  </property>
  <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
  <property>
	<name>dfs.journalnode.edits.dir</name>
	<value>/bigdata/hadoop-2.9.2/tmp/journaldata</value>
  </property>
  <!-- 配置隔离fence机制方法,多个机制用换行分割,即每个机制暂用一行-->
  <property>
	<name>dfs.ha.fencing.methods</name>
	<value>
		sshfence
		shell(/bin/true)
	</value>
  </property>
  <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
  <property>
	<name>dfs.ha.fencing.ssh.private-key-files</name>
	<value>/root/.ssh/id_rsa</value>
  </property>
  <!-- 配置sshfence隔离机制超时时间 -->
  <property>
	<name>dfs.ha.fencing.ssh.connect-timeout</name>
	<value>30000</value>
  </property>
  
  <property>
	<name>ha.zookeeper.session-timeout.ms</name>
	<value>5000</value>
  </property>
  <property>
	<name>dfs.replication</name>
	<value>2</value>
  </property>

  <!-- true,则打开前文所述的权限系统。如果是 false,权限检查 就是关闭的-->
  <property>
	<name>dfs.permission</name>
	<value>false</value>
  </property>
  <!--webhdfs的LISTSTATUSLISTFILESTATUS等需要列出文件、文件夹状态的命令-->
  <property>
	<name>dfs.webhdfs.enabled</name>
	<value>true</value>
  </property>
  <!--给文件追加内容-->
  <property>
	<name>dfs.support.append</name>
	<value>true</value>
  </property>

  <property>
	<name>hadoop.proxyuser.hduser.hosts</name>
	<value>*</value>
  </property>
  <property>
	<name>hadoop.proxyuser.hduser.groups</name>
	<value>*</value>
  </property>
  
  <!--联邦机制下必须指定MapperReduce的任务文件上传的路径,/doc是我的namenode管理路径-->
  <property>
	<name>yarn.app.mapreduce.am.staging-dir</name>
	<value>/doc/tmp/hadoop-yarn/staging</value>
  </property> 
</configuration>

mapred-site.xml

<configuration>
	  <!--mapreduce运行平台的名字,mapreduce运行时,需要将之设置为yarn -->
	  <property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	  </property>
</configuration>

yarn-site.xml

<configuration>
  <property>
	<name>yarn.resourcemanager.ha.enabled</name>
	<value>true</value>
  </property>
  <!-- 指定RM的cluster id -->
  <property>
	<name>yarn.resourcemanager.cluster-id</name>
	<value>yrc</value>
  </property>
  <!-- 指定RM的名字 -->
  <property>
	<name>yarn.resourcemanager.ha.rm-ids</name>
	<value>rm1,rm2</value>
  </property>
  <!-- 分别指定RM的地址 -->
  <property>
	<name>yarn.resourcemanager.hostname.rm1</name>
	<value>t1</value>
  </property>
  <property>
	<name>yarn.resourcemanager.hostname.rm2</name>
	<value>t2</value>
  </property>
  <property>
	<name>yarn.resourcemanager.webapp.address.rm1</name>
	<value>t1:8088</value>
  </property>
  <property>
	<name>yarn.resourcemanager.webapp.address.rm2</name>
	<value>t2:8088</value>
  </property>
  
  <!-- 指定zk集群地址 -->
  <property>
	<name>yarn.resourcemanager.zk-address</name>
	<value>t1:2181,t2:2181,t3:2181</value>
  </property>
  <property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
  </property>
</configuration>

slaves

t1
t2
t3
t4

启动

zkServer.sh start
启动zookeeper集群,奇数台>=3,主要用于选举

hadoop-daemon.sh start journalnode
启动journalnode用于日志存储合并,创建一个journalnode数据目录,奇数台>=3,超半数以上机器同步完数据就算写edit完成

hdfs namenode -format -clusterId HA-Federation
格式化namenode,各个HA之间都需要指定相同的clusterId,表示在同一个集群中,并且在journalNode上建立了一个HA的数据目录。在HA中一个namenode节点执行,然后拷贝到另一个
在这里插入图片描述
scp -r tmp/namedir root@t2:/bigdata/hadoop-2.9.2/tmp/
将格式化完成的namenode数据拷贝到同个HA中的另一个namenode节点,保证数据的一致

hdfs zkfc -formatZK
格式化zkfc,先在zookeeper中创建hadoop-ha/nameserviceName(这里是ha1)节点,zkfc负责当前机器的namenode和同HA的另一台机器的存活检测与切换主节点,并记录到zookeeper中。在HA中的一个节点上执行即可
在这里插入图片描述

start-dfs.sh
启动hdfs,在一台namenode上执行即可
在这里插入图片描述
jps
启动完成的进程
在这里插入图片描述

各组件之间的关系

NameNode:
在这里插入图片描述
JournalNode:
在这里插入图片描述
DataNode中的数据块:
在这里插入图片描述
DataNode:
在这里插入图片描述
DataNode中BP数据块:
在这里插入图片描述
一个集群中的clusterID必须唯一,维系NameNode、DataNode、JournalNode;
一个HA有一个唯一的namespaceID,维系NameNode、JournalNode、DataNode/BP;
一个DataNode可以有很多个HA的具体数据块,数据块属于哪一个HA管理是由blockpoolID维系,blockpoolID也是BP数据块的文件名。ID中的IP并不是指HA中的active节点的IP,而是最先启动创建目录的那个节点的IP,这里我是在192.168.28.130上启动的。

在这里插入图片描述
显示两个目录,和平时调用的没有区别,但是app目录是由一号HA控制的,doc由2号控制。
注意:不能在同一级创建文件了,必须到/app或者/doc下创建。

数据访问

hadoop fs -put README.txt /doc
一般通用式访问:
在这里插入图片描述
可以指定负责对应目录数据控制的HA的nameservice访问:
在这里插入图片描述
必须是HA中的active节点IP:
在这里插入图片描述
viewfs://my-cluster已在配置文件中指定:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值