这个Hadoop HDFS教程的目标是教会你,什么是HDFS, 什么是不同节点,在HDFS中数据是如何存储的,HDFS的结构和HDFS的一些特点,比如分布式存储,容错能力,可用性高和依懒性高和一些关于块的知识等等。在HDFS教程中也会讨论一些HDFS的基本操作,比如怎么读和写来自HDFS和Rack的感知数据。这套Hadoop HDFS教程的目的是涵盖所有的概念在分布式系统中。
2.HDFS教程--介绍
分布式文件系统 -- HDFS是可靠度最高的文件存储系统。HDFS是为存储在集群上运行的的文件存储系统。它设计的原则是更趋向于少量的大文件,而不是大量的小文件。Hadoop HDFS同时提供容错存储层和其他的组件。HDFS复制数据可以帮助我们去实现这个特点。即是硬件失败,它也可以可靠地存储数据。它为应用数据平行提供高吞吐量的数据访问。
3.HDFS 节点
正如我们所知,Hadoop以雇主-奴隶的方式工作,HDFS也同时包含两个类型的节点。他们在集群中分别是namenodes 和datanodes。
3.1 HDFS Master(Namenode)
名节点为客户端调节可以访问的文件。它负责维护,管理和分配任务给slave节点。NameNode执行文件系统命名空间的操作,比如,打开,关闭和重命名地址跟路径。它应该部署在可靠的硬件上。
3.2 HDFS Slave(Datenode)
在分布式文件系统中有大量的努力节点负责管理存储数据。这些奴隶节点才是真正相应客户端读写请求的节点。他们还根据来自namenode的指令块,进行创建,删除和复制。他们复制自身给其他的数据节点,并继续处理,直到被规定的副本数量被创建完毕。数据节点可以被部署在硬件架子上,但是不必非要部署在非常可靠地机器上。
4.Hadoop HDFS的守护进程
在HDFS数据存储进程中有两个守护进程
Namenode:是在所有主人节点中运行的守护进程,Namenode存储元数据比如,文件名,block的数量,副本的数量,块的位置,块的ID等等。该数据在主内存中可用以便快速的检索数据。在本地磁盘中,元数据的副本可用于持久性。所以,名节点的内存应该配置较高。
Datanode:这是运行在节点上的守护进程,这些才是真正存储数据的工作节点。
- 数据在HDFS中的存储
对于每个block的多重复制是横跨集群在不同节点下的复制。这些复制都是重复的数据。在默认情况下,HDFS的默认因子为3。这样的设置为系统提供了容错性,可靠性和高可依赖性。
总结一下,大文件在HDFS中被分解成n个小的blocks.每个block以分布式的方式实现在集群上的存储,同时每个block对于自身的复制是夸集群进行的。
Hadoop HDFS中的机架感知
由于Hadoop通常的是运行在一个集群中,这就对机架数量有了要求。NameNode将不同的Block复制在不同的机架上用以提高系统的容错性。NameNode尝试着每个机架上都复制一个自己,这样就算一个机架不工作了,系统仍然可以高效的运行。优化存储位置是HDFS与现阶段的分布式系统区分开来的标志。机架感知与复制规则是用来提高系统的容错性,可靠性,高可用性和网络带宽利用率。-
HDFS架构
一个单独的NameNode节点用来存储元数据和很多的NameNode用来做实际存储工作。这些节点被分配到在集群中的不同的机架上。在读写文件中,客户端需要访问NameNode。HDFS应用需要一个一次写入多次读取的访问模型。一旦文件的被创建和写入就不能被编辑。
NameNode储存元数据, DataNode储存实际的数据。客户端在执行任何一个任务的时候都学要访问数据节点,可以说数据节点是整个集群中的中心环节。
大量在集群中的datanodes被HDFS存储在本地磁盘里。DataNodes定时给发送心跳信息给Namenode,来确保它是否在线。它同时也给不同的DataNode传递自己身数据,直到复制因子达到3的时候完成。
- Hadoop HDFS的特点
a.分布式存储
由于HDFS以分布式的方式存储数据,它把数据分成小块,存储在集群中的不同节点上,在这种方式中,Hadoop提供一个map reduce的方式存储大数据的子集数据,就是把它打成小块儿去存储他们。MapReduce是Hadoop的核心,但是HDFS是提供这些能力的基础。
b.Blocks
由于HDFS把大的数据文件分成小块儿--Blocks. Block是文件系统中最小的数据单元。客户端和管理员不需要控制这些小块存储在什么位置上,Namenode将决定这类事情。
HDFS默认的块儿大小是128MB,当然这个大小可以增加。这不想OS文件操作系统,它的block大小只有4KB.
如果数据大小比块大小小的话,block大小就会等于数据大小。例如一个数据的大小为129MB,则系统会为这个数据创建两个Block一个大小为128MB,另一个大小只为1MB. 这样的设置可以保证存储空间不被浪费。
将Block大小设置为128MB有两个好处,一是解决数据搜寻时间。而是mapper可以一次性处理一个块儿的数据。
在分布式文件系统中,一个文件被分割成块儿,同时每个块又被复制成3块。
c.复制性
Hadoop HDFS为Blocks创建副本。所有的blocks副本都被夸集群创建,它通常在每个机架上都会创建一个副本。
Datanode根据机架被组织起来,所有在一个机架上的所有节点被一个开关控制,所以一但关闭,整个机架都不工作了。同时数据可以被来自其它机架的机器所访问。具体关于机架的细节,我会在以后机架感知章节提出。
在前文中提到过,默认的复制因子是3,修改这个因子可以通过修改配置文件hdfs-site.xml去实现。
d.高度可用性
复制数据块儿和跨集群存储可以提供高数据可用性,即是网络连接和节点或者硬件坏了,我们也可以轻松的从其它3个节点获取数据。
e. 数据可靠性
g. 高吞吐量的访问数据
Hadoop分布式文件系统提供高吞吐量的访问数据。吞吐量是单位时间内完成工作的数量,它被用来描述,系统访问数据有多快,这个指标经常被用于测试系统的表现。当我们想执行一个任务或者一个动作的时候,这个任务被分解给不同的系统。所以所有的系统都会被平行的执行它们自己部分。这就使工作会在很短的时间内完成。利用这点,HDFS给予了非常棒的吞吐量。平行读取数据的方式,使我们降低了读取超大数据所需的时间。
- Hadoop HDFS 操作
在Hadoop中,我们需要通过编程或命令行方式跟文件系统进行交互。
Hadoop 分布式文件系统和Linux文件系统有诸多相似之处。所以我们几乎可以将用于本地文件系统的所有操作命令都用到HDFS文件系统操作中来,比如,创建一个路径,复制一个文件,更改权限等等。
它也可以控制权限,例如,给不同的用户,不同的分组,创建不同的读写权限。
我们可以通过用浏览器访问http://master-IP:50070去访问文件系统,通过访问上述地址,你可以得到集群信息,比如,磁盘使用情况,活动节点的数量,死节点的数量等等。
9.1 HDFS读取操作
当客户端想读取一个文件的时候,客户端需要和NameNode节点进行交互,因为它是唯一存储数据节点元数据的节点。NameNode规定奴隶节点的存储数据的地址跟位置。客户端通过NameNode找到它需要数据的节点,然后直接在找到DataNode中进行读操作。考虑到安全和授权的目的,NameNode给客户端提供token,这个token需要出示给DateNote进行热证,认证通过后,才可以读取文件。
由于HDFS进行读操作的时候需要需要访问NameNode节点,所以客户端需要先通过接口发送一个请求,然后NameNode节点在返回一个文件位置。在这个过程中,NameNode负责检查,该客户端是否有足够的权限去访问这组数据?如果拥有权限,NameNode会将文件储存路径分享给该客户端,与此同时,namenode也会将用于权限检查的token分享给客户端。
当该客户端去数据节点读文件的时候,在检查token之后,数据节点允许客户端读特定的block. 一个客户端打开一个输入流开始从DataNode读取数据,然后,客户端直接从数据节点读取数据。
如果在读取数据期间datanodes突然废了,这个客户端会继续访问Namenode, 这是NameNode会给出这个数据节点副本的所在位置。
9.2 HDFS 写操作
我们知道读取文件需要客户端访问Namenode. 相似的写文件也需要客户端与NameNode进行交互。NameNode需要提供可供写入数据的奴隶节点的地址。
当客户端完成在block中写数据的操作时,这个奴隶节点开始复制自身给其他奴隶节点,知道完成拥有3个副本。当然这是在副本因子为3的时候的操作。当复制完成后,它会给客户端发一个通知,同样的这个授权步骤也和读取数据时一样。
当一个客户端需要写入数据的时候,它需要跟NameNode进行交互,客户端发送一个请求给NameNode, NameNode同时返回一个可写的地址给客户端。
NameNode分享可写数据的位置。然后客户端跟特定的DataNode进行交互,将数据直接写入进去。当数据被写入和被复制的过程完成后,datanode发送给客户端一个通知,告知数据写入已经完成。
我们已经讨论过在Hadoop HDFS系统中怎么写入文件,客户端第一步需要跟NameNode进行交互,然后向数据节点中写入数据。
当客户端完成写入第一个block时,第一个数据节点会复制一样的block给另一个DataNode, 然后在这个数据节点完成接收block之后,它开始复制这些blocks给第三个数据节点。第三个数据节点发送通知给第二个数据节点,第二个数据节点在发送通知给第一个数据节点,第一个数据节点负责最后通知客户端。不论复制因子是多少,客户端只发送一个数据副本给DataNode, DataNode完成后续所有任务的复制工作。所以,在Hadoop中写入文件并不十分消耗系统资源,因为它可以在多个数据点将blocks平行写入。