写点什么

大数据 HDFS 凭啥能存下百亿数据?

作者:JAVA旭阳
  • 2022-12-09
    浙江
  • 本文字数:2370 字

    阅读完需:约 8 分钟

欢迎关注大数据系列课程

前言

大家平时经常用的百度网盘存放电影、照片、文档等,那有想过百度网盘是如何存下那么多文件的呢?难到是用一台计算机器存的吗?那得多大磁盘啊?显然不是的,那本文就带大家揭秘。


分布式存储思想

既然一台机器的存储所需的磁盘有上限瓶颈,那么我们能否利用多台机器形成一个整体用来存储呢?这就是我们所说的分布式存储。



  • 单机纵向扩展:磁盘不够加磁盘,有上限瓶颈限制

  • 多机横向扩展:机器不够加机器,理论上无限扩展


Hadoop 就是采用了这样的一个思想,设计出了分布式存储系统 HDFS。

HDFS 介绍和使用

HDFS(Hadoop Distributed File System ),意为:Hadoop分布式文件系统。它是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。也可以说大数据首先要解决的问题就是海量数据的存储问题。


  • HDFS 主要是解决大数据如何存储问题的。分布式意味着是 HDFS 是横跨在多台计算机上的存储系统。

  • HDFS 是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)。

  • HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。

HDFS 使用

HDFS 安装好了,具体是如何使用呢,如何上传和下载文件呢?一共有两种方式,通过 shell 命令和 web 页面。


  1. 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)


hadoop fs -put zookeeper.out /alvinhadoop fs -put file:///etc/profile hdfs://node1:8020/alvin
复制代码


  • 查看 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 旭阳

更多学习资料请移步:程序员成神之路


发布于: 刚刚阅读数: 5
用户头像

JAVA旭阳

关注

欢迎关注个人公众号—— JAVA旭阳 2018-07-18 加入

旭阳,希望自己能像初升的太阳一样,对任何事情充满希望~~

评论

发布
暂无评论
大数据HDFS凭啥能存下百亿数据?_JAVA旭阳_InfoQ写作社区