Hadoop之HDFS

放肆的年华 提交于 2021-01-31 05:31:12

微信公众号:北风中独行的蜗牛

HDFS 全称  Hadoop Distributed File System -  Hadoop分布式文件系统,是Hadoop项目的核心子项目,对海量数据进行进行存储与管理

HDFS存储块为128M
现在HDFS的block的默认大小为128M。寻址时间指的是在HDFS中,找到目标block的时间。如果block越大,寻址时间就越短,因为NameNode中存储的元数据就越少,但是明显传输时间会就变大,反之,寻址时间就越长。通常MapReduce中每一个任务只会处理一个块,如果block太大也会影响任务的执行时间。经过前人的研究,寻址时间平均为10ms比较合适,就是查找block的时间为10ms,寻址时间为传输时间的1%,也就是10/0.01=1S,现在磁盘的读取速率大概为100M/s,所以每秒大概为100M,取2的指数级,即为128M。如果磁盘的读取速率 为200M/s, 则block的大小为256M。Block的大小 在hdfs-site.xml 中设置,name为dfs.blocksize

机架感知
数据块的存储涉及到一个概念,叫做机架感知。意思是同一个数据的备份,会放到不同机架的不同节点上,防止数据的丢失。通常冗余的数据为3,放数据的策略是第一个block放到与client同一个机器的DataNode节点上,如果Client不在集群范围,则随机选取一个DataNode存放,第二个随机选取同一个机架上的另外一个DataNode节点,第三个放到不同机架上的DataNode节点上。这样做的目的是,如果第一个DataNode出现故障,可以从最近的节点上拿数据,就是同一个机架上的节点,这样肯定比跨机架快。如果整个机架挂了,别的机架上还有数据,不至于数据的丢失。
官网的原话
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack, another on a different node in the local rack, and the last on a different node in a different rack. This policy cuts the inter-rack write traffic which generally improves write performance. The chance of rack failure is far less than that of node failure; this policy does not impact data reliability and availability guarantees. However, it does reduce the aggregate network bandwidth used when reading data since a block is placed in only two unique racks rather than three. With this policy, the replicas of a file do not evenly distribute across the racks. One third of replicas are on one node, two thirds of replicas are on one rack, and the other third are evenly distributed across the remaining racks. This policy improves write performance without compromising data reliability or read performance.

https://hadoop.apache.org/docs/r2.7.7/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

文件上的上传与下载流程

在这里插入图片描述

在这里插入图片描述

DateNode的工作原理:
  DataNode启动后向NameNode注册,表示该NameNode在线。

  1. 注册成功后DataNode周期性(一个小时)的向NameNode发送块信息。DateNode上存储的不只是数据块,每一个数据块对应一个文件代表每一个数据块的元信息(数据长度,检验和,时间戳等)。检验和的作用是,保证数据的完整性,有CRC校验,MD5校验等,元信息用的是MD5校验,block用的是CRC校验,当Client向DataNode读取数据块的时候,会重新计算校验和,如果和刚开始存的不一致,说明Block损坏,Client读取其他节点的block。

DataNode扩展基于此,只需配置好启动就可以了,不要配置slaver,NameNode也不需要事先知道这个DataNode,因为启动之后会自动去NameNode注册

  1. DataNode会每隔三秒会向NameNode发送一次心跳,并且会带回NameNode的命令,比如复制数据到另一块机器,或者删除多余的数据等。如果NameNode超时没有收到DataNode心跳,并不会立即判定DataNode的死亡,要经过一段等待时间,这个时间是超时时长。这个时间有一个计算公式:

TimeOut = 2 * dfs.namenode.heartbert.recheck-interval + 10 * dfs.heartbeat.interval

dfs.namenode.heartbeat.recheck-interval这个参数根据字面意思是检查心跳的间隔,默认是5分钟。
dfs.heartbeat.interval 这个就是心跳了,默认是3秒,所以超时时间是10分钟+30秒
这两个参数是可配置的,在hdfs-site.xml中配置,dfs.namenode.heartbeat.recheck-interval 这个参数的单位是毫秒,这个 dfs.heartbeat.interval参数单位是秒:

<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
</property>
<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
</property>

添加DataNode,只需将NameNode节点的hadoop文件copy过来,启动即可,因为配置文件中指定了NameNode,所以DataNode启动之后会向NameNode注册自己。

黑名单
删除某一个节点可以配置黑名单,当某一个节点被配置成黑名单配置黑名单之后,调用下指令hdfs dfsadmin -refreshNodes即可,就会namnode就会控制数据转移,转移完之后就可以删除该节点了,过程可以在网页看到
黑名单在hdfs-site.xml

<property>
    <name>dfs.hosts.exclude</name>
    <value>写有主机的文件</value>
</property>
[root@hadoop11 current]# hdfs dfsadmin -refreshNodes

刷新节点之后,NameNode节点就会转移黑名单节点上的数据。

白名单
还有一个白名单,即关键字是dfs.hosts,添加到这个白名单的才会和NameNode组成集群,白名单的作用感觉像是一个范围,应该是为了怕一个内网之中的多个集群混淆吧

欢迎关注我的微信公众号:北风中独行的蜗牛

在这里插入图片描述


本文分享自微信公众号 - 北风中独行的蜗牛(manong_xiaodong)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!