1、功能
- 文件系统 :分布式结构来存储数据,提供分布式读写
实现大数据存储
- 本质:分布式分而治之的思想
- 写:将大的文件通过HDFS进行拆分,拆分成若干个小的块,将每个小块存储在多台机器上
- 读:通过查询元数据,得到这个文件所有块的位置,将这个文件所有的块进行合并,返回给用户
2、应用场景
- 适合场景
- 大数据离线存储
- 适合于一次写入,多次读取的场景
- 适合于对读写速度要求不高的场景:将数据直接落地存储在硬盘的,
随机读写硬盘:比较慢
- 保存历史归档数据:我们公司永远保存近3年的数据
- 存储采集的大数据,作为原始数据的存储
- HDFS不适合的场景
- 需要频繁修改的场景
- 需要快速读写大数据
tips:对于小数据,则使用分布式文件系统Zookeeper:用于存储小数据,关键性的数据,重要的配置、索引信息等等
3、特点
分块机制:将大文件进行拆分
- 解决问题:
单台机器无法存储、存储性能比较差
- 默认规则:128M一个块,不足128M,按照实际大小存储
- 能不能改?
- 可以,修改配置文件hdfs-site.xml,修改必须重新格式化
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
- 问题1:300M文件,存储在HDFS上,一共会被切分为几个块?
- 3个块
- Block1:128M
可以存储到第一台机器【Linux文件系统】
- Block2:128M
可以存储到第二台机器【Linux文件系统】
- Block3:44M
可以存储到第三台机器【Linux文件系统】
- 测试上传一个170M左右的JDK
观察HDFS底层
副本机制:HDFS的数据如何保证安全
- 解决问题:
任何一台机器宕机故障,都不会导致数据的丢失,保证数据的完整性
- 问题2:300M文件,存储在HDFS上,一共会被切分为3个块,如果第一台机器宕机了,这份数据怎么保证能完整的读取到?
会导致数据丢失,数据无法完成恢复
- 解决:对每个块构建副本
- 默认:HDFS会为每个数据块构建2个副本,每个块总共存3份
一个300M的文件,存储在HDFS上总共占用了900M的空间 - 能不能改?
- 可以,修改配置文件:hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
4、架构
分布式主从架构
主节点:NameNode:一个
功能
功能一之接客:接受所有客户端的请求
- 因为NameNode就是HDFS入口,你希望NameNode在哪台机器,就配置哪台机器
core-site.xml文件中fs.defaultFS配置,该配置【将机器从逻辑上合并】,配置HDFS的统一地址
- 不论客户端在哪台机器提交的命令,都是请求给了你配置的机器的NameNode
功能二之管理
心跳机制:管理所有DataNode的死活
所有的DataNode在启动以后都要向NameNode进行注册
- 每一台DataNode
定期向NameNode发送一个心跳【信号】
,NameNode接受到信号,就代表这台DataNode没问题,如果长时间没有接收到某台DataNode的心跳,NameNode就认为这个DataNode有问题,就不会分配存储任务给这台DataNode 向你报道之后,隔段时间就发你个信号,告诉你我还活着,可以给我分配任务
汇报机制:管理所有的数据安全的
- 所有的DataNode都要
定期的发送当前自己这台机器上存储了哪些数据汇报给NameNode
,NameNode会根据汇报的信息来判断是否有数据丢失,如果有数据丢失,就通过副本恢复数据,保证每个块始终会有三份 定期向你汇报我这存了什么,你做好账本(元数据),缺了就赶紧补上,保证我们的子弹充足
- 例如:三台机器,每台机器都存储了数据
- 如果其中一台机器宕机了或者数据丢失了【更换硬盘】,在汇报时,NameNode就会发现这台机器宕机,数据丢失了,就要将这台机器本来存储的所有块恢复到另外两台机器上,保证所有的数据永远有3份
- 问题:NameNode只负责接客和管理,又不存储数据,它如何知道DataNode的数据是否丢失了?
- 负责维护内存元数据【metadata】
理解:账本【数据存储索引】
元数据:每个文件被分成了哪些块,这些块被存储在了哪些机器上
- 负责维护内存元数据【metadata】
file{
block1{node1,node2,node3},
block2{node2,node4,node5},
block3(node5,node2,node1)
}
- 为什么要存储元数据?
- 当用户进行读取时,要根据元数据获取当初这个文件的每个块存储的位置,然后读取每个块,合并返回给用户
- 当DataNode汇报时,要对比元数据,看是否有数据丢失,保证数据安全
从节点:DataNode:多个
每一个DataNode就是一台存储的机器,主要负责实现数据的读写
功能
- 与对应的机器的文件系统进行交互
- 将文件块写入文件系统
- 从文件系统中将文件块读取出来
客户端
功能
- 写:拆分
- 读:合并
问题:数据有没有经过NameNode?
功能
- 数据是不经过NameNode的
- 数据都是客户端直接于DataNode进行交互