一,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、 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失
总结一句话:分而治之 ,冗余备份
2.HDFS 架构
主节点 Namenode : 集群老大,掌管文件系统目录树,处理客户端读且请求
SecondaryNamenode: 严格 说并不是 namenode 备份节点,主要给 namenode 分担压力之用
从节点 Datanode : 存储整个集群所有数据块,处理真正数据读写
secondary 会复制namenode 的fisimage 文件和在那之后的edits 文件,做一个合并后形成一个新的fismage 返回给namenode
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、 方法:
将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上
3、 存放说明:
在多数情况下,HDFS 默认的副本系数是 3 ,Hadoop 默认对 3 个副本的存放策略如下图:其中 Block1,Block2,Block3 分别表示 Block的三个副本:
第一个block副本放在和client所在的node里(如果client不在集群范围内,则这第一个node是随机选取的,系统会尝试不选择哪些太满或者太忙的 node)。
第二个副本放置在与第一个节点不同的机架中的 node 中(近乎随机选择,系统会尝试不选择哪些太满或者太忙的 node)。
第三个副本和第二个在同一个机架,随机放在不同的 node 中。
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汇报
2.联邦(联盟)集群(为了解决主从架构中的主节点的负载过重的问题)
NameNode压力过大,且内存受限,影响系统扩展性
HDFS Federation(联邦)
1. 按数据的分类,分布到别的集群
2.同类的数据,按时间分配到不同的集群
HDFS文件权限
与Linux文件权限类似 ,不做密码认证,用户名对了就行
• r: read; w:write; x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容
如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。
HDFS的权限目的:阻止好人错错事,而不是阻止坏人做坏事。HDFS
相信,你告诉我你是谁,我就认为你是谁。