3.2HDFS的概念

3.2.1 数据块

Ⅰ数据块

数据块是磁盘进行数据读写的最小单位.

文件系统通过磁盘块来管理该文件系统的块.该文件系统块的大小可以是磁盘块的整数倍.

ⅡHDFS的分块

HDFS上的块要比普通的磁盘块要大得多,一般为128MB.

HDFS中小于一个块大小的文件不会占据整个块的大小.

:HDFS中的块为什么这么大?

为了最小化寻址开销,使得传输一个由多个块组成的大文件的时间取决于磁盘传输速率.

Ⅲ对分布式文件系统中的块进行抽象的好处?

        第一,一个文件的大小可以大于网络中任意一个磁盘的容量.可以利用集群上任意一个磁盘进行存储.

        第二,简化了存储子系统的设计.简化存储管理,消除了对元数据的顾虑.

        第三,块非常适合用于数据备份进而提供数据容错能力和提高可用性.

注:HDFS中的fsck指令可以显示块信息.

3.2.2namenode和datanode

HDFS集群以管理节点-工作节点(一个或多个)模式运行.

namenode管理文件系统的命名空间,维护着文件系统树及整棵树内所有的文件和目录.这些信息以命名空间镜像文件和编辑日志文件两个文件形式永久保存在本地磁盘上,同时,namenode也记录每个文件中各个块的数据节点信息.

客户端代表用户通过namenode和datanode交互访问整个文件系统.

对namenode实现容错的两种机制

第一种,备份那些组成文件系统元数据持久状态的文件.将持久状态写入本地磁盘的同时,写入一个远程挂载的网络文件系统.

第二种,运行一个辅助namenode.主要作用:.保存namenode的副本,定期合并编辑日志与命名空间,以防止编辑日志过大.

3.2.3块缓存

对于访问频繁的文件,其对应的块可能被显式地缓存在datanode地内存中,以堆外块缓存地形式存在.

块缓存的优势:作业调度器通过在缓存块的datanode上运行任务,可以提高读操作的性能.

缓存池:用于管理缓存权限和资源利用的管理性分组.

3.2.4联邦HDFS

联邦HDFS允许系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间中的一部分.

命名空间卷:由命名空间的元数据和一个数据块池组成,数据块池包含该命名空间下文件的所有数据块.

命名空间卷之间相互独立.

3.2.5 HDFS的高可用性

在namenode失效时,启动新的namenode响应服务需要满足的三种情形:

        Ⅰ.将命名空间的映像导入内存中.

        Ⅱ.重演编辑日志.

        Ⅲ.接收到足够多的来自datanome的数据块报告并退出安全模式.

活动-备用namnde:当活动namenode失效时,备用namende就会接管它的任务并开始服务于来自客户端的请求.

在活动-备用namenode都失效时,管理员可以声明一个备用namenode并实现冷启动.

故障切换与规避

3.3命令行接口

文件系统的基本操作 

可以输入hadoop fs -help 命令获取每个命令的详细帮助文件

注:HDFS中的文件访问权限

三种权限模式:只读权限r,只写权限w,可执行权限x.对于超级用户,系统不会执行任何权限检查

3.4Hadoop文件系统

Hadoop对文件系统提供了许多接口,一般使用URI方案来选取合适的文件系统实例进行交互.

接口:通过JAVA API可以调用大部分Hadoop文件系统的交互操作.

Ⅰ.HTTP:

        其他语言可以使用HTTP REST API与HDFS交互.

        两种访问方法:直接访问,通过代理(一个或多个)访问.

Ⅱ.C语言:

        Hadoop提供了一个名为 libhafs 的C语言库.

Ⅲ.NFS:

        使用Hadoop的NFSv3网关将HDFS挂载为本地客户端的文件系统是可行的,然后通过UNIX实用程序于该文件系统进行交互.

Ⅳ.FUSE:

        用户空间文件系统允许将用户空间实现的文件系统作为Unix系统进行集成.

3.5JAVA接口

Hadoop的Filesystem类:于Hadoop的某一文件系统进行交互的API.

3.5.1从Hadoop URL读取数据

从Hadoop文件系统读取文件,最简单的方法是使用java.net.URL对象打开数据流,从中读取数据.

可以调用Hadoop中简洁的 IOUtils 类,并在 finally 子句中关闭数据流,也可以在输入流和输出流之间复制数据.

3.5.1通过FileSystem API读取数据

Hadoop文件系统通过Hadoop  Path对象来代表文件.可以将路径视为一个Hadoop文件系统URI.

Configuration对象:封装了客户端或服务器的配置,通过设置配置文件读取路径实现(Ⅰ.方法一返回默认文件系统.Ⅱ.方法二通过给定的URI方案和权限来确定要使用的文件系统.Ⅲ.方法三作为给定用户来访问文件系统,对安全来说至关重要)

open() 函数:调用open() 函数来获取文件的输入流.

FSDatainputStream对象:open() 的返回类对象,支持随机访问,可以从流的任意位置读取数据.

Seekable接口:支持在文件中找到指定危机,并提供一个查询当前位置相对于文件起始位置偏移量( getPos() )的查询方法

seek() 会引发异常且高开销.

skip() 只能相对于当前位置定位到另一个新位置.

read() 方法从文件的指定position处读取至多为length字节的数据并存入缓冲区buffer的指定偏离量offset处,返回值是实际读到的字节数(可能小于length)

3.5.3写入数据

最简单的方法是给准备建的文件指定一个Path对象,然后返回一个用于写入数据的输出流

3.5.4目录

filesystem实例提供一次性新建所有必要但还没有的父目录.

3.5.5查询文件系统

1.文件元数据:FileStatus

File Status类封装了文件系统中文件和目录的元数据.

2,列出文件

ListStatus() 方法

3.文件模式

在一个表达式中使用通配操作符来匹配多个文件.

4.PathFilter对象

以编程形式控制通配符

3.5.6 删除数据

delete() 方法可以永久删除文件或目录

3.6数据流

3.6.1刨析文件读取

        (直接看书上的实例)

3.6.2刨析文件写入

        (直接看书上的实例)

3.6.3一致模型

文件系统的一致模型描述了文件读/写的数据可见性.

新建一个文件后,嫩在文件系统的命名空间立即可见.

但是,写入文件的内容并不能保证能立即可见.

当写入的数据超过一个块后,第一个数据块对新的reader就是可见的,之后的块也不例外.

hflush() 方法,强行将所有缓存刷新到datanode中,使得到目前为止写入的数据均到达所有datanode的写入管道并且对所有新的reader均可见.

为确保数据写入到磁盘上,可以用 hsync() 替代.

3.7通过 distcp 并行复制

保持HDFS集群的均衡

向HDFS复制数据时,考虑集群的均衡性是相当重要的.