Hadoop HA基础知识
HDFS存在的问题
NN单点故障,难以应用于在线场景 HA NN压力过大,且内存受限,影响扩展 F(联邦机制)
原理图
搭建Hadoop HA环境
实现步骤
官网配置页面
实现逻辑名称到物理服务器的映射 hdfs-site.xml (HA有两个namenode,一个是active,一个是standby,需要指定具体的物理节点,rpc和http地址做配置端口) core-site.xml 指定hdfs访问的入口 在1.x中配置namenode是hdfs://node01:9000 进程通信的端口是9000 在2.x中配置namenode是hdfs://mycluster 进程通信的端口是8020 配置journalnode集群(同步元数据) , 配置故障转移实现的代理类和实现方式 有两种方式: ①通过免密钥的方式 ②通过编写脚本的方式 开启自动化,启动ZKFC进程 配置zookeeper集群,指定namenode入口 配置细节 ①先启动journalnode ②格式化,它依赖于namenode,格式化之后需要启动namenode ③另外一台namenode需要做同步 hdfs namenode -bootstrapStandby Configuring automatic failover设置自动化,配置zookeeper集群
具体配置
开启四台虚拟机,并用secureCRT进行连接。通过交互窗口同步时间,查看每个服务器当前执行的进程:jps 停掉完全分布式方式:stop-dfs.sh再用jps查看 实现NN节点与其他节点间免密钥: 1)在node02中,cd .ssh/ 2)先创建一个公钥:ssh-keygen -t rsa,然后一直回车,产生两个文件id_rsa(私 钥),id_rsa.pub(公钥) 3)先实现对自身node02的免密钥,将公钥文件追加到authorized_keys中:cat id_rsa.pub >> authorized_keys 4)进行测试:ssh localhost,测试成功则退出exit 5)将node02公钥发送给node01: scp id_rsa.pub node01:/root/.ssh/node02.pub并查看node02是否有此文件 若有,则将该文件在node01下:cat node02.pub >> authorized_keys 6)查看authorized_keys是否添加上,再查看node02能否免密钥登录到node01, 一定记得测试成功后退出 保存副本,以便于恢复 cd /home/opt/hpe/hadoop-2.7.5/etc/ ls cp -r hadoop hadoop-full cd hadoop vi hdfs-site.xml 先对一台服务器进行配置,在hdfs-site.xml中删除secondary所在的4行(4dd),另外添加以下代码
< 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> node01:8020</ value>
</ property>
< property>
< name> dfs.namenode.rpc-address.mycluster.nn2</ name>
< value> node02:8020</ value>
</ property>
< property>
< name> dfs.namenode.http-address.mycluster.nn1</ name>
< value> node01:50070</ value>
</ property>
< property>
< name> dfs.namenode.http-address.mycluster.nn2</ name>
< value> node02:50070</ value>
</ property>
< property>
< name> dfs.namenode.shared.edits.dir</ name>
< value> qjournal://node01:8485;node02:8485;node03:8485/mycluster</ value>
</ property>
< property>
< name> dfs.journalnode.edits.dir</ name>
< value> /var/hpe/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_rsa</ value>
</ property>
< property>
< name> dfs.ha.automatic-failover.enabled</ name>
< value> true</ value>
</ property>
配置core-site.xml,将hadoop.tmp.dir的value改成/var/hpe/hadoop/ha,另外利用下方配置修改或覆盖原文件
< property>
< name> fs.defaultFS</ name>
< value> hdfs://mycluster</ value>
</ property>
< property>
< name> ha.zookeeper.quorum</ name>
< value> node02:2181,node03:2181,node04:2181</ value>
</ property>
剩余的node02~node04相应的配置文件要同步 1)在node02中操作如下 cd cd .ssh cd $ HADDOP_HOME(部署目录) cd etc/(找到了hadoop目录) 2)在node01中分发刚才修改的两个xxx-site.xml文件给剩下node02~node04 scp hdfs-site.xml core-site.xml node02:’pwd‘ 搭建Zookeeper集群 1)在node02家目录下安装上传文件的命令:yum install lrzsz -y,找到zookeeper-3.4.6.tar.gz上传 2)解压(-C可以指定解压到的目录):tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/hpe/ 3)cd /opt/hpe/ 4)环境变量的配置:vi /etc/profile export ZOOKEEPER_HOME=/opt/hpe/zookeeper-3.4.6新增这一行 在PATH后追加:$ZOOKEEPER_HOME/bin 5)刷新环境变量:source /etc/profile或者. /etc/profile。然后就可以使用zk的命令了 相关配置 1)在node02中找到/opt/hpe/zookeeper-3.4.6/conf目录,将zoo_sample.cfg拷贝一份 cp zoo_sample.cfg zoo.cfg vi zoo.cfg然后更改一行dataDir=/var/hpe/zk;在最后一行增加4行: server.1=192.168.81.12:2888:3888 server.2=192.168.81.13:2888:3888 server.3=192.168.81.14:2888:3888 2)cd /var/hpe/ 3)mkdir zk 4)cd zk/ 5)vi myid在里面输入1(这是zookeeper服务器的编号1) 6)将node02中zookeeper的配置分发给node03~node04 cd /opt/hpe scp -r zookeeper-3.4.6 node03:pwd scp -r zookeeper-3.4.6 node04:pwd 7)在node03上检查一下:cd /opt/hpe 8)在node03上创建/var/hpe/zk/myid里面写上2;同理node04的相同目录文件下写上3 9)将node02中的配置文件分发给03及04 scp /etc/profile node03:/etc/ scp /etc/profile node04:/etc/ 10)在03及04中查看文件并刷新配置文件 启动zookeeper 1)先启动node03:zkServer.sh start;查看是leader还是follwer:zkServer.sh status 2)再启动node02,再启动node04 启动JNN 1)在node01~node03上:hadoop-daemon.sh start journalnode再jps 2)node01中格式化:hdfs namenode -format并启动NN:hadoop-daemon.sh start namenode 3)将node01上NN的信息同步到node02中,在node02中:hdfs namenode -bootstrapStandby 实现ZKFC 1)Node01中格式化zookeeper:hdfs zkfc -formatZK 2)启动ZKFC,在node01中:start-dfs.sh 查看active的NN与standby的NN之间的转化 1)停掉node01中的NN:hadoop-daemon.sh stop namenode查看 2)重新启动node01中的NN:hadoop-daemon.sh start namenode查看 以后停掉或开启dfs相关进程(集群开启之前要先启动node02~node04:zookeeper) stop-dfs.sh zkServer.sh stop zkServer.sh start start-dfs.sh 注