大数据 HDFS 凭啥能存下百亿数据?
欢迎关注大数据系列课程
前言
大家平时经常用的百度网盘存放电影、照片、文档等,那有想过百度网盘是如何存下那么多文件的呢?难到是用一台计算机器存的吗?那得多大磁盘啊?显然不是的,那本文就带大家揭秘。
分布式存储思想
既然一台机器的存储所需的磁盘有上限瓶颈,那么我们能否利用多台机器形成一个整体用来存储呢?这就是我们所说的分布式存储。
单机纵向扩展:磁盘不够加磁盘,有上限瓶颈限制
多机横向扩展:机器不够加机器,理论上无限扩展
Hadoop 就是采用了这样的一个思想,设计出了分布式存储系统 HDFS。
HDFS 介绍和使用
HDFS(Hadoop Distributed File System
),意为:Hadoop
分布式文件系统。它是Apache Hadoop
核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。也可以说大数据首先要解决的问题就是海量数据的存储问题。
HDFS 主要是解决大数据如何存储问题的。分布式意味着是 HDFS 是横跨在多台计算机上的存储系统。
HDFS 是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)。
HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。
HDFS 使用
HDFS 安装好了,具体是如何使用呢,如何上传和下载文件呢?一共有两种方式,通过 shell 命令和 web 页面。
shell 命令操作 HDFS
类似 linux 命令,可以直接通过在命令行界面操作。Hadoop 提供了文件系统的 shell 命令行客户端: hadoop fs [generic options]
创建文件夹
hadoop fs -mkdir [-p] <path> ...
path
为待创建的目录
-p
选项的行为与Unix mkdir -p
非常相似,它会沿着路径创建父目录。
查看指定目录下内容
hadoop fs -ls [-h] [-R] [<path> ...]
path 指定目录路径
-h 人性化显示文件 size
-R 递归查看指定目录及其子目录
上传文件到 HDFS 指定目录下
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
查看 HDFS 文件内容
hadoop fs -cat <src> ...
读取指定文件全部内容,显示在标准输出控制台。
注意:对于大文件内容读取,慎重。
下载 HDFS 文件
hadoop fs -get [-f] [-p] <src> ... <localdst>
下载文件到本地文件系统指定目录,localdst 必须是目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
更多命令可以查看官方文档
https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html
2.web 界面操作 HDFS
另外一种更简单直观的方式是通过 web 界面操作 HDFS,默认是 50070 端口,如下图所示:
HDFS 的架构
HFDS 采用分布式的架构,可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是 HDFS 的核心架构目标,下面是 HDFS 的官方架构图:
主从架构
HDFS 集群是标准的master/slave
主从架构集群,一般一个 HDFS 集群是有一个Namenode
和一定数目的DataNode
组成。
主角色:NameNode
NameNode 是 Hadoop 分布式文件系统的核心,架构中的主角色。
NameNode 维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
基于此,NameNode 成为了访问 HDFS 的唯一入口。
从角色:DataNode
DataNode 是 Hadoop HDFS 中的从角色,负责具体的数据块存储。
DataNode 的数量决定了 HDFS 集群的整体数据存储能力,通过和 NameNode 配合维护着数据块。
主角色辅助角色: SecondaryNameNode
此外,HDFS 中还有一个 SecondaryNameNode,虽然途中没有画出,那它有什么用呢?
Secondary NameNode 充当 NameNode 的辅助节点,但不能替代 NameNode。
主要是帮助主角色进行元数据文件的合并动作。可以通俗的理解为主角色的“秘书”。
分块存储
由于有的文件很大,一台机器也存不下,于是 HDFS 会对我们的文件做一个物理上的切割,也就是分块存储。
HDFS 中的文件在物理上是分块存储(block
)的,默认大小是128M(134217728)
,不足128M
则本身就是一块。
副本机制
既然分布式存储海量数据,那么肯定需要成千上百的机器,这样很有可能其中一台机器宕机,出故障了怎么办呢?
当然 HDFS 也想到了解决方案,文件的所有 block 都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。副本数由参数dfs.replication
控制,默认值是 3,也就是会额外再复制 2 份,连同本身总共 3 份副本,而且这个副本尽量会分散在不同的机架上,规避风险。
NameNode 高可用
既然 DataNode 有副本,出现数据丢失可能性很小,那 NameNode 挂了不是照样凉凉?
不用担心,那我在启动一个 NameNode 备在那里不就行了吗。
存在两个 NameNode,一个是活动的 NameNode,称为 Active,另外一个是备用的 NameNode,称为 Standby。Active 节点的数据通过 JournalNode 节点同步给 Standby 节点。 当 Active 节点出现问题时,需要将 Standby 节点切换为 Active 节点来为客户端提供服务,这样就保证了高可用。
元数据管理
前面提到 NameNode 中包含元数据,那么究竟具体是哪些内容呢?
在 HDFS 中,Namenode 管理的元数据具有两种类型:
文件自身属性信息
文件名称、权限,修改时间,文件大小,复制因子,数据块大小。
文件块位置映射信息
记录文件块和 DataNode 之间的映射信息,即哪个块位于哪个节点上。
总结
现在你终于知道为什么百度网盘可以存下海量的数据了吧,主要采用的是分布式的存储,将数据分块多副本的方式存储到多个数据节点 DataNode, 然后由唯一的NameNode
节点去管理这个文件的信息,比如说它是在那些DataNode
节点上,大小是多少等等,注意这里是DataNode
主动告诉NameNode
它这里有哪些文件块。
如果本文对你有帮助的话,请留下一个赞吧
欢迎关注个人公众号——JAVA 旭阳
更多学习资料请移步:程序员成神之路
版权声明: 本文为 InfoQ 作者【JAVA旭阳】的原创文章。
原文链接:【http://xie.infoq.cn/article/9d7fbc484e5c262664b72134f】。文章转载请联系作者。
评论