《Hadoop权威指南》---分布式文件系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hy_coming/article/details/82827505

一、概述

当数据集的大小超过一台独立的物理计算机的存储能力时,就需要对他进行分区并存储在若干单独的计算机上,管理网络中的跨多台计算机存储的文件系统称为分布式文件系统。当然因为架构与网络之上,所以保证他的正确性也是一项比较大的挑战。

二、HDFS(Hadoop Distributed Filesystem)

HDFS是以流式数据访问模式来存储超大文件,运行与商用硬件集群上。HDFS会有块(block)的概念,默认为64MB,之所以设置的这样大,是为了最小寻址开销,保证传输一个由多个块组成的文件的时间取决于磁盘传输效率。还有分块带来的好处就是对于一个文件的大小可以大于网络中任意一个磁盘的容量,文件的所有块并不需要存储在同一个磁盘上,可以利用集群上的任意一个磁盘来存储。还有一个好处就是使用抽象块而非整个文件作为存储单元,大大简化了存储子系统的设计。

  • namenode和datanode:HDFS有两类节点管理者(namenode 1个)-工作者(datanode 多个)模式运行,客户端通过与namenode和datanode的交互来访问整个文件系统,但是问题是一旦namenode失效,整个文件都会丢失,解决的办法就是备份那些组成文件系统元数据持久状态的文件,还有就是运行一个辅助的namenode,随着技术的发展,后来引入了联邦HDFS语允许系统添加namenode实现扩展,每个namenode管理文件系统命名空间中的一部分,各部分之间相互独立,这样datanode需要注册到每个namenode,并且存储着来自多个数据块池中的数据块。但是这种备份namenode元数据和通过备用namenode创建监测点能防止数据丢失,但是依旧无法实现文件系统的高可用性,namenode依旧存在单点失效(SPOF)的问题。就算启动备用namenode也是冷启动需要30分总或者更长的时间,所以后来HDFS增加了对高可用性(HA)的支持,做到这些需要从架构上去修改:实现编辑日志的共享;同时向两个namenode发送数据块处理报告;客户端使用特定的机制来处理namenode的失效问题。
  • 那么在namenode故障之前需要一个故障转移控制器来来管理将namenode转移到备用namenode上,但是现在的问题就是当无法确切知道namenode是否已经停止运行,如:网速非常慢或者网络被分割的情况下,同样有可能激发故障转移,但是先前的namenode依然运行,为了保证先前活动的namenode不会执行以免危害系统,引入了一系列的规避机制,包括杀死namenode进程,收回访问共享目录的权限(通常使用供应商指定的NFS命令)。

三、JAVA接口

java中的抽象类org.apache.hadoop.fs.FileSystem定义了一个文件系统接口。

四、数据流

  • 读取过程:DistributedFileSystem通过使用RPC来调用namenode,以确定文件起始块的位置,namenode返回该块副本datanode地址,datanode根据与客户端的距离来排序,获取最近的,如果客户端本身就是datanode就会在本地获取,DistributedFileSystem类返回一个FSDataInputStream类转而封装DFSInputStream对象,该对象管理着datanode和namenode的I/O,客户端针对这个输入流调用read()方法,存储文件起始几个块的datanode地址的DFSInputStream随即连接距离最近的datanode,通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端,到达块的末端时,DFSInputStream关闭与该datanode的连接,然后寻找下一块最佳的datanode。
  • 写入过程:DistributedFileSystem对象调用create()函数来创建文件。DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件还没有相应的数据块,namenode执行各种不同的检查以确保这个文件不存在以及客户端有新建该文件的权限,namenode会创建新文件记录一条记录,DistributedFileSystem向客户端返回一个FSDataInputStream对象,由此客户端可以开始写入数据。

五、工具

  • Apache Flume:一个将大规模流数据导入HDFS的工具,最典型的应用是从另一个系统中收集日志数据。
  • Apache Sqoop:是为了将数据库从结构化存储设备批量导入HDFS中设计的,如关系数据库
  • distcp:分布式复制程序,可以从hadoop文件系统间复制大量数据,典型案例就是两个HDFS集群之间传输数据
  • balancer:均衡器,HDFS复制数据的时候,需要烤炉集群的均衡性,需要限制map的数量以便另外一些节点可以运行其他作业。
  • archive:运行一个MapReduce作业来并行处理所有的输入文件
  • HAR:一种文件格式,包含两个索引文件以及部分文件的集合。缺点就是创建副本占用磁盘资源,不能修改等。

猜你喜欢

转载自blog.csdn.net/hy_coming/article/details/82827505