赞
踩
HDFS 是一个适合部署在廉价机器上的,具有高度容错性的,高吞吐量的分布式文件系统。
运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被设计成支持大文件存储,能在一个集群里扩展到数百个节点,能够存储海量的数据。
比如说,某个表 100亿条数据,你还用MySQL 去存么?一台机器你的配置得多高才行,再考虑一下查询的效率。如果用了分布式存储之后,也就是说,这些数据放到N多台机器里面去存储,每个机器只存储这个100亿数据的中的一部分,比如一台机器存 500万数据,HDFS 的定位就是针对这种超大的数据集存储的。
HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。而存储这些数据的机器出现故障的几率还是蛮高的,比如磁盘损坏,不能读写,网络故障等原因就会导致这台机器不能正常工作了。
因此错误检测和快速、自动恢复是HDFS最核心的架构目标,一旦HDFS 检测到集群中的某台机器出现问题,然后可以对故障进行恢复。
运行在HDFS 上面的应用和咱们平常写的这些普通应用不同,HDFS 读写文件系统上的数据的时候,是基于一种流的概念来读的,所谓的流式处理,就是批量对文件进行读写,保证高吞吐量的文件读写,不是低延迟的文件读写。
HDFS 是应用在离线批处理场景上面的,尤其是现在的离线数据仓库,用来做数据分析的,我们现在的离线分析,都是今天凌晨去把源系统的数据抽过来放到HDFS 里头,然后处理,都是一批一批的去处理这个数据,不是来一条就计算一条。
同时支持对文件的读和写,需要处理大量的并发冲突问题,想想平常大家在写代码的时候对有读,有写的集合这些加的读写锁,不加会出N多问题。 HDFS 这种大规模数据集的分布式存储,它的模型必须得去简化,它的文件只能一次写入,之后是只能去追加,不能随便修改之前的数据。
所以它的理念就是 :write-once,ready-many-times,一次写,然后多次读,这样就没有数据读写并发冲突,以及数据如何维护一致性的问题了。
这种一次写,多次读的模型,也能大大提升HDFS 的吞吐量。
大家想想,咱们在读取数据的时候,是从本地磁盘读取数据快,还是从网络中的其他机器上读取数据快?是不是数据越靠近这个机器,速度越快,效率越高。
所以说,在分布在多台机器上的数据,进行分布式的计算,需要让你的计算任务更靠近这些数据,而不是在集群里面通过网络到处去传输数据。
分布式系统中比较经典的架构是master-slave ,HDFS 就是采用的这种master-slave 架构,一个HDFS 集群是由一个NameNode 和多个DataNode 组成的。
NameNode 是一个进程,JVM 进程,也是一个系统,我们可以认为 NameNode 就是这个master (可以理解成一个大管家),在一个普通的HDFS 集群里面,NameNode 只有一个。它负责管理文件系统命名空间(filesystem namespace)以及客户端对文件的访问。
DataNode 也是一个进程,集群中的每台机器上都有一个DataNode 进程,它主要负责本机上的数据的存储。
命名空间,怎么理解?就从我们的电脑的文件夹来说,存放的数据都是按照这种目录-> 文件的方式,目录下面可能又是下一层目录。
比如下面的我电脑上的目录结构 ,/文稿/数仓/ 这个目录下面有文件 数仓建设方法xxx.doc 和 目录 /12_资料 ,目录 /12_资料 下面有 04_大数据体系技术结构xxx.doc 这些文档。
所以说,这套文件系统的目录的层级结构和文件的对应关系,就是所谓的 Filesystem Nams
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。