赞
踩
第6章HDFS概述
6.1HDFS的主要特性
1.HDFS的主要特征
l 支持超大文件
l 检测和快速应对硬件故障
l 流式数据访问
l 简化一致性模型(1次写多次读)
2.HDFS不适合的场景
l 低延迟数据访问,可以考虑HBase或者Cassandra
l 大量小文件
l 多用户写入文件、修改文件
3.HDFS体系结构(Master/Slave)
由Namenode,SecondaryNameNode,DataNode,Client四部分组成
l 数据块
HDFS默认的数据块是64MB,使用数据块的好处
1) HDFS可以保存比存储节点单一磁盘大的文件
2) 简化了存储子系统
3) 方便容错,有利于数据复制(3副本方式)
l NameNode和SecondaryNameNode
Namenode:维护整个文件系统的文件目录树,文件/目录的元信息和文件的数据块索引,即每个文件对应的数据块列表,这些信息存储在本地文件系统:一种是命名空间镜像(File System Image,FSImage,保存某一时刻HDFS的目录树,元信息,数据块索引),另一种是命名空间镜像的编辑日志(Edit Log),由这两种构成了完整的NameNode第一关系
通过NameNode,Client可以了解到数据块所在的数据节点信息,NameNode每次启动后便会动态地构建这些信息,此为NameNode的第二关系
除此之外,Namenode还能获得HDFS运行状态,包括系统的可用空间,已经使用的空间,各数据节点的当前状态等等
SecondaryNameNode用于定期合并命名空间镜像和镜像编辑日志的辅助守护进程
l DataNode(将HDFS数据块写到Linux本地文件系统的实际文件中,或者从这些实际的文件中读取数据块)
客户端读取数据块过程:
1) 客户端请求NameNode获得请求数据块所在的DataNode信息
2) 根据DataNode守护进程,处理数据块对应的Linux本地文件
3) DataNode与其他DataNode通信,复制数据块保证冗余性
l Client
HDFS提供了多种Client接口包括命令行,Java API,Thrift接口,C语言库,用户空间文件系统
1) 命令行
HDFS文件系统创建目录:
hadoop fs –mkdir testDIR
本地文件上传到HDFS:
hadoop fs –copyFromLocaltestInput/hello.txt /user/alice/in/hello.txt
2)Java API(本地数据写入HDFS文件)
Path path=newPath(“hdfs://ip:port/user/alice/in/hello.txt”);
FileSystemhdfs=FileSystem.get(path.toUri,conf);
FSDataOutputStream fout=hdfs.create(path);
String data=”testingtesing”;
for(int i=0;i<256;i++){
fout.write(data.getBytes());
}
fout.close();
FileStatus stat=hdfs.getFileStatus(path);
H dfs.delete(path);
3.HDFS源码结构
l hdfs.security.token.block和hdfs.security.token.delegation结合Hadoop的安全框架提供安全访问HDFS的机制
l hdfs.server.common包含Namenode和DataNode共享功能(系统升级、存储空间)
l hdfs.protocol 提供HDFS实体间IPC交互的接口
l hdfs.server.namenode、hdfs.server.datanode、hdfs包含了NameNode、DataNode和Client的实现
l hdfs.server.namenode.metrics和hdfs.server.datanode.metrics实现了Namenode和DataNode上度量数据(写入字节数、被复制块数量)的收集功能
l hdfs.toolls和hdfs.server.balancer提供查询HDFS状态信息的工具dfsadmin、文件系统检查工具fsck和HDFS均衡器balancer
l hdfs.web.resources,hdfs.server.namenode.web.resources,hdfs.server.datanode.web.resources,hdfs.web提供了WebHDFS即通过HTTP访问HDFS的机制,实现了C客户端和用户空间文件系统(FUSE)
6.2 基于远程过程调用的接口
NameNode,DataNode,Client之间通信接口包括:
1) Hadoop远程过程调用接口
2) 基于TCP或者HTTP的流式接口
上述接口又分为三大类
1) 客户端相关的接口(org.apache.hadoop.hdfs.protocol)
Ø ClientProtocol:客户端与Namenode之间的接口
Ø ClientDatanodeProtocol:客户端与DataNode之间的接口,客户端与数据节点之间的交互主要通过流接口进行读/写文件数据的操作,错误发生时客户端配合数据节点进行恢复,当客户端继续进行本地文件读优化时,需要通过IPC接口获取一些信息
2) 服务器间的接口(org.apache.hadoop.hdfs.server.protocol)
NameNode、SecondaryNameNode、DataNode之间的IPC调用关系
Ø DatanodeProtocol:DataNode与NameNode之间的接口,HDFS的主从体系结构中,由从节点DataNode不断通过此接口向主节点NameNode报告信息,同时有些方法的返回值会待会NameNode指令,根据这些指令数据节点或者移动或者删除或者恢复本地磁盘上的数据块,或者执行其他操作
Ø InterDatanodeProtocol:DataNode与DataNode之间的接口,用于与其他DataNode进行通信,恢复数据块保证数据的一致性
Ø NamenodeProtocol:SecondaryNameNode,HDFS Balancer与Namenode之间的接口,主要是SecondaryNameNode不断合并本地命名空间镜像和编辑日志得到新的命名空间镜像通过此接口上传至Namenode,也可以为HDFS Balancer提供配置信息
3) 与安全有关的接口(org.apache.hadoop.security.authorize和org.apache.hadoop.security)
1. 与客户端有关的接口
ClientProtocol和ClientDatanodeProtocol
与数据块相关、与数据节点相关、和HDFS文件元数据相关
1) 与数据块相关
数据块的类是org.apache.hadoop.hdfs.protocol.Block,包含3个成员变量blockId(数据块标识),numBytes(文件数据大小),generationStamp(版本号,一致性检查),blockName为blk_blockId
数据块的存储位置LocatedBlock
ClassLocatedBlock{
Block b;//指定数据块
long offset;//数据块在本地文件中的偏移量
DatanodeInfo[]locs;//数据块在哪些Datanode上
boolean corrupt;//数据块是否损坏
}
多个数据块的存储位置LocatedBlocks
class LocatedBlocks{
LocatedBlock[] locatedBlocks;
long fileLength; //对应文件长度
boolean underConstruction;//该文件是够处于构建状态标志
}
BlockLocalPathInfo应用于ClientDatanodeProtocol中,,用于优化HDFS读文件的数据节点本地读优化,当客户端发现它与它读取的数据块在同一台主机上时,可以直接读取本地文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。