1、HDFS的写入流程:
2、HDFS的读取流程:
Hdfs 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成NameNode, DataNode,client,和SencondayNameNode组成
NameNode(Master):
管理 HDFS 的命名空间,维护元数据。
接收客户端的请求。
管理数据块(Block)映射信息.
配置副本策略
DataNode(Slave):
存储实际的数据块 。
执行数据块的读/写操作。
向namenode上传心跳信息。
Client(客户端):
1、文件上传 HDFS 的时候,Client 将文件切分成Block,然后进行存储。
2、与 NameNode 交互,获取文件的位置信息。
3、与 DataNode 交互,读取或者写入数据。
4、Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
SencondayNameNode(辅助工作者):
1、辅助 NameNode,分担其工作量。
2、定期合并 fsimage和fsedits,并推送给NameNode。
3、在紧急情况下,可辅助恢复 NameNode。
原文链接:https://blog.csdn.net/weixin_43893397/article/details/114047237
在hdfs中所有的文件都是以 block 块的方式存放在 HDFS 文件系统当中, 在 Hadoop1当中, 文件的 block 块默认大小是 64M, hadoop2 当中, 文件的 block块大小默认是 128M, block 块的大小可以指定:
引入块机制的好处:
一个文件有可能大于集群中任意一个磁盘,使用块抽象而不是文件可以简化存储子系统
块非常适合用于数据备份进而提供数据容错能力和可用性
块缓存:
通常 DataNode 从磁盘中读取块, 但对于访问频繁的文件,其对应的块可能被显式的缓存在 DataNode 的内存中, 以堆外块缓存的形式存在.默认情况下,一个块仅缓存在一个 DataNode的内存中,当然可以针对每个文件配置 DataNode 的数量.作业调度器通过在缓存块的 DataNode 上运行任务,可以利用块缓存的优势提高读操作的性能.
文件不够一个块的大小时,也单独占用一个块,两个文件不会共用一个块。
例如一个文件 130M, 会被切分成 2 个 block 块, 保存在两个 block 块里面,一个占用128M,另一个占用2M,实际占用磁盘 130M 空间, 而不是占用256M的磁盘空间
原文链接:https://blog.csdn.net/duyenson/article/details/119352306
等同于hadoop的优缺点
在文件写入 HDFS 时,HDFS 会首先把文件分割成块,并把这些数据块存储在集群不同机器上
然后在其他机器创建各个块的副本,默认情况下,HDFS 会在其他机器创建3个文件的副本
所以,HDFS 集群任意机器挂了,我们依然能从其他保存数据副本的机器上读取数据,
原文链接:https://blog.csdn.net/qq_20042935/article/details/123093545
常用的文件格式有:TextFile、SequenceFile、Avro、Parquet、RC & ORC
行式的优点
写是一次性完成,性能更高
缺点:
读取少数列会遍历无关的列,性能差。
压缩比低
列存储的优点
列存储是将每列单独存储或者将某几个列作为列组存在一起。列存储在执行查询时可以避免读取不必要的列。
而且一般同列的数据类型一致,取值范围相对多列混合更小,在这种情况下压缩数据能达到比较高的压缩比。
但是这种结构在重建行时比较费劲,尤其当一行的多个列不在一个 HDFS 块上的时候。
缺点:写记录时,一行记录被拆分成多列存储,耗费时间更长
TextFile
常采用csv、json等固定长度的纯文本格式
优点:
便于与其他应用程序、脚本进行数据交换
易读性好、便于理解
缺点:
数据存储量非常庞大
查询效率不高
不支持块压缩
SequenceFile
按行存储二进制键值对数据,HDFS自带
特点
常用于MapReduce作业之间传输数据
二进制文件直接将
可用于Hadoop中小文件的打包存档
支持记录压缩、块压缩
二进制文件,可读性低
Parquet
Apache Parquet是Hadoop生态系统中任何项目都能使用的列式存储格式,
特点
Parquet格式是Spark SQL默认的数据源
按列进行存储,按需读取列,压缩编码可以降低磁盘存储空间(比如有5个"d",它能够将数据转化成类似于这种结构:“d5”)
ORC
RC的优化版本
特点
常用于Hive
压缩率极高
一、文件的完整
1、在文件刚刚开始建立的时候,文件中的每个数据块都会产生一个校验和(checksum),这个校验和会保存在.meta文件内部。
2、客户端获取数据的时候会和这个校验和进行对比,检查是否相同,从而发现数据块是否损坏。
2、如果说正在读取的数据块损坏,则可以读取其他副本。接着NameNode会标记该block块已经损坏,然后复制该block达到预期设置的文件备份数。
4、DataNode在其文件创建后三周验证其校验和(checksum)
补充:
校验和–checksum是对一组数据(通常是一个文件)进行算法-加密哈希函数运算得到的结果。通过比较你手头文件和原始文件的校验和,能够确保你对原始文件的拷贝是真的并且不存在错误。
校验和通常也被称之为哈希值、哈希和、哈希码,或简称为哈希–hash。
二、网络和机器失效
1、副本冗余策略
可以指定数据文件的副本数量,默认是3;
保证所有的数据块都有副本,不至于在一个datanode宕机后,数据出现丢失现象。
2、机架感知策略
集群的机器一般处于不同机架上,机架间带宽要比机架内带宽要小;
HDFS具有“机架感知”能力,它能自动实现在本机架上存放一个副本,然后在其它机架再存放另一副本,这样可以防止机架失效时数据丢失,也可以提高带宽利用率。
3、心态策略
NameNode周期性从DataNode接收心跳信号和块报告,Namenode根据块报告验证元数据;
NameNode对没有按时发送心跳的DataNode会被标记为宕机,不会再给它任何I/O请求;
DataNode失效造成副本数量下降,并且低于预先设置的阈值;NameNode会检测出这些数据块,并在合适的时机迕行重新复制;
引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等。
NameNode挂掉
1、主备切换
集群一般会有俩个NameNode,一个处于active状态,一个处于睡眠状态,当第一个Name Node挂掉,集群中睡眠状态的NameNode就会启动。
2、镜像文件和操作日志磁盘存储
当集群启动的时候,在NameNode启动的时候,如果是集群格式化后,或者说是第一次启动,会创建一个空的(fsimage)镜像空间和(edits)日志文件;否则的话会产生一个新的fsimage和edits,并加载上一次的fsimage和edits到这次的fsimage中。
3、镜像文件和操作日志可以存储多分,多磁盘存储
其他保障可靠性机制
1、快照
支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态;
2、回收站机制
删除文件时,其实是放入回收站/trash,回收站里的文件可以快速恢复;
可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块。
3、安全模式
Namenode启动时会先经过一个“安全模式”阶段,安全模式阶段不会产生数据写入;
在安全模式阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的;
在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束;
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。
原文链接:https://blog.csdn.net/Brucexyao/article/details/120467451
在HA HDFS集群中会同时运行两个Namenode,一个作为Active Namenode(Active),一个作为Standby Namenode。Standby Namenode的命名空间与Active Namenode是实时同步的,所以当Active Namenode发生故障而停止服务时,Standby Namenode可以立即切换为活动状态,从而不影响HDFS集群服务。
为了使Standby节点与Active节点的状态能够同步一致,两个节点都需要同一组独立运行的节点(JournalNodes,JNS)通信。当Active Namenode执行了修改命名空间的操作时,它会定期将执行的操作记录在editlog中,并写入JNS的多数节点中。而Standby Namenode会一直监听JNS上editlog的变化,如果发现editlog有改动,Standby Namenode就会读取editlog并与当前的命名空间合并。当发生了故障切换时,Standby节点会保证已经从JNS上读取了所有editlog并与命名空间合并,然后才会从Standby状态切换为Active状态。通过这种机制,保证了Active Namenode与Standby Namenode之间命名空间状态的一致性。
为了使故障切换能够很快的执行完毕,就要保证Standby节点也保存了实时的数据块的存储信息。这样在发生故障切换时,Standby节点就不需要等待所有的数据节点进行全量数据块同步,而直接可以切换到Active状态。为了实现这个机制,Datanode会同时向这两个Namenode发送心跳以及块状态信息。这样就实现了Active Namenode 和standby Namenode 的元数据就完全一致,一旦发生故障,就可以马上切换,也就是热备。
这里需要注意的是 Standby Namenode只会更新数据块的存储信息,并不会向namenode 发送复制或者删除数据块的指令,这些指令只能由Active namenode发送。
原文链接:https://blog.csdn.net/solihawk/article/details/123981573
1)认证(authentication) 只有经过认证的身份才被允许进入到数据系统。
2)授权(authorization) 对于HDFS, Hadoop提供了文件级的细粒度访问控制。这种访问控制非常类似于那些基于UNIX的文件系统。
3)审计(auditing) 所有的访问和操作都需要被记录在审计日志中,以便在稍后的时间点进行审计。
4)数据保护 传输过程中的中间人可以找到那些正在传输的数据,对通过线路的传输进行加密以便保证数据的机密性。
1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向namenode注册,通过后,周期性(6小时)的向namenode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器
原文链接:https://blog.csdn.net/weixin_43487305/article/details/112195078
1)当DataNode读取block的时候,它会计算checksum
2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
3)client读取其他DataNode上的block.
4)datanode在其文件创建后周期验证checksum
原文链接:https://blog.csdn.net/weixin_43487305/article/details/112195078