HDFS深入及Hadoop HA
一、复习
-
基础课程
-
大数据本质:就是利用一系列大数据软件工具开发程序对数据进行处理,从数据中提取相关价值信息
- 大数据软件:Hadoop、Zookeeper、Hive、Spark、Flink
- 类似于:Excel、Word
- 数据:种类多,数据量大(传统的方式不行)
- 处理:开发程序(java还是很重要的)
- 大数据软件:Hadoop、Zookeeper、Hive、Spark、Flink
-
Java
-
为什么?
- 大数据的大部分软件都是Java源代码开发的
- 学习、维护
- 使用Java语言开发数据处理程序
- 大数据的大部分软件都是Java源代码开发的
-
关键
-
常用工具类:字符串处理、日期处理
-
字符串:substring
数据:http://www.itcast.cn/index.jsp?username=heima | 来源:www.itcast.cn
-
日期:转换
- 标准日期:yyyy-MM-dd HH:mm:ss
- 用于标记时间
- 时间戳:1584738947834
- 用于计算
- 数据:18/Aug/2020:12:30:45
- SimpleDateFormat
- 标准日期:yyyy-MM-dd HH:mm:ss
-
-
多线程、IO流、JVM【内存管理,垃圾回收】、设计模型
-
-
-
MySQL
-
为什么?
- 掌握一门RDBMS:MySQL 关系型数据库
- SQL:以后工作中60%开发任务
-
关键
-
SQL语法
select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7f
- 每个位置怎么填,代表的含义
- 每个位置执行顺序
-
数据库概念:视图、触发器、存储过程、binlog(记录maysql中的所有操作,可以对mysql数据进行回滚)与namenode中的edits相似
-
-
-
Linux
- 为什么?
- 用于部署大数据平台的,安装大数据············ 软件
- 关键
- 命令 :文件管理命令
- 为什么?
-
-
入门课程
- 分布式
- 本质:将多台机器的资源从逻辑上合并为一个整体,通过分布式程序对外提供统一的服务
- 功能
- 解决单机资源不足
- 通过高并发提高性能
- 思想:分而治之
- 流程
- 分:将一个大任务拆分成若干个小任务
- 执行:将每个小任务分配给集群中的每个节点来并行执行
- 合:将所有小任务的结果合并为一个总的结果
- 架构
- 普通的主从架构
- 主节点:管理
- 从节点:执行
- 特殊架构:公平架构
- 每个节点的功能几乎一致
- ZK、Kafka、ES
- 普通的主从架构
- 问题
- 多台机器构成分布式,多台机器之间如何实现数据的一致性
- 分布式
-
主节点存在单点故障,分布式框架可以启动多个主节点,多个主节点只能有一个工作的,如何决定?
-
Zookeeper
-
功能
- 存储关键性数据,保证分布式的数据一致性
- 用于辅助选举
- 临时节点:如果客户端的连接断开,临时节点会自动被删除
- 两个NameNode:A和B
- A和B到ZK中创建同一个临时节点
- 谁创建成功,谁就是Active,例如A创建成功
- B创建失败了,B就是Standby状态,B会监听A创建的临时节点
- 如果A故障,断开连接,临时节点自动删除,B会重新创建这个临时节点,B成为Active
-
主从
- Leader
- Follower
-
公平节点
-
每台ZK中存储的数据是一致的
- 如何保证zk自己的数据一致性
- 只有Leader能接受些的请求,Leader会将写入广播给所有节点
-
如果Leader故障,Follower是可以被选举成为leader
-
每台ZK都可以接受客户端请求
-
-
Hadoop
-
HDFS:分布式文件系统
- 功能:实现大数据文件的存储管理
- 应用场景
- 离线:以数据产生时间为单位来实现数据处理:每天处理一次,T+1,今天处理昨天的数据
- 一般的时效性至少是分钟以上级别
- 实时:以数据为单位来实现数据处理,每产生一条数据就处理一条数据,时效性在ms级别
- 一次写入和多次读取
- 不适合于实时、频繁修改或者删除场景
- 离线:以数据产生时间为单位来实现数据处理:每天处理一次,T+1,今天处理昨天的数据
- NameNode
- 端口
- rpc:8020
- http:50070
- 管理集群:从节点
- 心跳机制、汇报块机制
- 接客
- 维护元数据:内存
- 端口
- DataNode
- 负责管理自己所在机器的文件系统,接受主节点的任务分配,实现数据的存储读写
- 机制
- 分块机制:规则:128M
- 用于实现HDFS分布式
- 副本机制:默认3份
- 用于保证数据的安全
- 分块机制:规则:128M
- 类似:分布式存储
- Kafka:实时大数据临时存储
- Hbase:实时随机大数据永久存储
-
ES:构建大数据的全文索引
-
-
-
Redis:完全基于内存的分布式存储
-
分布式计算
-
条件
-
程序必须是分布式程序
- 需求:1+……+9
- 拆分
- Task1:1+2+3
- Task2:4+5+6
- Task3:7+8+9
- Task4:Task1 + Task2 +Task3
-
必须要有一个分布式的运行环境:提供分布式的资源,让程序分布式运行
- node1:8Core:8GB
- task1
- node2:8Core:8GB
- task2
- node3:8Core:8GB
- task3
- task4
- node1:8Core:8GB
-
-
MapReduce:分布式编程模型
-
这是一套分布式编程API,通过这个API写出的代码,就是一个分布式的程序
-
YARN:分布式运行环境,用于提供分布式的资源,资源容器
- 将MapReduce开发的分布式程序放在YARN中运行,实现分布式计算
- ResourceManager
- rpc:8032
- http:8088
-
-
分布式管理有两个主要的矛盾:
1怎么保证数据的安全
2分布式管理怎么实现管理的
二、课程目标
-
HDFS Java API
- 创建HDFS连接
- 删除和创建
-
HDFS额外功能
- 回收站
- 跨集群拷贝
-
Hadoop HA
-
两个NN和两个RM
-
Zookeeper
-
三、HDFS Java API
1、应用场景
- 客户端
- hdfs:命令
- 作为HDFS客户端
- 一般用于实现文件的上传或者管理
- Java API:用于读写
- 读:用于读取HDFS文件通过分布式计算框架进行分布式处理
- 写:用于将处理好的结果进行保存
- hdfs:命令
- 掌握
- 如何构建一个HDFS连接
- 如何删除和创建HDFS文件或者目录
- 因为分布式计算框架读写HDFS将API已经封装了,只要填写参数就可以了
2、创建模块
3、引入依赖
- 参考附录一
- 将log4j.properties配置文件放入resource目录中,用于观察日志
4、配置Windows运行环境
-
因为Windows上没有安装Hadoop,在Windows的IDEA中运行Hadoop的代码,会报错
-
step1:将提供的Hadoop目录放入一个没有中文的路径下
例如:D:\hadoop\hadoop2.7.5
-
step2:配置Hadoop的环境变量
-
添加一个环境变量
HADOOP_HOME=D:\hadoop\hadoop2.7.5
-
将Hadoop的bin目录添加到path中
path=之前的path后面加上;D:\hadoop\hadoop2.7.5\bin
-
-
step3:重启IDEA,如果不行,就重启笔记本
-
step4:如果step3执行完以后,运行程序代码依旧报错,请执行这一步
- 将hadoop的bin目录下hadoop.dll这个文件放入Windows的System32目录
- 重启笔记本,重新运行代码
-
step5:如果step4执行完成以后,还不可以,直接联系老师
5、获取连接及集群信息
//用于获取一个HDFS连接对象
public FileSystem getHDFS() throws Exception {
//构建一个Configuration对象
/**
* 每个Hadoop程序都需要一个COnfiguration对象,用于管理当前程序的所有属性配置
* step1:先加载所有*-default.xml,所有默认配置
* step2:加载所有*-site.xml,加载用于自定义配置,覆盖默认配置
* 配置HDFS的地址
* 方式一:将core-site.xml放入resource目录中
* 方式二:手动设置某个属性的值
*/
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.88.221:8020");
//构建一个HDFS连接对象
FileSystem hdfs = FileSystem.get(conf);
// FileSystem hdfs = FileSystem.get(new URI("hdfs://192.168.88.221:8020"), conf);
// FileSystem hdfs = FileSystem.get(new URI("hdfs://192.168.88.221:8020"), conf, "root");
// System.out.println(hdfs);
return hdfs;
}
@Test
public void printClusterInfo() throws Exception {
//获取连接对象,集群管理需要强转为分布式文件系统对象
DistributedFileSystem hdfs = (DistributedFileSystem) getHDFS();
//获取所有DN的信息
DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
//迭代
for (DatanodeInfo dataNodeStat : dataNodeStats) {
//打印每个DN的信息
System.out.println(dataNodeStat.getDatanodeReport());
}
}
6、创建目录
@Test
public void mkdirHDFS() throws Exception {
FileSystem hdfs = getHDFS();
//构建我们要创建的路径
Path path = new Path("/windows");
//判断目录是否存在
if(hdfs.exists(path)){
//存在就删除:第二个参数表示是否递归
hdfs.delete(path,true);
}
//创建目录
hdfs.mkdirs(path);
hdfs.close();
}
7、列举
@Test
public void listHDFS() throws Exception {
FileSystem hdfs = getHDFS();
//列举方式一
Path path = new Path("/");
//列举目录下的所有文件或者目录
FileStatus[] fileStatuses = hdfs.listStatus(path);
//迭代
// for (FileStatus fileStatus : fileStatuses) {
// //判断是否是一个目录
// if(hdfs.isDirectory(fileStatus.getPath())){
// System.out.println(fileStatus.getPath().getName()+"\t"+"this is a dir");
// }else{
// System.out.println(fileStatus.getPath().getName()+"\t"+"this is a file");
// }
// }
//方式二:只列举文件
RemoteIterator<LocatedFileStatus> listFiles = hdfs.listFiles(path, false);
//迭代
while (listFiles.hasNext()) {
//取出当前条
LocatedFileStatus next = listFiles.next();
//输出当前条
System.out.println(next.getPath());
}
}
8、上传
@Test
public void uploadHDFS() throws Exception {
FileSystem hdfs = getHDFS();
//构建源文件
Path inputPath = new Path("file:///E:\\output\\test.txt");
//构建目标路径
Path outputPath = new Path("/windows");
//调用上传方法
hdfs.copyFromLocalFile(inputPath,outputPath);
}
9、下载
@Test
public void downLoadHDFS() throws Exception {
FileSystem hdfs = getHDFS();
//构建源文件
Path inputPath = new Path("/windows/test.txt");
//构建目标路径
Path outputPath = new Path("file:///E:\\output\\test");
//调用下载方法
hdfs.copyToLocalFile(inputPath,outputPath);
}
10、合并存储
@Test
public void mergeFile() throws Exception {
//先构建本地文件系统对象
LocalFileSystem local = FileSystem.getLocal(new Configuration());
//获取HDFS对象
FileSystem hdfs = getHDFS();
//构建输出流
FSDataOutputStream outputStream = hdfs.create(new Path("/windows/merge.txt"));
//构建输入流
FileStatus[] fileStatuses = local.listStatus(new Path("E:\\output"));
for (FileStatus fileStatus : fileStatuses) {
//打开文件构建输入流
FSDataInputStream input = local.open(fileStatus.getPath());
//赋值给输出流
IOUtils.copyBytes(input,outputStream,4096);
//关闭输入流
input.close();
}
//关闭输出流
outputStream.close();
local.close();
hdfs.close();
}
四、HDFS 其他功能
1、Distcp
-
cp:用于实现单个文件系统内的拷贝
-
scp:用于实现两个同类的Linux系统间的拷贝
-
distcp:用于两个HDFS系统之间的数据拷贝
hadoop distcp source target hadoop distcp hdfs://cluster1:8020/test hdfs://cluster2:8020/test
2、Archive
-
HDFS不适合存储小文件,原因是小文件会占用大量的元数据,导致元数据检索性能较差
-
解决
- 方案一:将多个小文件合并为一个大文件,存储在HDFS上
- 物理上
- 前提:对这些小文件的处理的逻辑是一致的
- 方案二:将多个小文件存储时,在逻辑上合并,构建一条元数据
- file1
- file2
- file3
- ||
- file => file1,file2,file3
- 方案一:将多个小文件合并为一个大文件,存储在HDFS上
-
功能:将多个小文件从逻辑上合并,减少元数据存储
-
.har
-
创建归档文件
- 先启动yarn
hdfs dfs -mkdir -p /hartest/test1 hadoop archive -archiveName wc.har -p /wordcount /hartest/test1
-
查看归档文件
hdfs dfs -ls -R /hartest/test1/wc.har hdfs dfs -ls -R har:///hartest/test1/wc.har hdfs dfs -cat /hartest/test1/wc.har/part-0
3、Snapshot
-
允许构建快照
hdfs dfsadmin -allowSnapshot /jdk
-
创建快照
hdfs dfs -createSnapshot /jdk
-
查看快照
/jdk/.snapshot/
-
对比、恢复快照
hdfs dfs -mv /testfile.txt /jdk/ hdfs snapshotDiff /jdk . .snapshot/s20201029-154836.113 hdfs dfs -cp /jdk/.snapshot/s20201015-161451.498/* /jdk/
-
删除快照
hdfs dfs -deleteSnapshot /jdk s20201015-161451.498
-
禁止构建快照
hdfs dfsadmin -disallowSnapshot /jdk
4、HDFS Trash
-
配置回收站的属性
<property> <name>fs.trash.interval</name> <value>10080</value> </property>
-
表示隔多长时间清理一次回收站,单位为分钟
-
跳过回收站
hdfs dfs -rm -r -skipTrash /jdk
-
恢复数据:直接从回收站的目录中移动回来即可
-
五、Hadoop的HA
1、主从架构问题
- 主:NameNode,ResourceManager
- 负责管理集群集群:接受所有DN的心跳和汇报机制
- 接客
- 负责维护元数据
- 从:DataNode,NodeManager
- 负责执行主节点分配的任务
- 问题
- 如果从节点故障,集群不受影响
- 如果主从节点故障,集群出现单点故障问题,整个集群将不可用
- 解决:启动多个主节点
- 两个NameNode
- 两个ResourceManager
- 解决:启动多个主节点
- 问题:如何实现两个NameNode的协同工作
- 状态
- Active:工作
- Standby:备份
- 实现
- 通过Zookeeper
- 状态
- 解决
- Hadoop中提供了HA机制
- 允许提供两个主节点,来实现高可用,通过zookeeper来实现Active和Standby的选举和切换
- 一个NameNode是工作状态的
- 一个NameNode是备份状态的
- Hadoop中提供了Federation联盟机制
- 允许启动两个NameNode,都是工作状态
- 即使在工作中使用:需要搭配HA一起使用
- 本质:构建两套HDFS集群
- Hadoop中提供了HA机制
2、Hadoop中HA实现
- 以NameNode为例:两个NameNode
- 问题1:两个NameNode,谁是Active,谁是Standby
- 利用ZK实现辅助选举
- ZKFC:每一个NameNode就会有一个ZKFC进程
- 负责构建NameNode与ZK之间的联系
- 每个ZKFC负责监听NameNode,并且与ZK构建连接
- 创建临时节点
- 监听临时节点
- 状态的切换
- 问题2:两个NameNode,DataNode会向哪个NameNode发送心跳和汇报块?
- 所有的DataNode会向所有的NameNode进行注册,发送心跳和汇报块
- 只有Active的NameNode会发送指令
- 问题3:两个NameNode,其中一个是Active的,客户端只能将请求给Active的NameNode,客户端如何知道谁是Active的?
- 客户端会通过配置文件或者所有NameNode的地址,挨个请求
- 工作中:有的公司会自己开发一个类,实现让客户端从zookeeper中获取Active的地址,然后进行请求
- 问题4:如何保证两个NameNode的内存元数据是一致的,只有这样,Active宕机或者故障,Standby才能完整的接替原来的Active?
- 实现思路:共享Active的NameNode的edits文件
- Active的NameNode将edits进行记录
- Standby的NameNode读取edits对自己元数据进行修改
- 实现:实现分布式数据共享
- 能不能用ZK解决?
- 不能,zk不能存储大量数据
- 最终实现:Hadoop中模仿ZK实现了一种Journalnode机制
- 类似于Zookeeper的公平节点
- 分布式架构:每台机器的journalnode是一样的
- 实现思路:共享Active的NameNode的edits文件
附录一:Hadoop Maven依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
附录二:HadoopHA实现
1、拍摄三台虚拟机的快照
-
关闭所有进程
sbin/stop-dfs.sh sbin/stop-yarn.sh
-
关机
- 不关机拍摄的快照比较大,占磁盘空间
-
拍摄三台机器的快照【用于恢复当前状态,后续学习过程中不用HA】
-
启动三台机器
-
节点规划
进程/机器 node1 node2 node3 NameNode *【Active】 *【Standby】 ZKFC * * JN * * * DataNode * * * ResourcecManager *【StandBy】 *【Active】 NodeManager * * *
2、修改配置文件
-
删除三台机器原来的临时目录,重新创建,三台机器都要执行
cd /export/server/hadoop-2.7.5/ rm -rf hadoopDatas/ #创建hadoop的临时存储目录:存储数据块、fsimage等 mkdir datas #用于journal进程存储edits文件的目录 mkdir journalnode
-
修改第一台机器的配置
-
core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/export/server/hadoop-2.7.5/datas</value> </property> <property> <name>fs.trash.interval</name> <value>10080</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property>
- fs.defaultFS:指定HDFS入口地址
- mycluster:这是HDFS逻辑名称
- 必须与hdfs-site.xml中dfs.nameservice的属性保持一致
- ha.zookeeper.quorum:指定访问的zookeeper的地址
- fs.defaultFS:指定HDFS入口地址
-
hdfs-site.xml
<property> <name>dfs.permissions.enabled</name> <value>false</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>node1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/export/server/hadoop-2.7.5/journalnode</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>
- dfs.nameservices:用于定义HDFS逻辑名称,将多个NameNode封装为一个整体的名称
- dfs.ha.namenodes.mycluster:定义这个集群中有几个namenode,每个namenode的逻辑名称
- dfs.namenode.rpc-address.mycluster.nn1/nn2:定义两个NameNode的具体地址
- dfs.namenode.shared.edits.dir:指定journalnode服务的地址
- dfs.journalnode.edits.dir:journalnode将edits文件存储的位置
- dfs.client.failover.proxy.provider.mycluster:指定客户端请求服务端的方式
- dfs.ha.fencing.methods:隔离机制
- dfs.ha.automatic-failover.enabled:开启自动切换
-
yarn-site.xml
<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.ha.id</name> <value>rm1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node3</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node2</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>node3:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>node2:8088</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
3、分发并修改
-
分发给第二台和第三台机器
cd /export/server/hadoop-2.7.5/etc/hadoop/ scp core-site.xml hdfs-site.xml yarn-site.xml node2:$PWD scp core-site.xml hdfs-site.xml yarn-site.xml node3:$PWD
-
修改第一台机器的yarn-site.xml
-
编辑yarn-site.xml
cd /export/server/hadoop-2.7.5/etc/hadoop/ vim yarn-site.xml
-
删除以下内容
<!--在node3上配置rm1,在node2上配置rm2--> <!--注意:这个在YARN的另一个机器上一定要修改,非RM的其他机器上不配置此项--> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property>
-
-
修改第二台机器的yarn-site.xml
-
编辑yarn-site.xml
cd /export/server/hadoop-2.7.5/etc/hadoop/ vim yarn-site.xml
-
更改以下内容:将rm1修改为rm2
<!--在node3上配置rm1,在node2上配置rm2--> <!--注意:这个在YARN的另一个机器上一定要修改,非RM的其他机器上不配置此项--> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value> </property>
-
-
三台机器安装 psmisc
yum install psmisc -y
4、启动
-
启动zookeeper
/export/server/zookeeper-3.4.6/bin/start-zk-all.sh #!/bin/bash ZK_HOME=/export/server/zookeeper-3.4.6 for number in {1..3} do host=node${number} echo ${host} /usr/bin/ssh ${host} "cd ${ZK_HOME};source /etc/profile;${ZK_HOME}/bin/zkServer.sh start" echo "${host} started" done
-
第一次启动需要进行格式化:以后不需要执行
-
启动三台机器的journalnode,三台机器都要执行
cd /export/server/hadoop-2.7.5/ sbin/hadoop-daemon.sh start journalnode
-
第一台机器的NameNode进行格式化
bin/hdfs namenode -format
-
第一台机器同步元数据到第二台机器
scp -r datas node2:$PWD
-
第一台机器关联zookeeper,进行初始化
bin/hdfs zkfc -formatZK
-
三台机器关闭journalnode
sbin/hadoop-daemon.sh stop journalnode
-
-
第一台机器启动HDFS
start-dfs.sh #会自动启动所有HDFS的进程
-
第三台机器启动YARN
start-yarn.sh #只启动当前机器的RM和所有的NM
-
第二台机器启动ResourceManager
yarn-daemon.sh start resourcemanager
5、测试
-
查看网页状态
-
关闭当前Active状态的NameNode,检查Standby的NameNode是否能自动切换,以及读写是否正常
-
查看状态
hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 hdfs haadmin -failover nn2 nn1 语法:hdfs haadmin -failover active standby
-
测试写入
hdfs dfs -put /export/data/wordcount.txt /
-
关闭active状态的NameNode
hadoop-daemon.sh stop namenode
-
再次查看状态
hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2
-
测试读取
hdfs dfs -cat /wordcount.txt
-
-
关闭当前Active状态的RM,检查Standby的RM是否能自动切换