23

HDFS 的文件上传下载的核心原理

 4 years ago
source link: https://mp.weixin.qq.com/s/ZaQVO5y5oWztmjnL9gPWRg
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1,什么是大数据?

什么是大数据?先来一组直观的数据感受下什么是大数据:

1)纽约证交所每天产生的交易数据大约是4TB到5TB之间;

2)截止到2015年7月,微信朋友圈每天的发表量(包括赞和评论)超过10亿,浏览量超过100亿;

3)微博每天7500万条微博发布,每条可输入140字,总共105亿字,1G可存储5亿字,每天就需21G的空间;

4)百度网盘网盘用户数量达到2亿,每个人可有2TB的存储空间,可见存储数据量之大。

可见,大数据就是数据量非常大,大到一台计算机的容量无法存储。那么,这么大的数据量该如何存储呢?

2,大数据如何存储?

举个例子,假如我们用水桶盛水,当你不断往水桶注水,那么水满了自然就会溢出。此时为了不让水溢出,那么你自然会添加水桶来盛水。你会根据水量大小来计算需要多少水桶来盛水,当不够水桶了,你会添加水桶。同理,当数据量非常大时,大到一台计算机无法存储时,此时可以用两台计算机来存储,两台不计算机不够存储,扩展至三台计算机来存储。。。于是,这就涉及分布式存储了。

分布式存储中最有名且目前用的最多的当属Hadoop的HDFS(Hadoop Distributed File System),思想起源于谷歌的三篇论文之一的GFS(The Google File System)。

3,什么是Hadoop?

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。Hadoop核心组件主要包括HDFS,YARN和MapReduce,而Hadoop的框架最核心的设计就是HDFS和MapReduce,其中HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。另外YARN是 Hadoop 的资源调度管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。

4,Hadoop生态系统相关组件

bYjARvZ.png!web

图1

图1是Hadoop生态系统相关组件即目前大数据用到的相关技术,从中可以看到HDFS处于Hadoop生态系统最底层,即为大数据相关组件提供存储。其中Hive的数据是存储在HDFS上的,因为Hive的表是一张逻辑表,这张表的定义的描述了表数据与HDFS之间的映射关系;Hbase的底层存储机制也是HDFS,一些流计算框架比如Spark Streaming,Storm和FLink的经过流式计算后也可以将数据输出到HDFS上存储。

5,什么是HDFS?

既然HDFS能提供如此强大的存储能力,那么HDFS究竟是何方神圣?

当数据量非常大,大到一台电脑无法存储时,此时就得把数据拆分成几部分,然后分别存储在不同的计算机上,管理网络中跨多台计算机存储的文件系统即为分布式文件系统(HDFS)。

HDFS可以存储各种各样的文件,比如text文本文件,csv文件,二进制文件等等。

6,HDFS的核心概念

学习HDFS的核心原理,那么必须从其的核心组件学起,HDFS涉及的核心概念主要包含了数据块,NameNode和DataNode。

数据块:平时我们用的磁盘一般都有数据块的大小,数据块一般是文件读写的基本单位,同样,HDFS也有默认的数据块,HDFS的数据块大小是128M.

NameNode:HDFS一般是一个由NameNode和DataNode组成的主从架构分布式集群,其中NameNode就相当于主节点,管理文件系统名称空间,元数据和控制客户端文件的访问。

DataNode:DataNode就是存储数据的节点,一个文件可以拆分成几份分别存储在不同的DataNode上。

7,我们如何将文件上传至HDFS上呢?

既然明白了HDFS是这么一个好东西,当数据量非常大时,我们可以通过扩展机器的方式来提高存储量。那么,此时我们将如何把文件上传至HDFS上呢?

请看下图,感受下HDFS上传文件的核心流程。

QZ7n2uN.jpg!web

图2

根据上图,我给大家梳理一些核心流程:

1,请求上传300M的xxx.mp4文件,即hdfs控制台上敲入hdfs dfs -put xxx.mp4 /filedir命令即可上传xxx.mp4文件。

2,随后HDFS客户端创建Distrubuted FileSystem对象。

3,然后 Distrubuted FileSystem对象与NameNode节点建立RPC通信,并生成一个NameNode代理对象NameNodeProxy。

4,NameNode创建文件相关的元数据信息并保存在内存中,保存的元数据说白了就是xxx.mp4这个文件分为几个数据块来存储,每隔数据块存储在哪个DataNode上。如下图:

2ERB3ab.png!web

这里的元数据表示xxx.mp4文件大小是300M,而HDFS的DataNode的数据块大小默认是128M,因此xxx.mp4无法存储到一个DataNode上。因此就需要将xxx.mp4文件分割成三部分:part-0(128M),part-1(128M)和part-3(44M)。为了保证某个DataNode节点宕机数据不丢失,于是采用冗余的策略,即一份文件在三个DataNode中存储。以拆分的part-0文件为例,part-0文件最终会写入DataNode1, Data Nod e2Data Nod e3。

5,因为元数据是保存在内存中的,当元数据满了则写入磁盘。

6,NameNode写完元数据后,此时会将元数据相关信息返回给 HDFS客户端。

7, HDFS客户端 获取NameNode返回的元数据后,创建FSData OutputStream对象。

8,然后 HDFS客户端 打开OutputStream,根据元数据信息开始写数据。这里的元数据即 xxx.mp4这个文件分为几个数据块来存储,每隔数据块存储在哪个DataNode上 ,前面说过。

9,因此,有了元数据的指引,FSDataOutputStream对象将所有数据对象写入DataNode中。以写拆分的part-0文件为例, FSDataOutputStream 对象 首先会将part-0文件写入DataNode1中

10 ,为了保证数据高可用, 然后DataNode 1 会将 part-0文件水平复制到 DataNode 2,再然后 DataNode2再将part-0文件复制到DataNode5中,见下图红框部分:

MzINBnI.png!web

11,最后一个节点DataNode5接收完毕part-0文件后,那么就会返回ACK应答给DataNode2,同样的DataNode2会返回应答给DataNode1,最终给你DataNode1会将应答返回给HDFS客户端,见下图红框部分:

3iaQN3E.png!web

12,根据上面9,10,11步骤的写part-0文件过程,同理FSDataOutputStream对象将part-1,part-2对象写入datanode,直到写完数据为止。

因此经过上面的几个步骤,HDFS文件上传的原理就给大家说明白了。

8,明白了HDFS的文件上传过程,那么我们如何将文件从HDFS上下载下来呢?

既然你已经明白了HDFS文件的上传过程,那么HDFS文件的下载过程其实就是HDFS文件上传过程的逆过程而已,不过有一点需要注意的是,下载的过程HDFS会比较智能,会选择文件存储最近的DataNode节点来下载文件,这是因为网络传输是需要成本的。详细步骤这里不再累述,详情请见下图:

UBjyYrN.jpg!web

好了,HDFS的来源,文件上传及下载过程就给大家说明白了。

最后留两道思考题请大家思考:

1,在生产部署中,高可用非常最重要。那么HDFS集群如何保证高可用呢?万一NameNode节点挂了怎么办?

2,HDFS在文件下载过程中,若存储文件的某个DataNode节点挂了怎么办?此时还能下载完整的文件吗?还有,下次下载文件时,HDFS客户端还会访问出故障的DataNode节点吗?

答案将在下期为大家揭晓,敬请关注。

由于作者水平有限,若文中有错误还请提出,最后表示感谢。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK