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生态系统相关组件
图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上传文件的核心流程。
图2
根据上图,我给大家梳理一些核心流程:
1,请求上传300M的xxx.mp4文件,即hdfs控制台上敲入hdfs dfs -put xxx.mp4 filedir命令即可上传xxx.mp4文件。
2,随后HDFS客户端创建DistrubutedFileSystem对象。
3,然后DistrubutedFileSystem对象与NameNode节点建立RPC通信,并生成一个NameNode代理对象NameNodeProxy。
4,NameNode创建文件相关的元数据信息并保存在内存中,保存的元数据说白了就是xxx.mp4这个文件分为几个数据块来存储,每隔数据块存储在哪个DataNode上。如下图:
这里的元数据表示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,DataNode2和DataNode3。
5,因为元数据是保存在内存中的,当元数据满了则写入磁盘。
6,NameNode写完元数据后,此时会将元数据相关信息返回给HDFS客户端。
7,HDFS客户端获取NameNode返回的元数据后,创建FSDataOutputStream对象。
8,然后HDFS客户端打开OutputStream,根据元数据信息开始写数据。这里的元数据即xxx.mp4这个文件分为几个数据块来存储,每隔数据块存储在哪个DataNode上,前面说过。
9,因此,有了元数据的指引,FSDataOutputStream对象将所有数据对象写入DataNode中。以写拆分的part-0文件为例,FSDataOutputStream对象首先会将part-0文件写入DataNode1中
10,为了保证数据高可用,然后DataNode1会将part-0文件水平复制到DataNode2,再然后DataNode2再将part-0文件复制到DataNode5中,见下图红框部分:
11,最后一个节点DataNode5接收完毕part-0文件后,那么就会返回ACK应答给DataNode2,同样的DataNode2会返回应答给DataNode1,最终给你DataNode1会将应答返回给HDFS客户端,见下图红框部分:
12,根据上面9,10,11步骤的写part-0文件过程,同理FSDataOutputStream对象将part-1,part-2对象写入datanode,直到写完数据为止。
因此经过上面的几个步骤,HDFS文件上传的原理就给大家说明白了。
8,明白了HDFS的文件上传过程,那么我们如何将文件从HDFS上下载下来呢?
既然你已经明白了HDFS文件的上传过程,那么HDFS文件的下载过程其实就是HDFS文件上传过程的逆过程而已,不过有一点需要注意的是,下载的过程HDFS会比较智能,会选择文件存储最近的DataNode节点来下载文件,这是因为网络传输是需要成本的。详细步骤这里不再累述,详情请见下图:
好了,HDFS的来源,文件上传及下载过程就给大家说明白了。
最后留两道思考题请大家思考:
1,在生产部署中,高可用非常最重要。那么HDFS集群如何保证高可用呢?万一NameNode节点挂了怎么办?
2,HDFS在文件下载过程中,若存储文件的某个DataNode节点挂了怎么办?此时还能下载完整的文件吗?还有,下次下载文件时,HDFS客户端还会访问出故障的DataNode节点吗?
答案将在下期为大家揭晓,敬请关注。
由于作者水平有限,若文中有错误还请提出,最后表示感谢。