Hadoop2.5-HA环境搭建

本文只是提供hadoop的HA环境搭建,对于hadoop本身和其它想要了解的同学们,这里对不住了。之后我也会写关于hadoop的一些原理的文章,加深自己的记忆。但是现在我只是把hadoop的集群搭建放到网上供大家参考。网上的例子和视频还是蛮多的。

HA(双机集群),HA指的是有活跃节点和备用节点的集群,这里的节点我们通常指的是一台服务器。活跃的节点就是你正在运行的服务,备用节点和活跃节点没有差别,只不过它还没有启动罢了。备用的节点可以有多个,但活跃的节点只能是一个。我们一般把有两个或两个以上的节点群,而且分为活跃节点和备用节点的称为HA。

为什么会用HA?

在hadoop1.0中NameNode只有一个,当这个NameNode的这台机子如果挂了,我们的hadoop也就不能用了,这是hadoop1.0中的一个弊端,也就是我们常说的单点故障。而HA就是在hadoop2.0中为我们提出的其中一个解决方案(另外一个是网络共享目录:NFS),我们通过Zookeeper的故障转移技术,将备用的节点启动,设置为Active状态就可以保证我们hadoop的正常运行,实现表面现象的故障转移。

关于hadoop HA的搭建,我这里有一张关系图。

首先我们需要搭建Zookeeper集群,Zookeeper的集群一般是要奇数个的。Zookeeper是做分布式协调服务的,它是集群的管理者,我们如果要做什么都需要通过Zookeeper替我们做选择。当我们的NameNode出现故障时,Zookeeper集群会在备用的节点中选举出一个Leader(领导者),就是在Hadoop中的Standby中选出一个NamNode将他设为Active状态,实现故障转移功能。而集群的部署为什么是奇数的呢?因为当Zookeeper集群部署了4个,如果出现投票相同的就会出现问题。所以我们需要Zookeeper集群一定能够帮我们选出唯一的Leader。

那Zookeeper是如何监控NameNode呢?

在Zookeeper中有一个ZKFC,他是Zookeeper Failover Controller的缩写,它帮我们实时的监控NameNode,并反馈到Zookeeper上,检查NameNode是否出现异常,所以在部署时ZKFC的个数是跟NameNode有关的。

图中的NNActive和NNStandby就是我们上文说的HA。在图中两个NN都指向JN块,这个JN是JournalNode的简写,是用于保存NameNode的元数据fsimage和edits文件的。因为在hdfs中最为重要的就是NameNode中的元数据,如果说元数据丢失,那hdfs中的文件也就失去了意义。所以我们需要JournalNode帮我们做存储,我们以集群的形式部署JN,而Active节点和Standby节点都是向JN上写元数据和同步元数据的。

 

你用Hadoop 2的版本就不能不说到yarn,它是Hadoop 2中的新框架,是hdfs的资源管理系统,它替代了Hadoop 1中的JobTracker和TaskTracker。它监控并分配整个hdfs系统的内存、cpu、应用、磁盘等。Yarn还可以拓展出MapReduce其它的分布式计算框架,如Spark等。Yarn由ResourceManager、NodeManager、ApplicationMaster、Container组成,在Yarn的官方文档有Yarn的工作的流程图。

ResourceManager(RM):全局的资源管理器,一个Hadoop集群中仅有一个

NodeManager(NM):节点的资源管理器,它是ResourceManager的代理,每一个节点上有一个NodeManager,管理自己的节点并向ResourceManager汇报

ApplicationMaster(AM):一个应用程序的实例,它用于向RM申请资源。它的启动和暂停通过NM来进行

Container:一个资源容器,包含了RM分配给AM所需的东西,如内存、cpu等

 

HA部署的节点图

hostname为每个服务器主机的名称,后面的1代表着每个hdfs的节点部署在那个服务器上

 

开始部署:

前提

第一步:工具hadoop 2.5.1.tar.gz、zookeeper 3.4.6.tar.gz、jdk1.7.0_80.tar.gz

第二步:再四台服务器上将jdk、zookeeper、hadoop配置到环境变量(/etc/profile)中

第三步:更改四台服务器的/etc/sysconfig/network和/etc/hosts文件将主机名称更改,并配置域名

 

如果上面的准备都已完成我们还需要NameNode能够在不提供密码的情况下登录任意一台hadoop下的服务器。这个实际上是为了我们能够在一台hadoop的服务器上启动所有的hadoop集群。

在每台服务器上执行以下命令:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

如果你已经选定了莫台机子来启动hadoop集群,那你将这台机器的公钥拷贝到其他的服务器上

scp ~/.ssh/id_dsa.pub root@hadoop2:/

然后你需要在其它的机器上将拷贝的公钥追加到authorized_keys文件中

cat /id_dsa.pub >> ~/.ssh/authorized_keys

这就使得hadoop1的服务器能够自由的登录其它的服务器上了

 

更改Hadoop配置

编辑hdfs-site.xml文件:vi ./hdfs-site.xml

<configuration>
	<!-- 设置hdfs的服务名称 -->
	<property>
	  <name>dfs.nameservices</name>
	  <value>haHadoop</value>
	</property>
	<!-- 设置HA集群的namenode的名称 -->
	<property>
	  <name>dfs.ha.namenodes.haHadoop</name>
	  <value>nn1,nn2</value>
	</property>
	<!-- 设置第一个namenode的rpc的地址 -->
	<property>
	  <name>dfs.namenode.rpc-address.haHadoop.nn1</name>
	  <value>hadoop1:8020</value>
	</property>
	<!-- 设置第二个namenode的rpc的地址 -->
	<property>
	  <name>dfs.namenode.rpc-address.haHadoop.nn2</name>
	  <value>hadoop2:8020</value>
	</property>
	<!-- 设置第一个namenode的http的地址 -->
	<property>
	  <name>dfs.namenode.http-address.haHadoop.nn1</name>
	  <value>hadoop1:50070</value>
	</property>
	<!-- 设置第二个namenode的http的地址 -->
	<property>
	  <name>dfs.namenode.http-address.haHadoop.nn2</name>
	  <value>hadoop2:50070</value>
	</property>
	<!-- 设置journal节点的集群地址 -->
	<property>
	  <name>dfs.namenode.shared.edits.dir</name>
	  <value>qjournal://hadoop2:8485;hadoop3:8485;hadoop4:8485/haHadoop</value>
	</property>
	<!-- HDFS 客户端连接Active NameNode的Java类 -->
	<property>
	  <name>dfs.client.failover.proxy.provider.haHadoop</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<!-- 用于在触发故障转移时能够不用提供密码就杀掉故障的Active NameNode时所提供密钥文件 -->
	<!-- 用于杀掉故障的Active NameNode所提供的的进程 -->
	<property>
	  <name>dfs.ha.fencing.methods</name>
	  <value>sshfence</value>
	</property>
	<!-- 用于杀掉故障的Active NameNode所提供的密钥文件地址 -->
	<property>
	  <name>dfs.ha.fencing.ssh.private-key-files</name>
	  <value>/root/.ssh/id_dsa</value>
	</property>
	<!-- 设置HA集群的故障转移  -->
	<property>
	   <name>dfs.ha.automatic-failover.enabled</name>
	   <value>true</value>
	</property>
</configuration>

 

 编辑core-site.xml

<configuration>
	<property>
	  <name>fs.defaultFS</name>
	  <value>hdfs://haHadoop</value>
	</property>
	<!-- 设置journal节点的edits的文件目录 -->
	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/opt/journal/data</value>
	</property>
	<!-- 设置zookeeper集群的服务器地址 -->
	<property>
	   <name>ha.zookeeper.quorum</name>
	   <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
	</property>
	<!-- 设置hdfs的目录头:因为hdfs的存储文件都是存在该目录下 -->
	<property>
	   <name>hadoop.tmp.dir</name>
	   <value>/opt/hadoop</value>
	</property>
</configuration>

 

编辑yarn-site.xml

<configuration>

	<!-- 设置ResourceManager的一个主机名称 -->
	<property>
	  <name>yarn.resourcemanager.hostname</name>
	  <value>hadoop1</value>
	</property>

	<!-- MapReduce应用程序需要设置Shuffle服务 -->
	<property>
	  <name>yarn.nodemanager.aux-services</name>
	  <value>mapreduce_shuffle</value>
	</property>
	<!-- MapReduce应用程序需要设置Shuffle服务的java类 -->
	<property>
	  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
	  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
</configuration>

编辑mapred-site.xml

<configuration>
	<!-- MapReduce框架通过Yarn框架执行 -->
	<property>
	  <name>mapreduce.framework.name</name>
	  <value>yarn</value>
	</property>
</configuration>

编辑hadoop-env.sh

找到export JAVA_HOME=${JAVA_HOME}这行改成下面

#JAVA_HOME为jdk的绝对路径
export JAVA_HOME=/usr/wh/jdk1.7.0_80

 

更改Zookeeper配置

编辑zoo.cfg

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
#修改此处
dataDir=/opt/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#增加zookeeper集群的主机名
server.1 = hadoop1:2888:3888
server.2 = hadoop2:2888:3888
server.3 = hadoop3:2888:3888

未完待续。。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值