前言

上一节学习了HDFS HA的原理,本节来做实验

1.机器环境

主机名 IP 角色
hadoop1 172.18.0.11 NN1 ZK RM
hadoop2 172.18.0.12 NN2 ZK RM JOBHISTORY
hadoop3 172.18.0.13 DN ZK ND
hadoop4 172.18.0.14 DN QJM1 ND
hadoop5 172.18.0.15 DN QJM2 ND
hadoop6 172.18.0.16 DN QJM3 ND

目前已经安装了hdfs yarn zookeeper

2.配置HA

2.1 修改hdfs-site.xml

  1. <property>
  2. <name>dfs.nameservices</name>
  3. <value>dockercluster</value>
  4. </property>
  5. <property>
  6. <name>dfs.ha.namenodes.dockercluster</name>
  7. <value>nn1,nn2</value>
  8. </property>
  9. <property>
  10. <name>dfs.namenode.rpc-address.dockercluster.nn1</name>
  11. <value>hadoop1:8020</value>
  12. </property>
  13. <property>
  14. <name>dfs.namenode.rpc-address.dockercluster.nn2</name>
  15. <value>hadoop2:8020</value>
  16. </property>
  17. <property>
  18. <name>dfs.namenode.http-address.dockercluster.nn1</name>
  19. <value>hadoop1:50070</value>
  20. </property>
  21. <property>
  22. <name>dfs.namenode.http-address.dockercluster.nn2</name>
  23. <value>hadoop2:50070</value>
  24. </property>
  25. <property>
  26. <name>dfs.namenode.shared.edits.dir</name>
  27. <value>qjournal://hadoop4:8485;hadoop5;hadoop6:8485/dockercluster</value>
  28. </property>
  29. <property>
  30. <name>dfs.client.failover.proxy.provider.dockercluster</name>
  31. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  32. </property>
  33. <property>
  34. <name>dfs.ha.fencing.methods</name>
  35. <value>sshfence</value>
  36. </property>
  37. <property>
  38. <name>dfs.ha.fencing.ssh.private-key-files</name>
  39. <value>/home/hdfs/.ssh/id_rsa</value>
  40. </property>
  41. <property>
  42. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  43. <value>30000</value>
  44. </property>
  45. <property>
  46. <name>dfs.journalnode.edits.dir</name>
  47. <value>/opt/hadoop/hadoop-2.7.3/JNSdatadir</value>
  48. </property>

2.2 设置core-site.xml

  1. <property>
  2. <name>fs.defaultFS</name>
  3. <value>hdfs://dockercluster</value>
  4. </property>

将以上配置文件分发到各个节点上

3.配置手动HA

3.1 关闭YARN、HDFS

关闭yarn:

  1. resourcemanager上执行:$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
  2. nodemanager上执行:$HADOOP_YARN_HOME/sbin/yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager

关闭hdfs:

  1. namenode上执行:$HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode
  2. datanode执行:$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode

如果配置了ssh免密码登录:

stop-yarn.sh
stop-dfs.sh

3.2 启动HDFS HA

  1. 启动journal节点
    在hadoop4 5 6上执行:

    hadoop-daemon.sh start journalnode

  2. 在standby namenode上执行初始化

  1. [hdfs@hadoop2 hadoop-2.7.3]$ hdfs namenode -bootstrapStandby
  2. .........
  3. 17/04/1918:24:17 INFO ipc.Client:Retrying connect to server: hadoop1/172.18.0.11:8020.Already tried 9 time(s);retry policy isRetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)
  4. 17/04/1918:24:17 FATAL ha.BootstrapStandby:Unable to fetch namespace information from active NN at hadoop1/172.18.0.11:8020:CallFrom hadoop2/172.18.0.12 to hadoop1:8020 failed on connection exception: java.net.ConnectException:Connection refused;For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
  5. 17/04/1918:24:17 INFO util.ExitUtil:Exitingwith status 2
  6. 17/04/1918:24:17 INFO namenode.NameNode: SHUTDOWN_MSG:
  7. /************************************************************
  8. SHUTDOWN_MSG: Shutting down NameNode at hadoop2/172.18.0.12

该语句把原namenode上的元数据目录复制到本节点上的相应目录中
执行这个语句报错了,连接不上hadoop1:8020.看来官网写的不对啊,操。在执行这一步之前要先启动原来的namenode.先向下继续。

  1. 初始化edit log
    在原来的namenode上执行:
  1. [hdfs@hadoop1 namenodedir]$ hdfs namenode -initializeSharedEdits
  2. .....
  3. 17/04/1918:28:24 INFO namenode.EditLogInputStream:Fast-forwarding stream '/opt/hadoop/hadoop-2.7.3/namenodedir/current/edits_0000000000000000001-0000000000000000256' to transaction ID 1
  4. 17/04/1918:28:24 INFO namenode.FSEditLog:Starting log segment at 1
  5. 17/04/1918:28:24 INFO namenode.FSEditLog:Ending log segment 1
  6. 17/04/1918:28:24 INFO namenode.FSEditLog:Number of transactions:256Total time for transactions(ms):63Number of transactions batched inSyncs:0Number of syncs:1SyncTimes(ms):11
  7. 17/04/1918:28:24 INFO util.ExitUtil:Exitingwith status 0
  8. 17/04/1918:28:24 INFO namenode.NameNode: SHUTDOWN_MSG:
  9. /************************************************************
  10. SHUTDOWN_MSG: Shutting down NameNode at hadoop1/172.18.0.11
  11. ************************************************************

这个脚本会把本地的edit log复制到journal节点中去

  1. 启动原来的namenode
  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode
  1. 再次初始化standby namenode
    刚才初始化失败了,再来一次:
  1. =====================================================
  2. Re-format filesystem inStorageDirectory/opt/hadoop/hadoop-2.7.3/namenodedir ?(Y or N) y
  3. 17/04/1920:30:38 INFO common.Storage:Storage directory /opt/hadoop/hadoop-2.7.3/namenodedir has been successfully formatted.
  4. 17/04/1920:30:38 WARN common.Util:Path/opt/hadoop/hadoop-2.7.3/namenodedir should be specified as a URI in configuration files.Please update hdfs configuration.
  5. 17/04/1920:30:38 WARN common.Util:Path/opt/hadoop/hadoop-2.7.3/namenodedir should be specified as a URI in configuration files.Please update hdfs configuration.
  6. 17/04/1920:30:39 INFO namenode.TransferFsImage:Opening connection to http://hadoop1:50070/imagetransfer?getimage=1&txid=256&storageInfo=-63:51947955:0:CID-3adccc69-45b5-4b44-81b6-70ab593cc1ed
  7. 17/04/1920:30:39 INFO namenode.TransferFsImage:ImageTransfer timeout configured to 60000 milliseconds
  8. 17/04/1920:30:39 INFO namenode.TransferFsImage:Transfer took 0.00s at 500.00 KB/s
  9. 17/04/1920:30:39 INFO namenode.TransferFsImage:Downloaded file fsimage.ckpt_0000000000000000256 size 2780 bytes.
  10. 17/04/1920:30:39 INFO util.ExitUtil:Exitingwith status 0
  11. 17/04/1920:30:39 INFO namenode.NameNode: SHUTDOWN_MSG:
  12. /************************************************************
  13. SHUTDOWN_MSG: Shutting down NameNode at hadoop2/172.18.0.12
  14. ************************************************************/

这次就行了!!
记住,选"Re-format filesystem in Storage Directory /opt/hadoop/hadoop-2.7.3/namenodedir ? (Y or N) Y"

7.启动standby namenode

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

这次启动成功了。

所以,正确的顺序是:启动journal->初始化edit log->启动nameode->初始化standby->启动standby

8.检查HA web页面:

看到两个namenode都是standby!
那手动切换一下,设置hadoop1上的namenode为active:

  1. [hdfs@hadoop2 hadoop]$ hdfs haadmin -failover --forceactive nn1 nn2
  2. 17/04/1920:51:59 WARN ha.FailoverController:Serviceisnot ready to become active, but forcing:TheNameNodeisin safemode.The reported blocks 0 needs additional 16 blocks to reach the threshold 0.9990 of total blocks 16.
  3. The number of live datanodes 0 has reached the minimum number 0.Safe mode will be turned off automatically once the thresholds have been reached.
  4. Failoverfrom nn1 to nn2 successful

这样就把nn2切换为active的namenode了

为了验证sshfence的正确性,你可以反复的切几次~

4.配置自动HA

4.1 关闭集群

在两个namenode上:

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop namenode

在所有datanode上:

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs stop datanode

4.2 修改配置文件

1.在hdfs-site.xml中

  1. <property>
  2. <name>dfs.ha.automatic-failover.enabled</name>
  3. <value>true</value>
  4. </property>

2.在core-site.xml中:

  1. <property>
  2. <name>ha.zookeeper.quorum</name>
  3. <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
  4. </property>

将以上文件分发到各个节点。

4.3 启动HA

1.初始化ZKFC
在任意一个namenode上执行:

  1. [hdfs@hadoop1 hadoop]$ hdfs zkfc -formatZK
  2. ...........
  3. 17/04/1921:09:09 INFO zookeeper.ClientCnxn:Socket connection established to hadoop2/172.18.0.12:2181, initiating session
  4. 17/04/1921:09:09 INFO zookeeper.ClientCnxn:Session establishment complete on server hadoop2/172.18.0.12:2181, sessionid =0x25b6d24ae630000, negotiated timeout =5000
  5. 17/04/1921:09:09 INFO ha.ActiveStandbyElector:Session connected.
  6. 17/04/1921:09:10 INFO ha.ActiveStandbyElector:Successfully created /hadoop-ha/dockercluster in ZK.
  7. 17/04/1921:09:10 INFO zookeeper.ZooKeeper:Session:0x25b6d24ae630000 closed
  8. 17/04/1921:09:10 INFO zookeeper.ClientCnxn:EventThread shut down

2.启动ZKFC
在每个namenode上执行:

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --script $HADOOP_HOME/bin/hdfs start zkfc

注:如果配了SSH免密码登录,直接用start-dfs.sh启动集群即可

3.启动namenode

  1. $HADOOP_HOME/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

4.进web查看状态


4.4 测试自动切换

在hadoop1上直接kill n11:

  1. [hdfs@hadoop1 hadoop]$ jps
  2. 5588NameNode
  3. 5501DFSZKFailoverController
  4. 5695Jps
  5. [hdfs@hadoop1 hadoop]$ kill 5501

再看看:

说明自动切换正常!

HADOOP docker(三):HDFS高可用实验的更多相关文章

  1. HADOOP docker(二):HDFS 高可用原理

        1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...

  2. Hadoop框架:HDFS高可用环境配置

    本文源码:GitHub·点这里 || GitEE·点这里 一.HDFS高可用 1.基础描述 在单点或者少数节点故障的情况下,集群还可以正常的提供服务,HDFS高可用机制可以通过配置Active/Sta ...

  3. hadoop 2.7.1 高可用安装部署

    hadoop集群规划 目标:创建2个NameNode,做高可用,一个NameNode挂掉,另一个能够启动:一个运行Yarn,3台DataNode,3台Zookeeper集群,做高可用. 在hadoop ...

  4. hadoop HA+Federation(高可用联邦)搭建配置(二)

    hadoop HA+Federation(高可用联邦)搭建配置(二) 标签(空格分隔): hadoop core-site.xml <?xml version="1.0" e ...

  5. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  6. RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群

    本文使用Docker搭建RabbitMQ集群,然后使用HAProxy做负载均衡,最后使用KeepAlived实现集群高可用,从而搭建起来一个完成了RabbitMQ高可用负载均衡集群.受限于自身条件,本 ...

  7. hadoop HA+Federation(高可用联邦)搭建配置(一)

    hadoop HA+Federation(高可用联邦)搭建配置(一) 标签(空格分隔): 未分类 介绍 hadoop 集群一共有4种部署模式,详见<hadoop 生态圈介绍>. HA联邦模 ...

  8. hadoop+zookeeper集群高可用搭建

                                                                  hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...

  9. HDFS 高可用分布式环境搭建

    HDFS 高可用分布式环境搭建 作者:Grey 原文地址: 博客园:HDFS 高可用分布式环境搭建 CSDN:HDFS 高可用分布式环境搭建 首先,一定要先完成分布式环境搭建 并验证成功 然后在 no ...

随机推荐

  1. iOS之estimatedHeightForRowAtIndexPath避免程序EXC_BAD_ACCESS

    在你的项目中把estimatedHeightForRowAtIndexPath方法写实现以下,返回一个估计高度(随便估,笔者建议还是按照正常思路来写,大概高度是多少就返回多少),这样就不会报EXC_B ...

  2. 如何编写及运行JS

    JS也是一种脚本语言,他可以有两种方式在HTML页面进行引入,一种是外联,一种是内部.       外联JS的写法为: <script src="相对路径"></ ...

  3. Error creating bean with name 'mapper' defined in class path resource [applicationcontext.xml]: Cannot resolve reference to bean 'factory' while setting bean property 'sqlSessionFactory'; nested excep

    Error creating bean with name 'mapper' defined in class path resource [applicationcontext.xml]: Cann ...

  4. Virtualization state: Optimized (version 7.4 installed)

    [Virtualization state: Optimized (version 7.4 installed)] [root@localhost ~]# cd /mnt/ [root@localho ...

  5. iOS 11.2 - 11.3.1 越狱教程

    iOS 11.2 - 11.3.1 越狱教程 一.准备相应的工具 (1) 下载 CydiaImpactor,官网地址是 http://cydiaImpactor.com (2) 下载 Electra, ...

  6. XSS攻击 && CSRF攻击 基础理解

    一个网站,不管多么的帅气,多么的风骚,如果你不安全,那始终都是一个弟弟啊~ 今天又看了下XSS和CSRF攻击的文章,我也想发点什么普及下大家的安全意识,毕竟作为一名拥有伟大梦想的程序员,基本的安全意识 ...

  7. s3c2440系统时钟详解

    一.S3C2440系统时钟体系 S3C2440的时钟控制逻辑可以外接晶振,然后通过内部电路产生时钟源:也可以直接使用内部提供的时钟源,他们通过引脚的设置来选择.时钟逻辑给整个芯片提供了3中时钟:FCL ...

  8. python教程(二)·数据结构初探

    这一节,我来简单讲讲python自带的数据结构. 列表(list) 列表是常用的python数据结构,类似于C语言的数组,用来存储多个元素,与之不同的是,C语言的数组中的元素的类型是相同的,而列表可以 ...

  9. Leecode刷题之旅-C语言/python-206反转链表

    /* * @lc app=leetcode.cn id=206 lang=c * * [206] 反转链表 * * https://leetcode-cn.com/problems/reverse-l ...

  10. c语言实现通讯录管理系统(c课程设计)

    工具:Visual C++6.0 说明: 本系统基于C语言实现班级通讯录管理系统,为大一时学习C语言刚入门所做的课程设计.功能包括增.删.查.改等,非常适合初学者练手.通讯录包括的个人信息有姓名.学号 ...