这是我参与「第四届青训营 」笔记创作活动的的第8天
HDFS的设计与实现
HDFS是为大数据集设计的一种可扩展、高可用、高可靠的分布式文件系统,适合一次写入,多次读的场景
写:应用程序的写操作被透明地重定向到这个临时文件。当这个临时文件累积的数据量超过一个数据块的大小,客户端才会联系Namenode。Namenode将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回Datanode的标识符和目标数据块给客户端。接着客户端将这块数据从本地临时文件上传到指定的Datanode上。当文件关闭时,在临时文件中剩余的没有上传的数据也会传输到指定的Datanode上。然后客户端告诉Namenode文件已经关闭。此时Namenode才将文件创建操作提交到日志里进行存储。如果Namenode在文件关闭前宕机了,则该文件将丢失。
复制:当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。
HDFS的架构原理
(1)支持超大数据集
hdfs分布式存储,定位针对超大数据集,比如30亿数据,每台机器存储大数据集的一部分
(2)应对硬件故障
大数据的理念,是不需要使用商用小型机,服务器,商用设备
大数据系统就部署在普通机器上就行了,比如16核64G的物理机
一般部署几十台、几百台、几千上万台机器都有可能
普通机器硬件容易出现故障,hdfs的理念是可以自动探查集群中某台集群出现故障,自动对故障进行恢复,而且速度比较快
(3)流式数据处理
hdfs读写文件系统上的数据的时候,是基于流的一种概念来的,英文名词是:streaming access。
hdfs用这个所谓的流式数据处理,其实主要就是为了保证高吞吐量的文件读写,而不是低延迟的文件读写。
hdfs是用在离线批处理场景的,尤其是数据仓库,数据分析这块。今天凌晨把昨天所有的数据都给在比如半小时内处理完毕。而不是数据来一条你就算一条
(4)简化的数据一致性模型
同时支持文件的读和写会有大量的并发冲突问题,非常麻烦
hdfs为了支持超大数据集,分布式存储,离线批量处理,它的数据一致性模型是简化的,一个文件只能一次写入,然后之后只能追加,不能随便修改之前的数据
它的理念是write-once,ready-many-times,一次写,然后多次读,这样就没有数据读写并发冲突,以及数据如何维护一致性的问题了
(5)尽量移动计算,但是不要移动数据
你要对分布在多台机器上的数据,进行分布式计算,使用比如mapreduce或者是spark都可以,那么此时尽可能让你的计算任务是靠近这个数据,而不是说在集群里通过网络胡乱传输数据,那样会导致性能极差极差
HDFS的应用场景
海量数据存储: HDFS可横向扩展,其存储的文件可以支持PB级别或更高级别的数据存储。
高容错性:数据保存多个副本,副本丢失后自动恢复。可构建在廉价的机器上,实现线性扩展。当集群增加新节点之后,namenode也可以感知,进行负载均衡,将数据分发和备份数据均衡到新的节点上。
商用硬件:Hadoop并不需要运行在昂贵且高可靠的硬件上。它是设计运行在商用硬件(廉价商业硬件)的集群上的。 大文件存储:HDFS采用数据块的方式存储数据,将数据物理切分成多个小的数据块。所以再大的数据,切分后,大数据变成了很多小数据。用户读取时,重新将多个小数据块拼接起来。一次写入多次读取。HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。