Hadoop四大组件之——HDFS

一、HDFS设计思路

1、把大文件切割成小文件,使用分而治之的思想对同一个文件进行管理(并行)
2、每个切分之后的块都进行冗余存储,高可用不丢失

注意
HDFS的块的大小可以配置,且有默认值。
Hadoop2.x以前:64M
Hadoop2.x(含)以后:128M

理论上,hdfs集群可以无限制的加机器,但是就是加到一定的时候有上限。
1、HDFS集群是主从架构
就是主节点(namenode)能够管理的从节点的个数有上限。
2、能加的机器(从节点)的可靠性有限的。
好的成本高
成本不高的有可能出现数据丢失情况。

二、HDFS核心思想

1、分散存储
一个大的文件进行存储,必须要借助分布式的存储系统
分布式存储系统: 分而治之。 把大文件切分成多个小文件分散存储
2、冗余备份
保证数据安全
冗余备份的个数有默认值为3。 可以通过dfs.replication 修改。

三、HDFS保障数据安全的方法

备份多份
用户存储到hdfs的数据时候,可以根据自己的需求配置多份。
若在数个节点上都存储了一份数据,那么只要有一个节点存活,就可以保证数据安全。

数据分布:
1、数据的备份的个数由客户端指定。
2、如果一个文件存储多份,这多份数据完全没有必要存储在同一个节点。
3、若集群的节点数量为3个,但数据要存4份,最终hdfs只会存储3份。
(HDFS集群的任何一个节点上面,是没有完全相同的两份数据。)

四、HDFS架构

1、namenode:掌管文件系统的目录树,处理客户端的请求,保存元数据信息
2、datanode:存储实际的数据的,处理真正的读写
3、secondnamenode:分担namenode压力的,协助合并元数据信息

三大组件:

1、 NameNode
职责:
1、维护元数据
2、响应客户端的读写数据请求

WAL : write ahead log 预写日志

客户端进行事务操作时会记录日志,之后执行真正的事务操作,当事务操作成功之后才会真正提交事务。即若需要将HDFS预写的日志或元数据更新到内存中,则必须在事务操作成功之后才会更新到内存当中。

元数据:
meatdata : 内存当中一份完整的元数据(目录树结构+文件块映射+数据块和datanode的映射)
目录树结构:文件地址目录信息
文件块映射:文件切分成哪些块,这些块的id做了保存
数据块和datanode的映射 : datanode上面保存数据块的信息
磁盘上的元数据: fsimage (edits合并后的结果)+ edits(当edits_inprogress达到一定大小或过了一小时后生成) + edits_inprogress(正在操作的数据的日志)

元数据合并(checkpoint):
1、缩小了操作日志的大小
2、合并之后的元数据方便被namenode快速的加载到内存中。

[root@hadoop0 current]# cat VERSION 
#Sat Jul 24 20:13:49 CST 2021  #集群启动的时间
namespaceID=1618169485  #文件系统的唯一的标识符
clusterID=CID-2b25a790-4268-430a-91bc-47bcecb44eaf   #集群的唯一的标识符
cTime=0  #fsimage创建的时间
storageType=NAME_NODE   #节点类型
blockpoolID=BP-359584305-192.168.22.128-1594828513525   #块池的id,可以有多个
layoutVersion=-63   #hdfs持久化数据结构的版本号。

查看某个edits文件信息
hdfs oev -i edits_0000000000000001222-0000000000000001233 -o edits.xml
cat edits.xml
查看fsimage镜像信息
hdfs oiv -i fsimage_0000000000000001233 -p XML -o fsimage.xml
cat fsimage.xml

2、DataNode

职责:
1、维护namenode给它分配的block块
2、通过心跳机制汇报自身的所有的block块的信息,发送给namenode
3、真正为客户端读写数据提供辅助。

3、SecondaryNameNode

作用: 分担namenode合并元数据的压力
注意:配置SecondaryNameNode的时候不要和NameNode放到一个节点上。

四、HDFS的优点

1、可构建在廉价机器上
通过多个副本来提高可靠性,文件切分多个块进行存储
2、高容错性
数据自动保存多个副本,副本丢失后,可以自动恢复
3、适合批处理
移动计算比移动数据方便
4、适合大数据处理
10k+节点规模
5、流式文件访问
一次写入,多次读取,可以保证数据的一致性

五、HDFS的缺点

不适于以下操作
1、要求高的数据访问
比如毫秒级
2、小文件存取
寻道时间超过读取时间
3、并发写入、文件随机修改
一个文件只能有一个写
仅仅支持追加
4、不适合存储小文件
存储一个1亿个小文件,大小仅仅1t,但是消耗掉20g左右的内存

六、访问数据

在 Java 中操作 HDFS, 主要涉及以下 Class:
Configuration:该类的对象封转了客户端或者服务器的配置
FileSystem:该类的对象是一个文件系统对象, 可以用该对象的一些方法来对文件进行操作, 通过FileSystem 的静态方法 get 获得该对象

获取FileSystem:
方法一:set方式+通过get
//1:创建Configuration对象
Configuration conf = new Configuration();
//2:设置文件系统类型
conf.set(“fs.defaultFS”, “hdfs://hadoop0:50070”);
//3:获取指定文件系统
FileSystem fileSystem = FileSystem.get(conf);
//4:输出测试
System.out.println(fileSystem);
方法二:set方式+通过newInstance(就是把get改成newInstance)
方法三:new URI+get
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration());
System.out.println(“fileSystem:”+fileSystem);
方法四:new URI+newInstance(这里也一样)

文件的遍历:
//1、获取FileSystem实例
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration(),”root”);
//2、调用方法listFiles 获取 /目录下所有的文件信息
RemoteIterator iterator = fileSystem.listFiles(new
Path("/"), true); (false仅能获取文件,不能获取文件夹)
//3、遍历迭代器
while (iterator.hasNext()){
LocatedFileStatus fileStatus = iterator.next();
//获取文件的绝对路径 : hdfs://hadoop0:50070/xxx、文件名,打印输出
System.out.println(fileStatus.getPath()+"======"+
fileStatus.getPath().getName());
}

创建文件夹:
//1:获取FileSystem实例
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration(),“root”);
//2:创建文件夹
fileSystem.mkdirs(new Path("/aaa/bbb/ccc"));
//3: 关闭FileSystem
fileSystem.close();

上传文件:
//1:获取FileSystem
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration(),“root”);
//2:调用方法,实现上传
fileSystem.copyFromLocalFile(new Path(“源文件路径”), new Path(“目的地路径”));
//3:关闭FileSystem
fileSystem.close();

下载文件:
//1:获取FileSystem
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration(),“root”);
//2:获取hdfs的输入流
FSDataInputStream inputStream = fileSystem.open(new Path("/test1.txt(要读 取的路径和名)"));
//3:获取本地路径的输出流
FileOutputStream outputStream = new FileOutputStream(“D://test1_down2.txt (新路径和新名)”);
//4:文件的拷贝
IOUtils.copy(inputStream, outputStream,4096,false);
//5:关闭流
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
fileSystem.close();

七、合并小文件

通过命令合并下载:
hdfs dfs -getmerge
功能:合并下载文件到当前目录下面

通过Java API合并上传:
//1:获取FileSystem(分布式文件系统)
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://hadoop0:50070”),
new Configuration(),“root”);
//2:获取hdfs大文件的输出流
FSDataOutputStream outputStream =
fileSystem.create(new Path("/test_big.txt"));
//3:获取一个本地文件系统
LocalFileSystem localFileSystem =
FileSystem.getLocal(new Configuration());
//4:获取本地文件夹下所有文件的详情
FileStatus[] fileStatuses = localFileSystem.listStatus(new
Path(“D:\input”));
//5:遍历每个文件,获取每个文件的输入流
for (FileStatus fileStatus : fileStatuses) {
FSDataInputStream inputStream =
localFileSystem.open(fileStatus.getPath());
//6:将小文件的数据复制到大文件
IOUtils.copy(inputStream, outputStream,4096,false);
IOUtils.closeQuietly(inputStream);
}
//7:关闭流
IOUtils.closeQuietly(outputStream);
localFileSystem.close();
fileSystem.close();

八、HDFS核心设计

三大机制

1、心跳机制

HDFS心跳:datanode每隔一个固定的时长就会跟namenode取得一次联系,以证明自己还存活。
作用:
1、让namenode能够识别到当前的集群有多少个datanode存活
2、心跳数据包
(1)datanode自身的状态
磁盘使用量、block的数量、block的状态
(2)当前的datanode节点所保存的所有的block块信息

HDFS的启动:
1、先启动namenode进程
2、加载namenode文件夹中的存储的元数据(fsimage + edits_inprogress)
3、namendoe在启动之后,会在节点上面启动一份服务。
这个服务等待所有的datanode的汇报数据块的内容
4、datanode一上线,就会通过心跳机制把自身所有持有的所有的block块的信息全部汇报给namenode
(若出现坏块,所在节点汇报时便不会有此块,此时namenode会通过心跳机制知道这块损坏,将会启动自己内部的恢复机制,将块的数量恢复到副本的数量,恢复后不一定会在原来的节点)
5、只有当namenode等到了所有的datanode的上线以及把所有的块的信息汇报完毕之后,最后namenode才能够得知,整个集群的文件的数据块的多个副本的存放情况。

hdfs正常启动之后:
元数据分为两部分:
1、目录树结构
2、每个文件的数据块的存储的节点的位置

2、安全模式

进入安全模式:
1、当hdfs集群中的部分datanode宕机之后,hdfs启动服务恢复
2、当丢失的数据块的比例超过了0.1% 的时候会自动的进入安全模式

(在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比如 ls/mkdir))

	hdfs dfsadmin -safemode get //查看
	hdfs dfsadmin -safemode enter //进入安全模式
	hdfs dfsadmin -safemode leave //离开安全模式
	hdfs dfsadmin -safemode wait //等待

退出安全模式:
	1、找出问题进行修复
	2、强制退出
		hdfs dfsadmin -safemode leave //离开安全模式
3、副本存放策略

副本存放策略:就是决定一个数据块的多个副本到底要到哪些服务器上面。
原则:
1、任意一个节点上面不可能存储两个一样的副本块。
2、如果一个数据块要保存完整的三个副本块,必须至少需要3个节点。

高可用和联邦
1、高可用

单点故障
集群要对外提供服务,保证NameNode启动起来
HA:High Available 高可用
主节点: hadoop0 从节点hadoop1、hadoop2、hadoop3
SPOF: Single Point Of Failure 单点故障 (所有主从架构都可能出现)
为了active的NameNode再找一个备份。
hadoop0: active NameNode(只能有一份)
hadoop4: standby NameNode(数据必须时刻与active保持一致)
hadoop0上面存储了很多的元数据信息。hadoop4这个节点要替代hadoop0,那么必须要和hadoop0上面的元数据信息一模一样。
注意
hadoop2.x中只有一个standby
hadoop3.x中可以有多个。

2、联邦

两种方式:
1、横向拓展(分而治之)
2、纵向拓展(加内存)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值