HDFS即Hadoop Distributed File System的简称,是Hadoop抽象文件系统的一种实现。HDFS允许文件通过网络在多台主机上分享存储文件,使应用或者用户看起来和访问本地磁盘一致。
HDFS是Hadoop的核心子项目,是分布式计算中数据存储管理的节点,是基于流式数据访问和处理超大文件的需求而开发的分布式文件系统,非常适合在大规模数据集上应用,同时也是一个具备高度容错的系统
HDFS适用于一次写入多次查询的流式数据访问情况,不是随机访问模式。修改只能先删除再重新上传,不支持并发写,不适合小文件操作。
-
HDFS是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色
-
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
适用场景:适合一次写入,多次读出的场景,除了append操作之外,不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用
基础工作原理
一个完整的HDFS文件系统通常运行在由网络连接在一起的一组计算机组成的集群上,在这些节点上运行着不同类型的守护进程,例如NameNode、DataNode、SecondaryNameNode,多个节点上不同类型的守护进程相互配合、互相协作,共同为用户提供高效的分布式存储服务
HDFS特点
优点:
-
高容错性
-
数据自动保存多个副本。它通过增加副本的形式,提高容错性
-
某一个副本丢失以后,它可以自动恢复
-
-
适合处理大数据
-
数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
-
文件规模:能够处理百万规模以上的文件数量,数量相当之大。需要注意不适合使用大量小文件
-
可构建在廉价机器上,通过多副本机制,提高可靠性
-
缺点:
-
不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
-
无法高效的对大量小文件进行存储
-
存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
-
小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标
-
-
不支持并发写入、文件随机修改
-
一个文件只能有一个写,不允许多个线程同时写
-
仅支持数据append追加,不支持文件的随机修改。
-
组成架构
-
NameNode就是Master,它是一个主管、管理者
-
管理HDFS的名称空间
-
配置副本策略
-
管理数据块 Block 映射信息
-
处理客户端读写请求
-
-
DataNode就是Slave。NameNode下达命令,DataNode执行实际的操作
-
存储实际的数据块
-
执行数据块的读/写操作
-
-
Client就是客户端
-
文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传
-
与NameNode交互,获取文件的位置信息
-
与DataNode交互,读取或者写入数据
-
Client提供一些命令来管理HDFS,比如NameNode格式化
-
Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
-
-
Secondary NameNode辅助NameNode
-
辅助NameNode定期合并Fsimage和Edits,并推送给NameNode
-
NameNode宕机后实际上也可以通过SNN上存储的数据进行恢复
-
HDFS 文件块大小:默认大小在Hadoop2+版本中是128M
思考:为什么块的大小不能设置太小 , 也不能设置太大 ?
HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置
HDFS的块比磁盘的块大,其目的是为了最小化寻址开销
如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。
总结:HDFS 块的大小设置主要取决于磁盘传输速率。
核心API
使用编程语言通过调用HDFS对方外提供的API进行操作
Configuration
Hadoop的主要配置对象,只有配置了相对应的参数才可以跟线上的集群环境链接.
Configuration做为Hadoop的一个基础功能承担着重要的责任,为Yarn、HSFS、MapReduce、NFS、调度器等提供参数的配置、配置文件的分布式传输等重要功能。
Hadoop实现了一个加载配置文件的功能的Configuration类:org.apache.hadoop.conf.Configuration
FileSystem
HDFS的主要操作对象,必须获取到这个实例对象,才可以操作HDFS.
这是一个比较通用的文件系统的抽象基类,可以实现分布式系统或者本地连接磁盘,本地版本可以做hadoop的小测试。
要想使用HDFS,那么就得使用这个FileSystem的对象或者子类对象。
本地实现是LocalFileSystem,分布式实现是DistributedFileSystem。