一,HDFS 前言

HDFS:Hadoop Distributed File System Hadoop 分布式文件系统,主要用来解决海量数据的存储问题

 

1、 设计思想

分而治之:将大文件,大批量文件,分布式的存放于大量服务器上。以便于采取分而治之的方式对海量数据进行运算分析

要把存入进HDFS集群的所有的数据要尽量均匀的分散在整个集群中如果有100G 的数据

①集群有100个节点 ,按照1G的大小进行切分存储:每个节点都存储1G的数据量

②如果有100G数据,集群只有90个节点,按照1G的大小进行切分存储:其中这90台服务器中会有10台服务器会存储2G的数据 ,其他的80个节点都只存储1G的数据

③如果有100G的数据,集群中也只有90个节点,按照512M的大小进行切分存储:其中会有20个节点,存储了1.5G的数据,其他的70节点都存储了1G的数据量

HDFS集群的块大小的配置(可配置):

hadoop2.x版本以前。默认的块大小:64M

hadoop2.x版本以后:默认的块大小:128M

假如把切分出来的数据块,切分成很小很小,就会造成小文件,有很多很多,Block大小和副本数通过Client端上传文件时设置,文件上传成功后副本数可以变更,Block Size不可变更


当小文件是2M , 数据块的size 为256M , 实际存储为多大 ?

如果一个文件最后剩下来一个很小的数据量,这剩下来的数据就成为一个单独的数据块,这个数据块有多大(例如占据2M),就占用多大的磁盘容量(2M)

如果要存储10个10M的文件, 最终存储多少个数据块?

10 个块

冗余备份 :用户存入进HDFS的数据,可以根据用户的配置存储多份

① 数据的备份数量是由客户端制定

② 如果一个文件存储多份,这多份数据完全没有必要分布在同一个节点中

2、 在大数据系统架构中的应用

为各类分布式运算框架(MapReduce,Spark,Tez,Flink,…)提供数据存储服务

 

3、 重点概念:

数据块/副本,负载均衡,心跳机制,副本存放策略,元数据/元数据管理,安全模式,机架感知…

 

二 、HDFS 相关概念和特性

 

1. 、HDFS 相关概念和特性

HDFS 被设计成用来使用低廉的服务器来进行海量数据的存储,那是怎么做到的呢?

1、 大文件被切割成小文件,使用分而治之的思想让很多服务器对同一个文件进行联合管理

2、 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失

总结一句话:分而治之 ,冗余备份

hdfs文件重新分区 hdfs数据文件切分存储_hdfs文件重新分区

 

2.HDFS 架构

主节点 Namenode : 集群老大,掌管文件系统目录树,处理客户端读且请求

SecondaryNamenode: 严格 说并不是 namenode 备份节点,主要给 namenode 分担压力之用

从节点 Datanode : 存储整个集群所有数据块,处理真正数据读写

hdfs文件重新分区 hdfs数据文件切分存储_hadoop_02

secondary 会复制namenode 的fisimage 文件和在那之后的edits 文件,做一个合并后形成一个新的fismage 返回给namenode

hdfs文件重新分区 hdfs数据文件切分存储_hdfs文件重新分区_03

3.概念和特性

它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件 ,其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器都有各自清晰的角色定位

 

重要特性如下:

1、HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M

2、HDFS 文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:

hdfs://namenode:port/dir-a/dir-b/dir-c/file.data

hdfs://hadoop02:9000/soft/hadoop-2.6.5-centos-6.7.tar.gz

3、目录结构文件分块位置信息(元数据)的管理namenode 节点承担namenode 是 HDFS 集群主节点负责维护整个 hdfs 文件系统的目录树,以及每一个路径(文件)所对应的 block 块信息(block 的 id,及所在的 datanode 服务器)

4、文件的各个 block 的存储管理由 datanode 节点承担 ,datanode 是 HDFS 集群从节点,每一个 block 都可以在多个 datanode 上存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3

5、HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改

(PS:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)

 

三 HDFS 优缺点

1.HDFS 的优点:

1.可构建在廉价机器上

2.高容错性:通过多副本提高可靠性,提供了容错和恢复机制 , 副本丢失后,自动恢复

3.适合批处理

4.移动计算而非数据,数据位置暴露给计算框架

5.适合大数据处理:GB、TB、甚至 PB 级数据,百万规模以上的文件数量,10K+节点规模

6.一次性写入,多次读取,保证数据一致性

2.HDFS 的缺点:

1.不支持低延迟数据访问:比如毫秒级 ,低延迟与高吞吐率

2.不太支持大量小文件存取 ,占用 NameNode 大量内存 150b* 1000W = 15E,1.5G  , 寻道时间超过读取时间

3.并发写入、文件随机修改  ,一个文件只能有一个写者 , 仅支持 append ,形如:

hadoop fs -appendToFile number2.txt /number.txt

 

HDFS 不适合存储小文件?

1.元信息存储在 NameNode 内存中 , 一个节点的内存是有限的 ,NameNode 存储 block 数目是有限的 , 一个 block 元信息消耗大约 150 byte 内存,存储 1 亿个 block,大约需要 20GB 内存 ,如果一个文件大小为 10K,则 1 亿个文件大小仅为 1TB(但要消耗掉 NameNode 20GB内存)

2.存取大量小文件消耗大量的寻道时间

 

四,HDFS 核心设计

1.HADOOP 心跳机制(heartbeat )

1、 Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有Datanode 和 NodeManager

2、 Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服务,等待 slave 的链接

3、 Slave 启动时,会主动链接 master 的 ipc server 服务,并且每隔 3 秒链接一次 master,这个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通过心跳给 slave 下达命令

4、 NameNode 通过心跳得知 Datanode 的状态 ,ResourceManager 通过心跳得知 NodeManager 的状态

5、 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。!!!!!

 

Namenode 感知到 Datanode 掉线死亡的时长计算:

HDFS 默认的超时时间为 10 分钟+30 秒。

这里暂且定义超时时间为 timeout

计算公式为:

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

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

所以,举个例子,如果 heartbeat.recheck.interval 设置为 5000(毫秒),dfs.heartbeat.interval 设置为 3(秒,默认),则总的超时时间为 40 秒

<property>
      <name>heartbeat.recheck.interval</name>
      <value>5000</value>
</property>
<property>
       <name>dfs.heartbeat.interval</name>
       <value>3</value>
</property>

2.HDFS 安全模式

集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于 safemode 状态,怎么处理?

注意:safemode 是 namenode 的一种状态(active/standby/safemode 安全模式)

1、找到问题所在,进行修复(比如修复宕机的 datanode)

2、或者可以手动强行退出安全模式(但是并没有真正解决问题)

 

正常启动的时候进入安全的原理:

原理:namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式——>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着datanode 陆续启动,都会通过心跳机制把自身所保存的所有的block的信息都汇报给anemnode,namenode 就会将内存元数据中的 block 所在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式 , 在namenode还没有得知所有必要的block的位置信息时,是不能对外提供服务的。

安全模式常用操作命令:

hdfs dfsadmin -safemode leave //强制 NameNode 退出安全模式

hdfs dfsadmin -safemode enter //进入安全模式

hdfs dfsadmin -safemode get //查看安全模式状态

hdfs dfsadmin -safemode wait //等待,一直到安全模式结束

如果你使用的版本是 2.X 之前的版本,那么这个 hdfs 命令可以替换成 hadoop,它们都在 bin目录下

如果数据不完整,那么HDFS集群会一直处于安全模式, 很多操作受限。!!!! get 操作可以,其他不可以,在正常启动过程中,如果你的集群进入了安全模式,必须要等待HDFS集群自动退出,最后才能正常的使用。

 

3.HDFS 副本存放策略

1、 作用:

数据分块存储和副本的存放,是保证可靠性和高性能的关键

2、 方法:

将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上

hdfs文件重新分区 hdfs数据文件切分存储_hdfs_04

 

3、 存放说明:

在多数情况下,HDFS 默认的副本系数是 3 ,Hadoop 默认对 3 个副本的存放策略如下图:其中 Block1,Block2,Block3 分别表示 Block的三个副本:

第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,系统会尝试不选择哪些太满或者太忙的 node)。

第二个副本放置在与第一个节点不同的机架中的 node 中(近乎随机选择,系统会尝试不选择哪些太满或者太忙的 node)。

第三个副本和第二个在同一个机架,随机放在不同的 node 中。

hdfs文件重新分区 hdfs数据文件切分存储_数据_05

 

4、 修改副本数:

第一种方式:修改集群文件 hdfs-site.xml

<property>
      <name>dfs.replication</name>
      <value>1</value>
</property>

第二种方式:命令设置

bin/hadoop fs -setrep -R 1 /

 

4. 负载均衡

机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况,尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候分析数据块,分布和重新均衡 DataNode 上的数据分布的工具命令:

sbin/start-balancer.sh

sbin/start-balancer.sh -threshold 5

自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求

原因:HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的

hdfs dfsadmin -setBalanacerBandwidth newbandwidth

hdfs dfsadmin -setBalanacerBandwidth 10485760

该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s ,另外,也可以在 hdfs-site.xml 配置文件中进行设置:

<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>

sbin/start-balancer.sh -t 10%

机器容量最高的那个值 和 最低的那个值得差距 不能超过 10%

 

HA 与 联邦的区别 ?

1.HA集群(为了解决主从架构集群的单点故障问题)

HDFS存在的问题 , NameNode单点故障,难以应用于在线场景 . HDFS HA:通过主备NameNode解决 , 如果主NameNode发生故障,则切换到备NameNode上 , 格式化一个namenode,另一个拷贝他的源数据,edits 文件保存在jn 上共享,合并的工作也是有JN 来做,合并后生成两份fisimage文件,分别发送到2台namenode上,DN汇报也是向2个namenode汇报

 

hdfs文件重新分区 hdfs数据文件切分存储_hdfs文件重新分区_06

2.联邦(联盟)集群(为了解决主从架构中的主节点的负载过重的问题)

NameNode压力过大,且内存受限,影响系统扩展性

HDFS Federation(联邦)

1. 按数据的分类,分布到别的集群

2.同类的数据,按时间分配到不同的集群

 

HDFS文件权限

与Linux文件权限类似 ,不做密码认证,用户名对了就行

• r: read; w:write; x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容

如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。

HDFS的权限目的:阻止好人错错事,而不是阻止坏人做坏事。HDFS

相信,你告诉我你是谁,我就认为你是谁。