HDFS(Hadoop Distribute File System)基于谷歌发布的GFS论文呢设计(RPC通信方式)
大文件、流式数据适合、大量小文件、随机写入、低延迟读取不适合。
特点
高容错、高吞吐量、大文件存储
HDFS能做什么
硬件失效
流式数据访问:块方式读取、128M一个块(大文件的读取)
存储数据大:
数据的一致性:一次写入多次读取、支持追加不能修改
多硬件平台:
移动计算能力:就近原则(计算离数据最近的副本数据)、可减少网络负载、降低网络拥堵
HDFS架构
namenode:存储生成文件系统的元数据(目录树结构、文件块、块编号及datanode的分布)
secondary namenode:
datanode:
流程:客户端-namenode-客户端-datanode
HDFS关键设计
主从模式
统一文件系统命名空间
数据副本机制
元数据(持久化机制):
统一通讯协议:
健壮机制:
数据组织:
访问方式:
空间回收机制:
HDFS数据读取流程
1、业务应用调用HDFS Client提供的API打开文件
2、HDFS Client联系Namenode获取到文件信息(数据块、datanode位置信息)
3、业务应用调用read API读取文件
4、HDFS Client根据从Namenode获取到的信息,联系Datanode,获取的相应数据块(Client采用就近原则读取数据)
5、HDFS Client会与多个Datanode通讯获取数据块
6、数据读取完成后,业务调用close关闭连接
HDFS写入流程
1、业务应用调用HDFS Client提供的API创建文件,请求写入
2、HDFS Client联系Namenode,namenode在元数据中创建文件节点
3、业务应用调用write API写入文件
4、HDFS Client收到业务数据后,从Namenode获取到数据块编号、位置信息,联系datanode并将需要与数据的datanode建立起流水线,完成后,客户端再通过自有协议写入数据到datanode1,再由datanode1复制到datanode2,datanode3
5、写完的数据,将返回确认信息给HDFS Client
6、所有数据确认完成后,业务调用HDFS Client关闭文件
7、业务调用close flush后,HDFSClient联系Namenode,确认数据包写入完成,Namenode持久化元数据
注:客户端执行完write操作后,写完的block才是可见的,正在写的block对客户端是不可见的,只有调用close方法时会默认调用sync方法,是否需要手动调用取决于你根据程序需要在数据健壮性和吞吐率之间权衡
数据副本机制
副本距离计算公式:
Distance(Rack 1/D1 Rack1/D1)=0同一台服务器的距离为0
Distance(Rack 1/D1 Rack1/D3)=2同机架不同服务器距离为2
Distance(Rack 1/D1 Rack2/D1)=4不同机架服务器距离为4
副本放置策略:
第一副本在本地机器
第二副本在远端机器
第三副本首先确认之前的两个副本是否在同一个机架,如果是则选择其他的机架,否则选择和第一副本相同机架的不同节点
第四副本及以上随机选择副本存放位置
数据持久化
1、主namenode接收文件系统操作请求,生成editlog,并回滚日志,向editlog.new中记录日子
2、备用namenode从主namenode上下载FSImage,并从共享存储中读取editlog
3、备用namenode将日志和旧的元数据合并,生成新的元数据FSImage.ckpt
4、备用namenode将元数据上传到主用namenode
5、主namenode将上传的元数据进行回滚
6、循环操作
元数据持久化健壮机制:HDFS主要目的是保证存储数据的完整性,对于 各个组件的失效,做了可靠性处理
重建失效数据盘的副本
datanode与namenode之间通过心跳周期回报状态数据,namenode管理数据块是否报完整,如果datanode因硬盘损坏未上报数据块,namenode将发起副本重建动作恢复丢失的副本
集群数据均衡:HDFS架构设计了数据均衡机制,以此机制保证数据在各个datanode上存储是平均的
数据的有效性保证:datanode存储在硬盘上的数据块,都有一个检验文件与之对应,在读取数据时,datanode会校验其有效性,若校验失败,则HDFS客户端将从其他数据节点读取数据,并通知namenode,发起副本恢复
元数据可靠性保证:采用日志机制操作元数据,同时元数据存在主备namenode上,快照机制实现了文件系统常见的快照机制,保证数据误操作时能及时恢复
安全模式:HDFS提供独有的安全模式机制,在数据节点故障,硬盘故障时,能防止故障扩散
HDFS高可靠性
在基本架构上增加了一下组件:
ZK:分布式协调,主要用来存储HA下的状态文件,主备信息。ZK数量基数3个及以上
namenode主备模式,主提供服务,备用于合并元数据并作为主的热备
ZKFC(zookeeper Failover Controller)用于控制Namenode的节点主备状态
JN(journalnode)用于共享存储,namenode生成的editlog
命令类别 | 命令 | 命令说明 |
dfs | -cat | 显示文件内容 |
-ls | 显示目录列表 | |
-rm | 删除文件 | |
-put | 上传文件到hdfs | |
-get | 从hdfs下载文件到本地 | |
-mkdir | 创建目录 | |
-chmod/-chown | 改变文件属组 | |
... | ... | |
dfsadmin | -safemode | 安全模式操作 |
-report | 报告服务状态 | |
balancer | -threshold | 容量均衡阙值 |
参数 | 默认值 | 说明 |
dfs.replication | 3 | HDFS存储数据的副本数,建议为3,修改后,hdfs将全局刷新副本数 |
dfs.client.block.write.replace-datanode-on-failure.replication | 2 | 客户端再写入数据时会强制要求所有数据写成功,否则就写入失败,当数据节点为3台时,建议修改为2,防止数据节点复位写入失败。 |
dfs.namenode.rpc.port | 8020 | hdfs内部rpc的通讯端口 |
dfs.namenode.http | 25000 | hdfs http服务端口 |
参数 | 默认值 | 说明 |
dfs.namenode.image.backup.nums | 48 | 元数据备份个数,元数据备份为每30分钟备份,48可以备份一天的元数据 |
dfs.block.size | 134217728 | 数据块大小,默认是128M,单位为字节,系统安装之后不建议修改 |
dfs.namenode.handler.count | 64 | namenode并行处理任务数,调大可以提高性能 |
fs.trash.checkpoint.interval | 60 | HDFS回收站扫描周期 |
fs.trash.interval | 1440 | hdfs回收站文件删除时间,单位为1分钟,默认一天 |
dfs.permissions.enabled | true | hdfs文件系统是否启用acl的安全管理,建议打开 |
参数 | 默认值 | 说明 |
dfs.block.size | 134217728 | 数据块大小,默认安装是128M,单位为字节,系统安装后不建议修改 |
dfs.datanode.handler.count | 8 | datanode并行处理的任务数,调大可以提高性能 |
dfs.datanode.directoryscan.interval | 21600 | datanode数据块校验周期,此功能用于检查损坏的数据块,默认是21天,参数单位为小时 |
dfs.datanode.balance.bandwidthPerSec | 20971520 | hdfs balance功能的最高流量,调大后能缩短balance时间,但是会占用较大的网络带宽 |
dfs.datanode.data.dir.perm | 700 | datanode创建存储目录的默认权限,能防止数据被非root账号非法读取。 |