HDFS知识点总结

1. HDFS:

HDFS:Hadoop Distributed File System Hadoop 分布式文件系统

优点:

  1. 存储海量数据:HDFS可横向扩展,其存储的文件可以支持PB级数据
  2. 容错性高:数据保存多个副本,副本丢失后自动恢复。
  3. 扩展性强:可构建在廉价(与小型机大型机对比)的机器上,实现线性扩展。
    (随着节点数量的增加,集群的性能-计算性能和存储性能都会有所增加)
    当集群增加新节点之后,namenode也可以感知,进行负载均衡,将数据分发和备份数据均衡到新的节点上。(负载均衡:集群可将原本使用容量较高的节点上的数据自动写入新的节点上,达到所有节点容量均匀)每个节点磁盘使
    用容量百分比的差异可以人工设置。
  4. 大文件存储: 数据分块存储,将一个大块的数据切分成多个小块的数据。

缺点
1、不能做到低延迟数据访问:HDFS针对一次性获取大量的数据做了优化,牺牲了小数据量快速查询的性能。
2、多次写入,一次读取(擅长:HDFS适合一次写入,多次读取的场景。)
3、不支持多用户的并行写
4、不适合大量的小文件存储
A: 由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量。
B: 元数据信息中每个文件、目录和数据块的存储信息大约占150字节。
(1G 数据存储的元数据信息占用150字节 ,1M的数据元数据信息占用150字节)
受限于内存,元数据信息的存储机制导致无论数据多大,元数据信息中描述这个数据的信息都是150字节。

2. HDFS整体架构:
1)Client:客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
(2)与NameNode交互,获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;
(5)Client可以通过一些命令来访问HDFS;
2)NameNode:就是Master,它是一个主管、管理者。
(1)管理HDFS的名称空间;namespace
(2)管理数据块(Block)映射信息;
(3)配置副本策略(默认);3
(4)处理客户端读写请求。
3) DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作。
4) SecondaryNameNode:并非NameNode的热备,。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量;
(2)定期合并Fsimage和Edits日志,并推送给NameNode,协助NameNode管理;
(3)在紧急情况下,可辅助恢复NameNode。

3. HDFS文件格式:

文件格式按面向的存储形式不同,分为面向行面向列的两大类文件格式。

面向行
1). 文本文件格式(.txt)
计算可切分;
查看编辑简单;
无压缩占空间大、传输压力大、数据解析开销大;
学习练习使用
2). sequenceFile序列文件格式(.seq)
计算可切分;
原生支持、二进制 kv 存储、支持行和块压缩
本地查看不方便: 小文件合并成 kv 结构后不易查看内部数据
生产环境使用、map 输出的默认文件格式

面向列
3).rcfile 文件格式(.rc)
计算可切分;
数据加载快、查询快、空间利用率高、高负载能力
每一项都不是最高
学习生产均可
4).orcfile 文件格式(.orc)
计算可切分;
兼具了 rcfile 优点,进一步提高了读取、存储效率、新数据类型的支持
每一项都不是最高
学习生产均可

4. HDFS压缩算法:

1). Lzo 压缩
优点:压缩/解压速度也比较快,合理的压缩率;支持 split,是 hadoop 中最流行的压缩格式;可以在 linux 系统下安装 lzop 命令,使用方便。
缺点:压缩率比 gzip 要低一些; hadoop 本身不支持,需要安装;在应用中对 lzo 格式的文件需要做一些特殊处理(为了支持 split 需要建索引,还需要指定 inputformat 为 lzo 格式)。
应用场景: 一个很大的文本文件,压缩之后还大于 200M 以上的可以考虑,而且单个文件越大, lzo 优点越越明显。

2). Gzip压缩
优点:
(1)压缩比例比较高,而且压缩、解压速度比较快;
(2)hadoop 本身支持,大部分 linux 系统都自带 gzip 命令,使用方便.
缺点:不支持split切分。
应用场景: 由于不可切分,当每个文件压缩之后在 130M 以内的(1 个块大小内),都可以考虑用 gzip压缩格式。

3). Bzip2 压缩
优点:
(1)支持 split;具有很高的压缩率,比 gzip 压缩率都高;
(2)hadoop 本身支持,但不支持 native;在 linux 系统下自带 bzip2 命令,使用方便。
缺点:压缩/解压速度慢;不支持 native。
应用场景: 适合对速度要求不高,但需要较高的压缩率的时候,可以作为 mapreduce 作业的输出格式; 或者输出之后的数据比较大,处理之后的数据需要压缩存档减少磁盘空间并且以后数据用得比较少的情况;或者对单个很大的文本文件想压缩减少存储空间,同时又需要支持 split,而且兼容之前的应用程序(即应用程序不需要修改)的情况。

4). Snappy 压缩
优点:高速压缩速度和合理的压缩率。
缺点:不支持 split;压缩率比 gzip 要低; hadoop 本身不支持,需要安装;
应用场景: 当 Mapreduce 作业的 Map 输出的数据比较大的时候,作为 Map 到 Reduce的中间数据的压缩格式;或者作为一个 Mapreduce 作业的输出和另外一个 Mapreduce 作业的输入。

5. HDFS写数据流程:

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 block上传到哪几个datanode服务器上。
4)NameNode返回3个datanode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;
8)当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7步)。

6. HDFS读数据流程:
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)。
4)客户端以packet为单位接收,先在本地缓存,然后写入目标文件。

7. NN和2NN工作机制

Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。

首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据序列化后文件的FsImage

这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件来记录客户端更新元数据信息的每一步操作(只进行追加操作,效率很高),每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中 。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。

但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并

1). 第一阶段:NameNode启动
(1)第一次启动NameNode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对数据进行增删改查。
2). 第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)NameNode滚动正在写的edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。

8. DataNode的工作机制
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

你可能感兴趣的:(HDFS知识点总结)