3.1分布式文件系统
3.1.1计算机的集群结构
1.单个计算机节点由处理器,内存,高速缓存和本地磁盘构成
2.分布式文件系统把文件分布到多个计算机节点中,成千上万个计算机节点构成集群
3.计算机节点放在机架(rack)上,每个机架8-64个节点,每个节点通过网络互连,多个不同机架采用另一级网络或者交换机互联
3.1.2 分布式文件系统结构
1.在windows,Linux等操作系统中,文件系统会把磁盘空间划分为512字节一组,成为磁盘块,他是文件系统读写的最小单位,文件系统的块(block)通常是磁盘块的整数倍
2.HDFS中默认一个块的大小是64MB(Hadoop1.0)
3.分布式文件系统中的节点分为名称节点(namenode)和数据节点(datanode),名称节点负责文件和目录的创建,删除,重命名等,同时也管理着数据节点的映射关系,因此,客户端只有访问名称节点才能请求到文件块的位置,数据节点负责数据的存储和读取
4.存储时,由namenode分配存储位置,然后由客户端把数据写入相应的datanode
5.读取时,客户端从namenode获得datanode和文件块的映射关系
6.datanode也要根据namenode的命令创建,删除数据块和冗余复制
3.1.3 分布式文件系统的设计需求
1.透明性:访问透明性,位置透明性,性能和伸缩透明性
2.并发控制
3.文件复制
4.硬件与操作系统的异构型
5.可伸缩性
6.容错
7.安全
3.2 HDFS简介
1.HDFS开源实现了GFS的基本思想,原来是Apache Nutch搜索引擎的一部分
2.HDFS要实现以下目标
*兼容廉价的硬件设备
*流数据读写----有很高的吞吐率
*大数据集
*简单的文件模型
*强大的跨平台兼容性
3.HDFS的局限
*不适合低延迟数据访问----低延迟可以使用Hbase
*无法高效存储大量小文件
*不支持多用户写入及修改文件----只允许对文件进行追加
3.3 HDFS的相关概念
3.3.1块
1.在传统的文件系统中,以数据块为单位,而不是以字节
2.HDFS默认块大小64MB,普通文件系统只有几千字节,这样做是为了最小化寻址开销
3.MapReduce中的Map任务一次只执行一个块中的数据,如果启动任务太少,就会降低作业的并行处理速度
4.HDFS采用抽象块概念的好处
*支持大规模文件存储
*简化系统设计
*适合数据备份
3.3.2名称节点和数据节点
1..namenode负责管理分布式文件系统的命名空间(namespace),保存了两个核心的数据结构----FSImage和EditLog
2. FSImage用于维护文件系统树以及所有文件和文件夹的元数据
3. EditLog记录了针对文件的创建,删除,重命名等操作
4.namenode记录了每个文件中各个块所在datanode的位置信息,但是并不会持久化存储这些信息,而是在系统每次启动时扫描所有的datanode重构得到这些信息
5.datanode是HDFS的工作节点,负责数据的存储和读取,会根据namenode或者客户端的调度来进行数据的存储和检索,并向namenode定期发送自己存储的块的列表
6.每个datanode的数据会保存在各自节 点的本地Linux文件系统中
3.4 HDFS体系结构
3.4.1概述
1.HDFS采用主从(Master/Slave)的结构模型,一个HDFS集群包括一个master和若干个slave
2.master作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问
3.salve一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读写请求,在名称节点的统一调度下进行数据块的创建,删除和复制等
4.每个salve会定期向master发送心跳信息,报告状态,如果没有按时发送会被记为宕机,不会再给他分配任何io请求
5.名称节点不参与数据的传输,只是把客户端请求的数据文件的位置发送给客户端,客户端直接访问数据节点
6.HDFS采用Java语言开发,任何支持JVM的机器都可以部署
7.HDFS集群中只有一个master,该节点负责所有元数据的管理,简化了分布式文件系统的结构,可以保证数据不会脱离namenode的控制,同时用户数据也不会经过namenode,大大减轻了服务器的负担
3.4.2HDFS命名空间的管理
1.HDFS的命名空间包括目录,文件和块
2.命名空间管理是指对HDFS中的目录,文件,块进行创建,修改,删除等基本操作
3.整个HDFS中只有一个命名空间,一个名称节点,这个名称节点管理命名空间
4.HDFS使用的是传统的分级文件体系,可以和普通文件系统一样创建,删除,重命名,转移目录和文件,但是,HDFS还没有实现磁盘配额和文件访问权限等功能,也不支持文件的硬连接和软(快捷方式)连接
3.4.3通信协议
1.HDFS是一个部署在集群上的分布式文件系统,需要通过网络传输
2.所有的HDFS通讯协议都是构建在TCP/IP协议基础上的,客户端可以配置一个端口向名称节点发起TCP连接,交互
3.名称节点与数据节点之间用数据节点协议进行进行交互
4.客户端与数据节点之间的交互是通过RPC来实现(远程连接)
5.名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求
3.4.4客户端
1.客户端并不属于HDFS的一部分
2.客户端可以支持打开,读取,写入等常见的操作,提供类似shell的命令行来访问HDFS中的数据
3.HDFS也提供了Java API ,客户端可以用应用程序来操作HDFS
3.4.5HDFS体系结构的局限性
*命名空间的局限性----名称节点是保存在内存中的,能容纳的对象(文件块)的大小有限
*性能受限----整个分布式文件系统的吞吐量受限于单个名称节点的吞吐量
*隔离问题----由于只有一个名称节点,一个命名空间,无法对不同应用进行隔离
*集群的可用性----master要是挂了,集群就挂了
3.5 HDFS的存储原理
3.5.1冗余数据保存
优点:*加快数据传输速度
*容易检查数据错误
*保证数据的可靠性
3.5.2数据存储策略
包括以下三点,是分布式文件系统的核心
1. 数据存放
*HDFS采用以机架(rack)为基础的数据存放策略,一个HDFS包含多个机架,不同机架直接通信需要路由器或者交换机
*同一机架中不同机器之间通信比不同机架之间通信带宽大
*HDFS默认每个数据节点在不同机架上
缺点:不能充分利用带宽
优点:安全,可靠
*HDFS默认的冗余复制因子数3,每一个文件块会被放在三个地方,本机,同一机架的机器上,不同机架的机器上
2. 数据读取
*HDFS提供一个API可以确定一个数据节点所属的机架的ID
3. 数据复制
*HDFS采用流水线复制策略,当客户端要往HDFS中写入一个文件时,这个文件首先会被写入本地,并切分成若干块,每个块大小由HDFS指定,每个块都向名称节点发起请求,名称节点会根据各个数据节点的使用情况给客户端发送一个数据节点的列表,客户端把数据挨个写入进去每4KB切换
3.5.3数据错误与恢复
主要包括以下三种情形
1. 名称节点出错
*名称节点保存了所有的元数据信息,最核心的两大数据结构FSImage和EditLog,如果这两个文件损坏,HDFS实例将失效
*因此,HDFS设置了备份机制,把这些核心文件同步到SecondNamenode上,这个服务器并不会处理任何请求,只当备份角色
2. 数据节点出错
*心跳机制
*冗余因子复制
3. 数据出错
*客户端在收到数据后,会通过MD5和shal对数据块进行校验
*在文件被创建的同时,客户端会对每一个文件块进行信息摘录,把这些信息写入同一路径的隐藏文件中,当客户端读取从HDFS上获得的文件时,会首先获取该信息,再检验,如果出错,客户端会到另一个数据节点访问,如果还错,就把这个错误报给名称节点,名称节点定期检查并重新复制这个块
3.6 HDFS的数据读写过程
*FileSystem是一个通用的文件系统抽象类,可以被分布式文件系统继承
*Hadoop为这个类提供了多个实现类
DistributedFileSystem
*FileSystem的open方法返回一个输入流FSDataInputStream,在Hadoop中是DFSInputStream
*FileSystem的create方法返回一个输入流FSDataOutputStream,在Hadoop中是DFSOutputStream
3.6.1 读数据过程
1.客户端连续调用open,read,close
3.6.2 读数据过程
1.客户端连续调用create,write,close