分布式文件系统 ?
管理网络中跨多台计算机存储的文件系统称为分布式文件系统(distributed fileSystem)
HDFS ?
HDFS 即 Hadoop Distributed FileSystem(Hadoop分布式文件系统)
超大文件:上百M,GB,T的文件
流式数据访问:一次写入,多次读取是最高效的访问模式
不适合需要低时间延迟的数据访问:HDFS为高数据吞吐量应用优化,可能会以时间为代价
带个写入者:HDSF的文件写操作只支持单个写入者,且写操作以 只添加 的方式在文件末尾写数据
数据块
- HDFS的块(block)默认为128M
- HDFS中小于一个块的文件不会占据整个块的空间
HDFS的块为什么这么大?
最小化寻址开销
NameNode&DataNode
HDFS集群有两类节点:
1. 管理节点 NameNode
2. 工作节点 DataNode
NameNode
- NameNode管理文件系统的命名空间
- 维护文件系统树及整棵树内所有的文件和目录
- 记录每个文件各个块所在的数据节点信息(非永久保存,启动时根据数据节点信息重建)
这些信息以文件形式保存在磁盘上:命名空间镜像文件;编辑日志文件
DataNode
DataNode是文件系统的工作节点,根据客户端或NameNode调度需要,存储并检索数据块
- 没有NameNode DataNode将无法使用
HDFS工作机制
- HDFS集群分为两大角色:NameNode、DataNode
- NameNode负责管理整个文件系统的元数据
- DataNode 负责管理用户的文件数据块
- 文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
- 每一个文件块可以有多个副本,并存放在不同的datanode上
- Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
- HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
NameNode
元数据存储机制
- 内存中有一份完整的元数据(内存meta data)
- 磁盘有一个“准完整”的元数据镜像(fsimage)文件(在namenode的工作目录中)
- 用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件)
- 当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data中
元数据的checkpoint
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
配置参数
dfs.namenode.checkpoint.check.period=60 #检查触发条件是否满足的频率,60秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
#以上两个参数做checkpoint操作时,secondary namenode的本地工作目录
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3 #最大重试次数
dfs.namenode.checkpoint.period=3600 #两次checkpoint之间的时间间隔3600秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录
secondary namenode的另一个作用
namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据
DataNode
- 存储管理用户的文件块数据
- 定期向namenode汇报自身所持有的block信息(通过心跳信息上报)
确定块报告间隔配置(以毫秒为单位)
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
Datanode掉线判断时限参数
HDFS默认的超时时长为10min+30s
超时时长的计算公式为:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
<property>
<name>heartbeat.recheck.interval</name>
<value>2000</value><!-- 毫秒 -->
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>1</value><!-- 秒 -->
</property>