hdfsgo语言接口 hdfs教程( 三 )


PS:笔者新手一枚,如果看出哪里存在问题,欢迎下方留言!
Hadoop Distributed File System(HDFS)是高容错、高吞吐量、用于处理海量数据的分布式文件系统 。
HDFS一般由成百上千的机器组成 , 每个机器存储整个数据集的一部分数据,机器故障的快速发现与恢复是HDFS的核心目标 。
HDFS对接口的核心目标是高吞吐量而非低延迟 。
HDFS支持海量数据集合,一个集群一般能够支持千万以上数量级的文件 。
HDFS应用需要对文件写一次读多次的接口模型,文件变更只支持尾部添加和截断 。
HDFS的海量数据与一致性接口特点,使得迁移计算以适应文件内容要比迁移数据从而支持计算更加高效 。
HDFS支持跨平台使用 。
HDFS使用主从架构 。一个HDFS集群由一个NameNode、一个主服务器(用于管理系统命名空间和控制客户端文件接口)、大量的DataNode(一般一个节点一个,用于管理该节点数据存储) 。HDFS对外暴露了文件系统命名空间并允许在文件中存储用户数据 。一个文件被分成一个或多个块,这些块存储在一组DataNode中 。NameNode执行文件系统命名空间的打开关闭重命名等命令并记录着块和DataNode之间的映射 。DataNode用于处理客户端的读写请求和块的相关操作 。NameNode和DataNode一般运行在GNU/Linux操作系统上,HDFS使用Java语言开发的,因此NameNode和DataNode可以运行在任何支持Java的机器上 , 再加上Java语言的高度可移植性,使得HDFS可以发布在各种各样的机器上 。一个HDFS集群中运行一个NameNode,其他机器每个运行一个(也可以多个,非常少见)DataNode 。NameNode简化了系统的架构,只用于存储所有HDFS元数据,用户数据不会进入该节点 。下图为HDFS架构图:
HDFS支持传统的分层文件管理 , 用户或者应用能够在目录下创建目录或者文件 。文件系统命名空间和其他文件系统是相似的,支持创建、删除、移动和重命名文件 。HDFS支持用户数量限制和访问权限控制 , 不支持软硬链接,用户可以自己实现软硬链接 。NameNode控制该命名空间,命名空间任何变动几乎都要记录到NameNode中 。应用可以在HDFS中对文件声明复制次数,这个次数叫做复制系数,会被记录到NameNode中 。
HDFS将每个文件存储为一个或多个块,并为文件设置了块的大小和复制系数从而支持文件容错 。一个文件所有的块(除了最后一个块)大小相同,后来支持了可变长度的块 。复制系数在创建文件时赋值,后续可以更改 。文件在任何时候只能有一个writer 。NameNode负责块复制,它周期性收到每个数据节点的心跳和块报告 , 心跳表示数据节点的正常运作,块报告包含了这个DataNode的所有块 。
副本存储方案对于HDFS的稳定性和性能至关重要 。为了提升数据可靠性、灵活性和充分利用网络带宽,HDFS引入了机架感知的副本存储策略,该策略只是副本存储策略的第一步,为后续优化打下基础 。大型HDFS集群一般运行于横跨许多支架的计算机集群中,一般情况下同一支架中两个节点数据传输快于不同支架 。一种简单的方法是将副本存放在单独的机架上,从而防止丢失数据并提高带宽,但是增加了数据写入的负担 。一般情况下 , 复制系数是3 , HDFS存储策略是将第一份副本存储到本地机器或者同一机架下一个随机DataNode,另外两份副本存储到同一个远程机架的不同DataNode 。NameNode不允许同一DataNode存储相同副本多次 。在机架感知的策略基础上,后续支持了 存储类型和机架感知相结合的策略  , 简单来说就是在机架感知基础上判断DataNode是否支持该类型的文件 , 不支持则寻找下一个 。

推荐阅读