在1.x版本中,SecondaryNameNode将fsimage跟edits进行合并,生成新的fsimage文件用http post传回NameNode节点。SecondaryNameNode不能做NameNode的备份。
在hadoop 2.x版本中才引入StandbyNameNode,从journalNode上拷贝的。StandbyNameNode是可以做namenode的备份。
Hadoop2的高可用并取代SecondaryNamenode
在hadoop2实际生产环境中,为什么还需要SecondeNamenode
secondary namenode和namenode的区别
描述:hadoop HA 集群的搭建依赖于 zookeeper,所以选取三台当做 zookeeper 集群我总共准备了四台主机,分别是 hadoop02,hadoop03,hadoop04,hadoop05其中 hadoop02 和 hadoop03 做 namenode 的主备切换,hadoop04 和 hadoop05 做resourcemanager 的主备切换
1、 修改主机名
2、 修改 IP 地址
3、 添加主机名和 IP 映射
4、 添加普通用户 hadoop 用户并配置 sudoer 权限
5、 设置系统启动级别
6、 关闭防火墙/关闭 Selinux
7、 安装 JDK
两种准备方式:
1、 每个节点都单独设置,这样比较麻烦。线上环境可以编写脚本实现
2、 虚拟机环境可是在做完以上 7 步之后,就进行克隆
3、 然后接着再给你的集群配置 SSH 免密登陆和搭建时间同步服务
8、 配置 SSH 免密登录
9、 同步服务器时间
1、安装 Zookeeper 集群(略)
2、 安装 hadoop 集群
core-site.xml :
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://myha01/value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/home/hadoop/data1/hadoopdata/value>
property>
<property>
<name>ha.zookeeper.quorumname>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181value>
property>
<property>
<name>ha.zookeeper.session-timeout.msname>
<value>1000value>
<description>msdescription>
property>
configuration>
hdfs-site.xml:
<configuration>
<property>
<name>dfs.replicationname>
<value>2value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>/home/hadoop/data1/hadoopdata/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>/home/hadoop/data1/hadoopdata/dfs/datavalue>
property>
<property>
<name>dfs.webhdfs.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.nameservicesname>
<value>myha01value>
property>
<property>
<name>dfs.ha.namenodes.myha01name>
<value>nn1,nn2value>
property>
<property>
<name>dfs.namenode.rpc-address.myha01.nn1name>
<value>hadoop01:9000value>
property>
<property>
<name>dfs.namenode.http-address.myha01.nn1name>
<value>hadoop01:50070value>
property>
<property>
<name>dfs.namenode.rpc-address.myha01.nn2name>
<value>hadoop02:9000value>
property>
<property>
<name>dfs.namenode.http-address.myha01.nn2name>
<value>hadoop02:50070value>
property>
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://hadoop02:8485;hadoop03:8485;hadoop04:8485/myha01value>
property>
<property>
<name>dfs.journalnode.edits.dirname>
<value>/home/hadoop/data1/journaldatavalue>
property>
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
<property>
<name>dfs.client.failover.proxy.provider.myha01name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
<property>
<name>dfs.ha.fencing.methodsname>
<value>
sshfence
shell(/bin/true)
value>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/home/hadoop/.ssh/id_rsavalue>
property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeoutname>
<value>30000value>
property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.msname>
<value>60000value>
property>
configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>hadoop01:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>hadoop01:19888value>
property>
configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>yrcvalue>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>hadoop03value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>hadoop04value>
property>
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181,hadoop05:2181value>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>86400value>
property>
<property>
<name>yarn.resourcemanager.recovery.enabledname>
<value>truevalue>
property>
<property>
<name>yarn.resourcemanager.store.classname>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue>
property>
configuration>
hadoop-env.sh: 修改JAVA_HOME
slaves文件:修改映射
如果DFSZKFailoverController自动死掉,则有可能是因为以下配置问题:
错误配置,会导致DFSZKFailoverController死掉:
正确写法,注意sshfence不能换行:
scp -r hadoop-2.7.5 hadoop@hadoop02:$PWD
scp -r hadoop-2.7.5 hadoop@hadoop03:$PWD
scp -r hadoop-2.7.5 hadoop@hadoop04:$PWD
scp -r hadoop-2.7.5 hadoop@hadoop05:$PWD
vi ~/.bashrc
添加两行:
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5
export PATH= PATH: P A T H : HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存退出
1、 先启动 zookeeper 集群
启动:zkServer.sh start
检查启动是否正常:zkServer.sh status
2、 分别在每个 zookeeper(也就是规划的三个 journalnode 节点,不一定跟 zookeeper
节点一样)节点上启动 journalnode 进程
[hadoop@hadoop01 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop02 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop03 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop04 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop05 ~]$ hadoop-daemon.sh start journalnode
然后用 jps 命令查看是否各个 datanode 节点上都启动了 journalnode 进程
如果报错,根据错误提示改进
3、在第一个 namenode 上执行格式化操作
然后会在 core-site.xml 中配置的临时目录中生成一些集群的信息
把他拷贝的第二个 namenode 的相同目录下
<name>hadoop.tmp.dirname>
<value>/home/hadoop/data/hadoopdata/value>
这个目录下,千万记住:两个 namenode 节点该目录中的数据结构是一致的
[hadoop@hadoop02 ~]$ scp -r ~/data/hadoopdata/ hadoop03:~/data
或者也可以在另一个 namenode 上执行:hadoop namenode -bootstrapStandby
[hadoop@hadoop02 ~]$ hadoop namenode -format
4、格式化 ZKFC
[hadoop@hadoop02 ~]$ hdfs zkfc -formatZK
在第一台机器上即可
5、启动 HDFS
[hadoop@hadoop02 ~]$ start-dfs.sh
查看各节点进程是否启动正常:依次为 2345 四台机器的进程
访问 web 页面 http://hadoop01:50070
访问 web 页面 http://hadoop02:50070
[hadoop@hadoop04 ~]$ start-yarn.sh
在主备 resourcemanager 中随便选择一台进行启动,正常启动之后,检查各节点的进程:
若备用节点的 resourcemanager 没有启动起来,则手动启动起来
[hadoop@hadoop04 ~]$ yarn-daemon.sh start resourcemanager
访问页面:http://hadoop03:8088
访问页面:http://hadoop04:8088 自动跳转至hadoop03机器
HDFS:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
YARN:
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
[hadoop@hadoop01 ~]$ mr-jobhistory-daemon.sh start historyserver
按照配置文件配置的历史服务器的 web 访问地址去访问:
http://hadoop01:19888
1、干掉 active namenode, 看看集群有什么变化
干掉active namenode,standby namenode瞬间转为active状态;重新启动刚才那台干掉的节点后,该节点变为standby 状态。
2、在上传文件的时候干掉 active namenode, 看看有什么变化
会报错,但是可以上传成功。
3、干掉 active resourcemanager, 看看集群有什么变化
hadoop03上的yarn节点就不能访问,hadoop05上的yarn节点可以正常访问。
4、在执行任务的时候干掉 active resourcemanager,看看集群
执行wordcount程序,执行的时候,在hadoop03节点上杀死ResourceManager,最终能够成功执行。