HDFS基本特性以及工作机制

来源:互联网 发布:java方法中布尔型变量 编辑:程序博客网 时间:2024/06/05 05:43

一、HDFS的概念和特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间–目录树来定义文件。
其次,它是分布式的。
1、HDFS中的文件在物理上是分块存储的(block),块的大小可以通过配置参数(dfs.blocksize)来规定的,默认大小在hadoop2.x系列版本中是128m,老版本中是64m。
2、HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir_a/dir_b/dir_c/file.data.
3、目录结构及文件的分块信息(元数据)的管理由namenode节点承担–namenode节点是HDFS集群的主节点,负责维护整个HDFS文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,以及所在的datanode服务器)。
4、文件的各个block的存储管理由datanode来承担–datanode是HDFS集群的从节点,每一个block都可以在多个datanode上存储多个副本(副本的数量也可以通过参数设置dfs.replication)
5、HDFS的设计适用于一次写入,多次读出的场景,但不支持文件的修改(HDFS适用于来做数据分析,并不适合用来做网盘应用,因为,不便进行修改,延迟大,网络开销大,成本太高)。

二、HDFS的工作机制

1、概述

1)HDFS集群分为两大角色,分别为namenode、datanode、(secondary namenode)
2)namenode负责管理整个文件系统的元数据。
3)datanode负责管理用户的文件数据块。
4)文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上。
5)每个文件块可以有多个副本,并存放在不同的datanode上。
6)datanode会定期的向namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量。
7)HDFS内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过namenode申请来进行。

2、HDFS写数据流程

1)概述
客户端要向HDFS写数据,首先要跟namenode通信以确认可以写文件并获得接收文件block的datanode,然后客户端按顺序将文件block逐个传递给相应的datanode,并由接收到block的datanode负责向其他datanode复制block的副本。
2)详细步骤图
这里写图片描述
3)详细步骤解析
a、跟namenode通信请求上传文件,namenode检查目标文件是否存在,父目录是否存在。
b、namenode返回是否可以上传。
c、客户端请求第一个block该上传到哪些datanode服务器上。
d、namenode返回3(副本数量为3)个datanode服务器A、B、C。
e、客户端请求3台datanode中的一台A(理论上是最“近”的一台,)上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,逐级返回客户端。
f、客户端开始往A上传第一个block(先从磁盘读取数据放到本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C,A每传一个packet会放入一个应答队列等待应答。
g、当yigeblock传输完成后,客户端再次请求namenode上传第二个block的服务器。依次重复上面的步骤,直到传输完成。

3、HDFS读数据流程

1)概述
客户端将要读取的文件路径发送给namenode,namenode获取文件的元数据信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应的datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件。
2)详细步骤图
这里写图片描述
3)详细步骤解析
a、跟namenode通信获得元数据信息,找到文件块所在的datanode服务器。
b、客户端挑选一个datanode服务器(就近原则),请求建立socket连接。
c、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验)。
d、客户端以packet为单位接收,先在本地缓存,然后写入目标文件。
e、第一个文件块读取完成后,重复以上步骤,读取第二个文件块。依次类推,直到文件读取完成。

4、namenode工作机制

1)namenode职责
a、负责客户端请求的响应
b、对元数据进行管理(查询、修改)
2)元数据管理
namenode对元数据的管理,采用了三种存储形式:
内存元数据
磁盘元数据镜像文件
数据操作日志文件(可通过日志运算出元数据)
a、元数据存储机制
1、内存元数据:内存中有一份完整的元数据(metadata)
2、磁盘元数据镜像文件:磁盘有一个准完整的元数据镜像(fsimage)文件(namenode 的工作目录中)
3、数据操作日志文件:用于衔接内存metadata和持久化元数据镜像fsimage之间的操作日志(edits文件)。当客户端对hdfs中的文件进行新增或者是修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功之后,相应的元数据会被更新到内存中的metadata中。
b、查看元数据
查看元数据可以通过hdfs的一个工具查看edits中的日志与fsimage镜像文件信息。
bin/hdfs oev -i edits -o edits.xml
bin/hdfs oiv -i fsimage_000000000000000000345 -p XML -o fsimage.xml
c、元数据的checkpoint
每隔一段时间,会由secondary namenode将namenode上积累的所有的edits和一个新的fsimage下载到本地,并加载到内存中进行merge(这个过程称之为checkpoint)
checkpoint详细过程如下:
这里写图片描述
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之间最大的操作记录

namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录将fsimage拷贝到namenode 的工作目录,以恢复namenode的元数据(并不能完全恢复)。
d、元数据的目录说明
在第一次部署好hadoop集群的时候,我们需要在namenode节点上格式化磁盘:

$HADOOP_HOME/bin/hdfs namenode -format

格式化完成之后,将会在$dfs.namenode.name.dir/current目录下,有如下的文件结构:

current/|-- VERSION|-- edits_*|-- fsimage_0000000000008547077|-- fsimage_0000000000008547077.md5-- seen_txid

其中dfs.namenode.name.dir是在hdfs-site.xml文件中配置的,默认的配置如下:

<property>  <name>dfs.namenode.name.dir</name>  <value>file://${hadoop.tmp.dir}/dfs/name</value></property>hadoop.tmp.dir是在core-site.xml中配置的,默认值如下<property>  <name>hadoop.tmp.dir</name>  <value>/tmp/hadoop-${user.name}</value>  <description>A base for other temporary directories.</description></property>

dfs.namenode.name.dir属性可以配置多个目录,格式如下:

<property>  <name>dfs.namenode.name.dir</name> <value>${hadoop.tmp.dir}/dfs/name1,${hadoop.tmp.dir}/dfs/name2,${hadoop.tmp.dir}/dfs/name3</value></property>

各个目录存储的文件结构和内容都完全一样,相当于备份,这样做的好处是其中一个损坏了,也不会影响到hadoop的元数据,特别是其中一个是NFS(网络文件系统Network File System),即使这台机器损坏了,元数据也得到了保存。
下面对$dfs.namenode.name.dir/current/目录下的文件进行解释:
1、VERSION文件是java属性文件,内容大致如下:

#Fri Nov 15 19:47:46 CST 2013namespaceID=934548976clusterID=CID-cdff7d73-93cd-4783-9399-0a22e6dce196cTime=0storageType=NAME_NODEblockpoolID=BP-893790215-192.168.24.72-1383809616115layoutVersion=-47

其中:
namespaceID是文件系统的唯一标识符,在文件系统首次格式化之后生成的;
storageType说明这个文件存储的是什么进程的数据结构信息(如果是datanode,storageType=DATA_NODE);
cTime表示namenode存储文件的创建时间,如果namenode没有更新过,这里的记录值为0,如果对namenode进行升级,cTime将会记录更新的时间戳;
layoutVersion表示HDFS永久性数据结构的版本信息,只要数据结构变更,版本号也要递减,此时的HDFS也需要升级,否则磁盘中仍旧是使用的是旧版本的数据结构,这回导致新版本的namenode无法使用;
clusterID是系统生成或手动指定的集群ID,在-cluserID选项中可以使用它;如下说明:

a、使用如下命令格式化一个Namenode:$HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]选择一个唯一的cluster_id,并且这个cluster_id不能与环境中其他集群有冲突。如果没有提供cluster_id,则会自动生成一个唯一的ClusterID。b、使用如下命令格式化其他Namenode: $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>c、升级集群至最新版本。在升级过程中需要提供一个ClusterID,例如:$HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR  -upgrade -clusterId <cluster_ID>如果没有提供ClusterID,则会自动生成一个ClusterID。

blockpoolID:是针对每一个namespace所对应的blockpool的ID,上面的这个BP-893790215-192.168.24.72-1383809616115就是namespace下的存储块池的ID,这个ID包括了其对应的namenode节点的ip地址。
2、$dfs.namenode.name.dir/current/seen_txid非常重要,是存放transactionId的文件,format格式化后该值为0,它代表的是namenode中的最后的edits_*的尾数,namenode重启时,会按照seen_txid的数字,循当hdfs发生异常重启时,一定要对比seen_txid中的数字与最后edits文件的尾数,不然建制namnode时metadata的数据有减少,导致误删datanode上多余的block块。

seen_txid文件中记录的是edits滚动的序号,每次重启namenode时,namenode就知道要将哪些edits文件进行加载。
3、format格式化时,在$dfs.namenode.name.dir/current目录下也会生成fsimage和edits文件及其对应的md5校验文件。

5、datanode的工作机制

1)概述

1、datanode工作职责
存储、管理用户的文件块数据
定期向namenode汇报自身所持有的block信息(通过心跳信息上报),这里很重要,当集群中某些block副本发生失效时,集群如何恢复block初始副本数量的问题。默认的心跳上报的时间间隔:

<property>    <name>dfs.blockreport.intervalMsec</name>    <value>3600000</value>    <description>Determines block reporting interval in millisecds.</description></property>

2、datanode掉线判断时限参数
datanode进程死亡或者是网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判断为死亡,要经历一段时间,这段时间暂称为超时时长,HDFS默认的超时时长为10分钟+30秒。假定超时时长为timeout,则计算公式如下:

timeout  = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

默认的heartbeat.recheck.interval大小为5分钟,dfs.heartbeat.interval为30秒。
需要注意的是hdfs-site.xml配置文件中配置的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为妙。
默认配置如下:

<property>        <name>heartbeat.recheck.interval</name>        <value>5*60*1000</value></property><property>        <name>dfs.heartbeat.interval</name>        <value>3</value></property>
原创粉丝点击