所谓HA,即高可用(7*24小时不中断服务)
实现高可用最关键的是消除单点故障
hadoop-ha严格来说应该分成各个组件的HA机制
(2)HDFS的HA机制
通过双namenode消除单点故障
双namenode协调工作的要点:
A、元数据管理方式需要改变:
内存中各自保存一份元数据,Edits日志只能有一份,只有Active状态的namenode节点可以做写操作,两个namenode都可以读取 edits,共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
B、需要一个状态管理功能模块,实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在的 namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象 的发生
l 上述过程的图示:
集群部署节点角色的规划(10节点):
#
server01 namenode zkfc > start-dfs.sh (192.168.0.193 H193)
server02 namenode zkfc (192.168.0.194 H194)
#
server03 resourcemanager >start-yarn.sh (192.168.0.195 H195)
server04 resourcemanager (192.168.0.196 H196)
#做运算
server05 datanode nodemanager (192.168.0.196 H197)
server06 datanode nodemanager (192.168.0.196 H198)
server07 datanode nodemanager (192.168.0.196 H199)
#做日志管理
server08 journal node zookeeper (192.168.0.200 H200)
server09 journal node zookeeper (192.168.0.201 H201)
server10 journal node zookeeper (192.168.0.202 H202)
1、环境准备
a/linux系统准备
hostname配置主机名字
vi /etc/sysconfig/network
执行命令 service network restart
验证: ifconfig
hosts映射配置
vi /etc/hosts
ip地址配置
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/resolv.conf#需和ifcfg-eth0中的一样 从启会更新
rm -rf /etc/udev/rules.d/70-persistent-net.rules#删除从新启动机器从新生成mack和ifcfg-eht0一样否则会出问题
shutdown -r now
防火墙关闭
执行命令 service iptables stop
验证: service iptables status
init启动级别修改
Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
vi /etc/inittab#修改为3即可
sudoers加入hadoop用户
添加用户
首先用adduser命令添加一个普通用户,命令如下:
adduser hadoop//添加一个名为tommy的用户
passwd hadoop//修改密码
Changing password for user tommy.
New UNIX password: //在这里输入新密码
Retype new UNIX password: //再次输入新密码
passwd: all authentication tokens updated successfully.
赋予root权限
修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
root ALL=(ALL) ALL
hadoop ALL=(ALL) ALL
修改完毕,现在可以用hadoop帐号登录,然后用命令 su - ,即可获得root权限进行操作
1创建账户,命令 useradd 用户名,如:useradd zhangsan
2修改密码,命令 passwd 用户名,如:passwd zhangsan
3设置允许远程登录,linux一般都通过ssh远程连接,修改/etc/ssh/sshd_config文件
在结尾处添加 AllowUsers 用户名,如 AllowUsers zhangsan
保存,退出
4重启ssh服务,service sshd restart
5测试用新建的用户名远程连接测试。
2.ssh免密登陆配置
ssh-keygen -t rsa (四个回车)
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到要免登陆的机器上
ssh-copy-id 到某太服务器的IP或IP绑定的名称
比如 ssh-copy-id 192.168.0.204或aaa
3.java环境的配置
上传jdk,解压,修改/etc/profile
4./etc/zookeeper集群的部署
分布式服务中指定哪些节点安装了zookeeper就在哪些节点进行配置
server08 journal node zookeeper (192.168.0.200 H200)
server09 journal node zookeeper (192.168.0.201 H201)
server10 journal node zookeeper (192.168.0.202 H202)
上传zookeeper解压
修改zookeeper conf目录下的zoo_xx.cfg名字为zoo.cfg
修改数据目录dataDir=/opt/zookeeper-3.4.6/data
在该文件下加入
server.1=H200:2888:3888
server.2=H201:2888:3888
server.3=H202:2888:3888
创建/opt/zookeeper-3.4.6/data目录
执行 echo 1 > data/myid指定该节点服务器的唯一标示ID
集成几台zk就需要给每台zk创建myid并指定编号 1 2 3一次排下去
5.安装配置hadoop集群
5.1解压
tar -zxvf hadoop-2.4.1.tar.gz -C /home/hadoop2
5.2配置HDFS(hadoop2.0所有的配置文件都在hadoop目录中的/etc/hadoop下)
#将hadoop添加到环境变量中
vim /etc/profile
export JAVA_HOME=/opt/jdk1.7.0_55
export HADOOP_HOME=/opt/hadoop-2.4.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /opt/hadoop-2.4.1/etc/hadoop
5.2.1修改hadoo-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_55
5.2.2修改core-site.xml
<configuration> <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1/</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-2.4.1/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>H200:2181,H201:2181,H202:2181</value> </property> </configuration>
解释这种用法但不在这次集群范围内
=======================================================================================================================
<property> <name>dfs.nameservices</name> <value>ns1</value> </property> 或写成 <property> <name>dfs.nameservices</name> <value>ns1,ns2</value> </property>
这里配置的值可以是单个或多个每一值管理了一组namenode节点,每一组nameNode存储的元数据不同但是dataNode存储的数据则是ns1和ns2共同使用, 比如你通过ns1存储的文件 通过ns2则是找不到的.如下图
=======================================================================================================================
5.2.3修改hdfs-site.xml
<configuration> <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的 fs.defaultFS属性保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>H193:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>H193:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>H194:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>H194:50070</value> </property> <!-- 指定NameNode的edit元数据在JournalNode上的存放位置 /ns1表示:ns1管理的一组nameNode共享在qjournal指定的目录下--> <property> <!--ns1下管理的一组namenode节点共享的Edit放在qjournal哪里--> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://H200:8485;H201:8485;H202:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放edit数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/hadoop2/journaldata</value> </property> <!-- 配置zkfc:开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <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> <!--按说这是里/home/hadoop没错但是我的用户权限设置了但是还是没有权限所以我使用root用户--> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
5.2.4修改mapred-site.xml
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
5.2.5修改yarn-site.xml
<configuration> <!-- 开启RM高可用 服务器死掉是否自动切换到另一台 --> <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> <!-- 分别指定rm1和rm2的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>H195</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>H196</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>H200:2181,H201:2181,H202:2181</value> </property> <!--让nodeManager提供mapreduce的shuffle服务--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
5.2.6修改slaves(slaves是指定子节点的位置,因为要在H193上启动HDFS、在H195启动yarn,所以H193上的slaves文件指定的是datanode的位置,H195上的slaves文件指定的是nodemanager的位置)
H197
H198
H199
5.2.7配置免密码登陆
#首先要配置H193到H193---到H199的免密码登陆
#在H193上生产一对钥匙
ssh-keygen -t rsa
#将公钥拷贝到其他节点,包括自己
ssh-coyp-id H193到9
#配置H195到H199的免密码登陆
#在H195上生产一对钥匙
ssh-keygen -t rsa
将公钥拷贝到其他节点
ssh-coyp-id H195到H199
#注意:两个namenode之间要配置ssh免密码登陆,别忘了配置H194到H193的免登陆
在H194上生产一对钥匙
ssh-keygen -t rsa
ssh-coyp-id -i H193
5.3将配置好的hadoop拷贝到其他节点
###注意:严格按照下面的步骤
2.5启动zookeeper集群(分别在H200、H201、H202上启动zk)cd /opt/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看状态:一个leader,两个follower
./zkServer.sh status
2.6手动启动journalnode(分别在在H200、H201、H202上执行)
sbin/hadoop-daemon.sh start journalnode
#运行jps命令检验,H200、H201、H202上多了JournalNode进程
2.7格式化HDFS
#在H193上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件curent,这里我配置的是/weekend/hadoop-2.4.1/tmp,然后将/weekend/hadoop-2.4.1/tmp拷贝到H194的/weekend/hadoop-2.4.1/下。
scp -r tmp/ weekend02:/home/hadoop/app/hadoop-2.4.1/
##也可以这样,建议hdfs namenode -bootstrapStandby
2.8格式化ZKFC(在H193上执行即可) ZKFC让想知道两个namenode节点的状态和感知 是需要依赖于zk
所以zkfc需要向zk中注册一个根节点
/opt/hadoop2/bin 目录下
执行
hdfs zkfc -formatZK
格式化是 hdfs zkfc -formatZK 会在
./clCi.ch start 启动
ls /查看 格式化后建立的节点,该节点是zk会用到这个节点的父节点
zk里面将来要用到的父节点建好 该节点记录主服务器的IP和名称
2.9启动HDFS(在H193上执行)
sbin/start-dfs.sh
出现代表成功
H194: namenode running as process 1597. Stop it first. H193: starting namenode, logging to /opt/hadoop2/logs/hadoop-hadoop-namenode-H193.out H197: datanode running as process 1521. Stop it first. H198: datanode running as process 1521. Stop it first. H199: datanode running as process 1528. Stop it first. Starting journal nodes [H200 H201 H202] H202: journalnode running as process 1604. Stop it first. H201: journalnode running as process 1590. Stop it first. H200: journalnode running as process 1772. Stop it first. Starting ZK Failover Controllers on NN hosts [H193 H194] H193: starting zkfc, logging to /opt/hadoop2/logs/hadoop-hadoop-zkfc-H193.out H194: starting zkfc, logging to /opt/hadoop2/logs/hadoop-hadoop-zkfc-H194.out
可通过jps查看分布式服务器上启动了哪些分布式的进程
2.10启动YARN(#####注意#####:是在weekend03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
sbin/start-yarn.sh
需要手动启动分布式服务器上的start-yarn.sh 分别需要在H195 H196上手动启动.
注意:启动一台后 另一台使用
sbin/yarn-daemon.sh start resourcemanager
这样就可以了
启动分别启动本地resourceManger节点和关联的nodeManager节点 成功显示
starting yarn daemons starting resourcemanager, logging to /opt/hadoop2/logs/yarn-hadoop-resourcemanager-H195.out H198: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H198.out H197: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H197.out H199: starting nodemanager, logging to /opt/hadoop2/logs/yarn-hadoop-nodemanager-H199.out
到此,hadoop-2.4.1配置完毕,可以统计浏览器访问:
http://192.168.0.193:50070
NameNode 'H193:9000' (active)
http://192.168.0.194:50070
NameNode H194:9000' (standby)
完成...
测试集群
测试1:将从服务器kill掉 查看是否会实现主从切换
在194服务上执行kill -9 xx
然后刷新页面
kill掉后从新启动执行
sbin/hadoop-daemon.sh start namenode
原理:
2985 NameNode
3461 Jps
3293 DFSZKFailoverController
当kill掉NameNode节点的时候
DFSZKFailoverController监控到状态会自动切换
http://192.168.0.193:50070/
http://192.168.0.194:50070/
测试2:直接停掉服务器查看是否会主从切换从新启动
sbin/opt/hadoop2/hadoop-daemonsh start zkfc sbin/opt/hadoop2/hadoop-daemonsh start namenode
测试3:在上传文件过程中 kill掉active 查看文件是否能上传成功
测试集群工作状态的一些指令 :
bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息
bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态
sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程
./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程
本文出自 “为了手指那个方向” 博客,谢绝转载!