赞
踩
HA 概念以及作用
HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。
基础架构
1、NameNode(Master)
1)命名空间管理:命名空间支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除、列表文件和目录等基本操作。
2)块存储管理。
NameNode+HA架构
从上面的架构图可以看出,使用Active NameNode,Standby NameNode 两个节点可以解决单点问题,两个节点通过JounalNode共享状态,通过ZKFC 选举Active ,监控状态,自动备份。
1、Active NameNode
接受client的RPC请求并处理,同时写自己的Editlog和共享存储上的Editlog,接收DataNode的Block report, block location updates和heartbeat。
2、Standby NameNode
同样会接到来自DataNode的Block report, block location updates和heartbeat,同时会从共享存储的Editlog上读取并执行这些log操作,保持自己NameNode中的元数据(Namespcae information + Block locations map)和Active NameNode中的元数据是同步的。所以说Standby模式的NameNode是一个热备(Hot Standby NameNode),一旦切换成Active模式,马上就可以提供NameNode服务。
3、JounalNode
用于Active NameNode , Standby NameNode 同步数据,本身由一组JounnalNode节点组成,该组节点奇数个。
4、ZKFC
监控NameNode进程,自动备份。
1.准备Linux环境
安装vmware linux虚拟机,我本次用的Centos 6版本。 集群中虚拟机需要几步必须的配置(本次集群的搭建我搞了5台虚拟机,原因下面有介绍),这里我们先配置好一台虚拟机的公共配置,然后其余的克隆出来即可。
HADOOP HA是什么?
在HADOOP1.0时代,整个集群中仅有一台NameNode结点,如果该结点丢失或数据发生损坏,会对整个集群造成不可恢复的损失,为了解决这一问题,社区研发出了SecondaryNamenode用以备份NameNode中的元数据,然而使用该组建后,当集群发生损坏时,集群恢复工作的时间相当缓慢,并不能满足商业上的使用。
在HADOOP2.0时代,社群重新定义了NameNode的设计层级,改用Service来对集群进行管理。Hadoop HA使用多个NameNode组成一个服务,每一个服务中有两台或以上的NameNode,NameNode们的功能完全一致,但是同一时间仅有一台处于active状态,其他处于Standby状态,当active集群发生故障时,能在秒级时间内进行切换。
步骤:
scp jdk-7u67-linux-x64.rpm node03:`pwd`
scp jdk-7u67-linux-x64.rpm node04:`pwd`
scp jdk-7u67-linux-x64.rpm node05:`pwd`
在Xshell的全部会话栏里,输入ll
是否发送成功
①在node03,node04,node05上执行rpm安装命令:
rpm -i jkd-7u67-linux-x64.rpm
②在node02上cd /etc,在此目录下把profile文件分发到node03,node04,node05上:
scp profile node03:'pwd'
scp profile node04:'pwd'
scp profile node05:'pwd'
在Xshell的全部会话栏里,输入:source /etc/profile
,然后输入:jps
,查看node03,node04,node05这三台机子的jdk是否安装好:
①利用 date
命令查看机子的当前时间
时间不能差太大,否则集群启动后某些进程跑不起来。
②若时间不同步
1)yum进行时间同步器的安装
yum -y install ntp
2)执行同步命令
ntpdate time1.aliyun.com #和阿里云服务器时间同步
和阿里云服务器时间同步
①查看hostname是否正确
cat /etc/sysconfig/network
②查看IP映射是否正确
cat /etc/hosts
③查看selinux里是否为disabled
cat /etc/sysconfig/selinux
④查看防火墙是否关闭
service iptables status
①在家目录下 ll -a
看下有无.ssh 文件,如果没有就ssh localhost一下
ssh-keygen -t dsa -P ‘’-f ~/.ssh/id_dsa
cat ~/.ssh/id dsa.pub >> ~/.ssh/authorized_keys
②cd .ssh,并 ll 查看
③把node02的公钥发给其他三台机子
scp id_dsa.pub node03:‘pwd’/node02.pub
scp id_dsa.pub node04:‘pwd’/node02.pub
scp id_dsa.pub node05:‘pwd’/node02.pub
④在node03,node04,node05追加一下node02.pub
cat node02,pub >> authorized_keys
在node03上:
ssh-keygen -t dsa -P ‘’-f ~/.ssh/id_dsa
cat ~/.ssh/id dsa.pub >> ~/.ssh/authorized_keys
然后ssh localhost验证一下
然后将id_dsa分发到node02:
scp id_dsa.pub node02:‘pwd’/node03.pub
在node02的 .ssh 文件下:
cat node03.pub >> authorized_keys
在node03上ssh node02 验证一下是否可免密钥登录
1)vi hdfs-site.xml
①去掉snn的配置
②增加以下property
上述操作完成之后,hdfs-site.xml的内容为:
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node02:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node03:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node02:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node03:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node02:8485;node03:8485;node04:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/yh/hadoop/ha/jn</value> </property> <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> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_dsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
2) vi core-site.xml
core-site.xml的内容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node03:2181,node04:2181,node05:2181</value>
</property>
</configuration>
3)vi slaves
node03
node04
node05
4)安装hadoop
①cd /opt,将解压后的hadoop(寻找到haodoop所在的目录)分发到node03,node04,node05:
scp -r yh/ node03:‘pwd’
scp -r yh/ node04:‘pwd’
scp -r yh/ node05:‘pwd’
②将hdfs-site.xml和core-site.xml分发到node03,node04,node05:
scp hdfs-site.xml core-site.xml node03:‘pwd’
scp hdfs-site.xml core-site.xml node04:‘pwd’
scp hdfs-site.xml core-site.xml node05:‘pwd’
tar xf zookeeper-3.4.6.tar.gz -C /opt/yh
cd /opt/yh/zookeeper-3.4.6/conf
给zoo_sample.cfg改名:
cp zoo_sample.cfg zoo.cfg
然后vi zoo.cfg
改dataDir=/var/yh/zk
并在末尾追加
server.1 = node03:2888:3888
server.2 = node04:2888:3888
server.3 = node05:2888:3888
其中2888主从通信端口,3888是当主挂断后进行选举机制的端口
scp -r zookeeper-3.4.6/ node04:‘pwd’
scp -r zookeeper-3.4.6/ node05:‘pwd’
利用ll /opt/yh
检查一下分发成功没有
mkdir -p /var/yh/zk
对node03来说: .
echo 1 > /var/yh/zk/myid
cat /var/yh/zk/myid
对node04来说:
echo 2 > /var/yh/zk/myid
cat /var/yh/zk/myid
对node05来说:
echo 3 > /var/yh/zk/myid
cat /var/yh/zk/myid
给每台机子配置其编号(必须是阿拉伯数字)
export ZOOKEEPER HOME=/opt/yh/zookeeper-3.4.6
export PATH=PATH:/usr/java/jdk1.7.0_67/bin:HADOOP_HOME/bin:HADOOP_ HOME/sbin:$ZOOKEEPER_HOME/bin
scp /etc/profile node04:/etc
scp /etc/profile node05:/etc
在node03,node04,node05里source /etc/ profie
验证source这句是否完成,输入zkCli.s,按Tab可以把名字补全zkCli.sh
全部会话:zkServer.sh start
接着用:zkServer.sh status查看每个zookeeper节点的状态
如果启动不起来,请把/etc/profile里的JAVA HOME改成绝对路径。
会有2个follower以及1个leader
在node02,node03,node04上分别把journalnode启动起来:
hadoop-daemon.sh start journalnode
随意挑一台namenode上执行hdfs_namenode -format另一台namenode不用执行,否则clusterlD变了,找不到集群了。
hadoop-daemon.sh start namenode
hdfs namenode -bootstrapStandby
hdfs zkfc -formatZK
在node03上执行zkCli. sh打开zookeeper客户端看hadoop-ha是否打开:
start-dfs.sh
然后全部会话 jps 进程:
node02:
node03:
node04:
node05:
用浏览器访问集群:
关闭集群命令:
stop-dfs.sh
关闭zookeeper命令:
zkServer.sh stop
更改环境变量,增加HADOOP_HOME
并在path中添加HADOOP_HOME中添加路径
然后再新建一个变量HADOOP_USER_NAME
把hadoop.dll拷贝到以下路径
安装eclipse-mars,并调出Map/Reduce Locations
新建一个hadoop localtion(Host:哪个namenode是active,就填哪个)
在eclipse里导入自己建一个包库,并把jar包导入刚建的包库
利用xftp把hdfs-site.xml,core-site.xml等几个xml放到project的src目录。
cp mapred-site.xml.template mapred-site.xml
<property>
< name> mapreduce.framework.name </name>
<value>yarn</value>
</property>
mapred-site.xml的显示如下:
yarn-site.xml显示如下:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node04</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node05</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>node03:2181,node04:2181,node05:2181</value> </property> </configuration>
scp mapred-site.xml yarn-site.xml node03: ‘pwd’
scp mapred-site.xml yarn-site.xml node04: ‘pwd’
scp mapred-site.xml yarn-site.xml node05: ‘pwd’
在node04的.ssh目录下生成密钥
ssh-keygen -t dsa -P " -f ./id_dsa
并追加到自己authorized_keys,
cat id_ dsa.pub >> authorized_keys
将node04的公钥分发到node05
scp. id_ dsa.pub node05: ‘pwd’/node04.pub
在node05的ssh目录下,追加node04.pub
cat node04.pub > > authorized_keys
在node04上ssh node05,看是否免密钥.
在node05的.ssh目录下生成密钥
ssh-keygen -t dsa -P " -f ./id_dsa
并追加到自己authorized_keys,
cat id_ dsa.pub >> authorized_keys
将node05的公钥分发到node04
scp id _dsa.pub node04: ‘pwd’/node05.pub
在node04的.ssh目录下,追加node05.pub
cat node05.pub >> authorized_keys
在node05.上ssh node04,看是否免密钥
①启动zookeeper,全部会话
zkServer.sh start
②在node02上启动hdfs
start-dfs.sh
③在node02.上启动yarn
start-yarn.sh
④4.在node04、05上分别启动resourcemanager
yarn-daemon.sh start resourcemanager
⑤全部会话jps,看进程全不全
node02:
node03的jps:
node04的jps:
node05的jps:
网页访问node05:8088,查看resourcemanager管理的内容:
①关闭zookeeper,全部会话
zkServer.sh stop
②在node02上关闭hdfs
stop-dfs.sh
③在node02.上关闭yarn
stop-yarn.sh
④4.在node04、05上分别关闭resourcemanager
yarn-daemon.sh stop resourcemanager
对于linux。我其实是比较陌生的,幸亏有百度可以查询资料,还有小黄鸭这种可视化的linux可操作的界面,让我的大数据学习的方式快了不少,也有了不少信心。
跑wordcount的一个程序:
首先,在date的文件下,创建一个一个输入、输出的文件夹input和output
然后,利用Xftp 4把500miles.txt传入Xshell传好以后在家目录下,ll查看一下
然后,利用put命令把500.miles.txt 写到input里面
然后cd到mapreduce目录下
然后在mapreduce下运行命令:
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /date/input t/result
运行结果:
另一个程序的运行结果
word单词:
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。