Hadoop学习笔记之HDFS扫盲

来源:互联网 发布:骑枕头知乎 编辑:程序博客网 时间:2024/05/19 20:41
一、HDFS的作用:
1、提供分布式存储机制,提供可线性增长的海量存储能力
2、自动数据冗余,无须使用Raid,无须另行备份
3、为进一步分析计算提供数据基础

二、HDFS设计基础与目标:
1、硬件错误是常态。因此需要冗余
2、流式数据访问。即数据批量读取而非随机读写,Hadoop擅长做的是数据分析而不是事务处理
3、大规模数据集
4、简单一致性模型。为了降低系统复杂度,对文件采用一次性写多次读的逻辑设计,即是文件一经写入,关闭,就再也不能修改
5、程序采用“数据就近”原则分配节点执行

三、HDFS体系结构:
1、NameNode:
管理文件系统的命名空间
记录每个文件数据块在各个Datanode上的位置和副本信息
协调客户端对文件的访问
记录命名空间内的改动或空间本身属性的改动
Namenode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等
ls -li tmp/dfs/name/current
总计 1044
27918516 -rw-rw-r-- 1 mals mals 1048580 04-12 17:04 edits    //编辑日志,记录执行的操作
27918523 -rw-rw-r-- 1 mals mals     913 04-12 16:55 fsimage  //映像文件,保存内存写入的数据
27918506 -rw-rw-r-- 1 mals mals       8 04-12 16:55 fstime   

27918509 -rw-rw-r-- 1 mals mals     100 04-12 16:55 VERSION  //节点的命令空间、创建时间类型、hdfs的构造版本标示

2、DataNode:

负责所在物理节点的存储管理
一次写入,多次读取(不修改)
文件由数据块组成,典型的块大小是64MB
数据块尽量散布道各个节点
ls -li dfs/data/current/
总计 124
22765601 -rw-r--r-- 1 mals users 16382 04-12 17:06 blk_5317876266899773923
22765602 -rw-r--r-- 1 mals users   135 04-12 17:06 blk_5317876266899773923_1024.meta
22757379 -rw-r--r-- 1 mals users   868 04-12 17:14 dncp_block_verification.log.curr      //

22757378 -rw-r--r-- 1 mals users   157 04-12 16:52 VERSION

3、SecondaryNameNode:namenode的备份。

四、读写数据流程

1、读取数据流程:

客户端要访问HDFS中的一个文件,首先从namenode获得组成这个文件的数据块位置列表,根据列表知道存储数据块的datanode,访问datanode获取数据,Namenode并不参与数据实际传输。


2、写入数据流程

客户端请求namenode创建新文件
客户端将数据写入DFSOutputStream
建立pipeline依次将目标数据块写入各个datanode,建立多个副本


五、HDFS的可靠性

1、冗余副本策略
可以在hdfs-site.xml中dfs.replication设置复制因子指定副本数量。所有数据块都有副本。Datanode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列表(blockreport)汇报给namenode。
2、机架策略
集群一般放在不同机架上,机架间带宽要比机架内带宽要小.一般在本机架存放一个副本,在其它机架再存放别的副本,这样可以防止机架失效时丢失数据,也可以提高带宽利用率.

集群、机架和机器的对应关系是通过core-site.xml配置设置的。比如:

<property>
<name>topology.script.file.name</name>
<value>/opt/modules/hadoop/hadoop-1.0.3/bin/RackAware.py</value>
<!--机架感知脚本路径-->
</property>
<property>
<name>topology.script.number.args</name>
<value>20</value>
<!--机架服务器数量,由于我写了20个,所以这里写20-->
</property>

RackAware.py如下:

#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys
rack = {"hadoop-node-31":"rack1",
"hadoop-node-32":"rack1",
"hadoop-node-49":"rack2",
"hadoop-node-50":"rack2",
"hadoop-node-51":"rack2",
"192.168.1.31":"rack1",
"192.168.1.32":"rack1",
"192.168.1.49":"rack2",
"192.168.1.50":"rack2",
"192.168.1.51":"rack2",
}

if __name__=="__main__":
print "/" +rack.get(sys.argv[1],"rack0")

然后重启hadoop的namenode和jobtracker,可以在logs里看下namenode和jobtracker的日志,看
到机架感知功能已经启用了。
3、心跳机制
Namenode周期性从datanode接收心跳信号和块报告
Namenode根据块报告验证元数据
没有按时发送心跳的datanode会被标记为宕机,不会再给它任何I/O请求
如果datanode失效造成副本数量下降,并且低于预先设置的阈值,namenode会检测出这些数据块,并在合适的时机进行重新复制
引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等
4、安全模式
Namenode启动时会先经过一个“安全模式”阶段,安全模式阶段不会产生数据写,在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,
会被认为是“安全”的。在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束。当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。

进入安全模式:bin/hadoop dfsadmin -safemode enter

退出安全模式:bin/hadoop dfsadmin -safemode leave
5、校验和
在文件创立时,每个数据块都产生校验和,校验和保存在.meta文件内,客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏。
如果正在读取的数据块损坏,则可以继续读取其它副本。
6、回收站
删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复。可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。缺省是关闭回收站功能的,想要开启,需要在conf/core-site.xml添加配置:

<property>
<name>fs.trash.interval</name>
<value>10080</value>
<description>
Number of minutes between trashcheckpoints. If zero, the trash feature is
disabled
</description>
</property>
然后重启集群。

删除数据:bin/hadoop fs -rmr ./out

恢复数据:bin/hadoop fs -mv ./.Trash/Current/user/huang/out ./

清空数据:bin/hadoop fs -expunge

7、元数据保护
映像文件刚和事务日志是Namenode的核心数据。可以配置为拥有多个副本。副本会降低Namenode的处理速度,但增加安全性。Namenode依然是单点,如果发生故障要手工切换。
8、快照机制

支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态。Hadoop目前还不支持快照。

0 0
原创粉丝点击