一、文件系统、分布式文件系统
1. 文件系统
文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作, 使得用户对文件访问和查找变得容易
文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念, 用户不必关心数据底层存在硬盘哪里, 只需要记住这个文件的所属目录和文件名即可
文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置
传统文件系统
所谓传统常见的文件系统更多指的的单机的文件系统,也就是底层不会横跨多台机器实现。比如windows操作系统上的文件系统、 Linux上的文件系统、 FTP文件系统等等。
这些文件系统的共同特征包括:
- 带有抽象的目录树结构,树都是从/根目录开始往下蔓延;
- 树中节点分为两类: 目录和文件;
- 从根目录开始,节点路径具有唯一性。
数据:
指存储的内容本身,比如文件、视频、图片等,这些数据底层最终是存储在磁盘等存储介质上的,一般用户无需关心,只需要基于目录树进行增删改查即可,实际针对数据的操作由文件系统完成。
元数据:
元数据(metadata)又称之为解释性数据,记录数据的数据
文件系统元数据一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息。
海量数据存储遇到的问题
1.成本高
传统存储硬件通用性差,设备投资加上后期维护、 升级扩容的成本非常高
2.无法支撑高效率的计算分析
传统存储方式意味着数据:存储是存储,计算是计算,当需要处理数据的时候把数据移动过来
程序和数据存储是属于不同的技术厂商实现,无法统一整合在一起
3.性能低
单节点I/O性能瓶颈无法逾越,难以支撑海量数据的高并发高吞吐场景。
4.可扩展性差
无法实现快速部署和弹性扩展,动态扩容、缩容成本高,技术实现难度大。
2. 分布式存储系统
分布式存储的核心
- 分布式存储
- 元数据记录
- 分块存储
- 副本机制
1.分布式存储
问题: 数据量大,单机存储遇到瓶颈
解决:
单机纵向扩展: 磁盘不够加磁盘,有上限瓶颈限制
多机横向扩展:机器不够加机器,理论上无限扩展
2.元数据记录的功能
问题:文件分布在不同机器上不利于寻找
解决:元数据记录下文件及其存储位置信息, 快速定位文件位置
由元数据来帮助我们记录,文件都存在哪一台服务器上,大小是多大
3.分块存储
问题:文件过大导致单机存不下、上传下载效率低
解决:文件分块存储在不同机器, 针对块并行操作提高效率
可以将大文件进行切割,将文件分成不同的块存在不同的服务器上,可以通过元数据记录每块的详细信息
4.副本机制
问题:硬件故障难以避免,数据易丢失
解决:不同机器设置备份, 冗余存储,保障数据安全
即使服务器挂掉,但文本保存在不同的服务器上,不影响正常使用
二、HDFS-Hadoop分布式文件系统
Apache Hadoop核心组件之一, 作为大数据生态圈最底层的分布式存储服务而存在。
HDFS主要是解决大数据如何存储问题的。 分布式意味着是HDFS是横跨在多台计算机上的存储系统。
HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)
HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。(对外提供统一的访问接口,但内部却是由多个分布式文件系统组成)
三、HDFS设计目标
硬件故障(Hardware Failure) 是常态, HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是HDFS的核心架构目标。
HDFS上的应用主要是以流式读取数据(Streaming Data Access)
HDFS被设计成用于批处理,而不是用户交互式的。
相较于数据访问的反应时间,更注重数据访问的高吞吐量。
典型的HDFS文件大小是GB到TB的级别。所以, HDFS被调整成支持大文件(Large Data Sets)
它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
四、HDFS重要特征
1.主从架构
HDFS是标准的主从架构
一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成
Namenode是HDFS主节点 Datanode是HDFS从节点 两种角色各司其职,共同协调完成分布式的文件存储服务
官方架构图中是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上
2.分块存储
HDFS中的文件在物理上是分块存储(block) 的,默认大小是128M,不足128M则本身就是一块(如果一个文件只有1M,那么他也就是一块)
块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中: dfs.blocksize
3.副本机制,冗余存储
文件的所有block都会有副本
副本系数可以在文件创建的时候指定,也可以在之后通过命令改变
副本数由参数dfs.replication控制 默认值是3 ,也就是说会额外再复制2份,本身也作为一个副本
实际当中可以结合场景选择副本数(比如1M数据,生成1000个副本,没必要,根本没必要)
4.元数据管理(难点)
先说一个概括整体含义的东西:Namenode包含namespace,这样就好理解了
NameNode
在HDFS中, Namenode管理的元数据具有两种类型:
文件自身属性信息,比如:文件名称、权限,修改时间,文件大小,复制因子,数据块大小
文件块位置映射信息,比如:记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上
namespace
HDFS支持传统的层次型文件组织结构
用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被NameNode记录下来(可以理解为,namespace提供了空间或者目录树,但需要通过NameNode记录下来)
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dira/dir-b/dir-c/file.data。
5.数据块存储
文件的各个block的具体存储管理由DataNode节点承担
每一个block都可以在多个DataNode上存储
当一个客户端基于NameNode发起一个请求去删除某一个文件,NameNode如果删除,只能删除目录结构树,但底层真正数据删除是由DataNode操作,NameNode会把块的操作命令发送给DataNode。
这些操作对用户都是无感的,因为可以这么理解,用户过来存文件,我可以存的下,用户删文件,我可以把文件删除,并且在这个过程中数据是安全的。