1.简述HDFS的可靠性是如何设计的?
1.安全模式:HDFS 刚刚启动时,NameNode 会进入安全模式(safe mode)。处于安全模式的NameNode不能做任何的文件操作,甚至内部的副本创建也是不允许的。NameNode 此时需要和各个DataNode 通信,获得DataNode 保存的数据块信息,并对数据块信息进行检查。只有通过了NameNode 的检查,一个数据块才被认为是安全的。当认为安全的数据块所占的比例达到了某个阈值(可配置),NameNode 才会退出。
2.SecondaryNameNode:Hadoop 中使用SecondaryNameNode 来备份NameNode 的元数据,以便在NameNode 失效时能从SecondaryNameNode 恢复出NameNode 上的元数据。SecondaryNameNode 充当NameNode 的一个副本,它本身并不处理任何请求,因为处理这些请求都是NameNode 的责任。NameNode 中保存了整个文件系统的元数据,而SecondaryNameNode 的作用就是周期性(周期的长短也是可以配置的)保存NameNode 的元数据。这些元数据中包括文件镜像数据FsImage 和编辑日志数据EditLog。FsImage 相当于HDFS 的检查点,NameNode 启动时候会读取FsImage 的内容到内存,并将其与EditLog 日志中的所有修改信息合并生成新的FsImage;在NameNode 运行过程中,所有关于HDFS 的修改都将写入EditLog。这样,如果NameNode 失效,可以通过Secondary NameNode 中保存的FsImage 和EditLog 数据恢复出NameNode 最近的状态,尽量减少损失。
3.心跳包(HeartBeats)和副本重新创建(re-replication):如果HDFS 运行过程中,一部分DataNode 因为崩溃或是掉线等原因,离开了HDFS 系统,怎么办?为了保证NameNode 和各个DataNode 的联系,HDFS 采用了心跳包(Heartbeat)机制。位于整个HDFS 核心的NameNode,通过周期性的活动来检查DataNode 的活性,就像跳动的心脏一样,所以,这里把这些包就叫做心跳包。NameNode 周期性向管理的各个DataNode 发送心跳包,而收到心跳包的DataNode 则需要回复。因为心跳包总是定时发送的,所以NameNode 就把要执行的命令也通过心跳包发送给DataNode,而DataNode收到心跳包,一方面回复NameNode,另一方面就开始了与用户或者应用的数据传输。如果侦测到了DataNode 失效,那么之前保存在这个DataNode 上的数据就变成不可用的。那么,如果有的副本存储在失效的DataNode 上,则需要重新创建这个副本,放到另外可用的地方。其他需要创建副本的情况包括数据块校验失败等。
4.数据一致性——校验和checksum:为了保证数据的一致性, HDFS 采用了数据校验和(CheckSum)机制。创建文件时,HDFS 会为这个文件生成一个校验和,校验和文件和文件本身保存在同一空间中。传输数据时会将数据与校验和一起传输,应用收到数据后可以进行校验,如果两个校验的结果不同,则文件肯定出错了,这个数据块就变成了无效的。如果判定数据无效,就需要从其他DataNode 上读取副本。
5.租约:每当写入文件之前,一个客户端必须要获得NameNode 发放的一个租约。NameNode 保证同一个文件只会发放一个允许写的租约,那么就可以有效防止出现多人写入的情况。通过在租约中加入时间限制来解决。每当租约要到期时,客户端需要向NameNode申请更新租约,NameNode“审核”之后,重新发放租约。如果客户端不申请,那就说明客户端不需要读写这一文件或者已经崩溃了,NameNode 收回租约即可。
6.回滚:HDFS 与Hadoop 一样处于发展阶段。而某个升级可能会导致BUG 或者不兼容的问题,这些问题还可能导致现有的应用运行出错。这一问题可以通过回滚回到旧版本解决。HDFS 安装或者升级时,会将当前的版本信息保存起来,如果升级之后一段时间内运行正常,可以认为这次升级没有问题,重新保存版本信息,否则,根据保存的旧版本信息,将HDFS 恢复至之前的版本。
7.DataNode:节点的检测:NameNode不断检测DataNode是否有效,若失效,则寻找新的节点替代,将失效节点数据重新分布。
8.集群负载均衡
9.纠删码:通过对数据进行分块,然后计算出校验数据,使得各个部分的数据产生关系。当一部分数据块丢失时,可以通过剩余的数据块和校验块计算出丢失的数据块。
2.简述Hadoop MapReduce架构v1.0和v2.0的主要区别。
Hadoop v1.0组件主要由HDFS和MapReduce两个系统组成,HDFS是一个分布式文件存储系统,MapReduce是一个离线处理框架,分为三部分,运行时环境为JobTracker和TaskTracker,编程模型为Map映射和Reduce规约,数据处理引擎为MapTask和ReduceTask,Hadoop v1.0资源管理由两部分组成:资源表示模型和资源分配模型,其中,资源表示模型用于描述资源的组织方式,Hadoop 1.0采用“槽位”(slot)组织各节点上的资源,而资源分配模型则决定如何将资源分配给各个作业/任务,在Hadoop中,这一部分由一个插拔式的调度器完成。
Hadoop v2.0组件主要由HDFS、MapReduce和YARN三个系统组成,其中,YARN是一个v2.0版本新增的一个通用的资源管理系统(也可以作为spark,storm等的资源调度器),负责集群资源管理和调度,而MapReduce得运行时环境则是运行在YARN上。
主要区别:
1.新增yarn,1.0时运行环境为JobTracker和TaskTracker,2.0则取消了JobTracker和TaskTracker,使用yarn作为资源调度调度器,将JobTracker中的资源管理和作业控制功能分开,分别由两个不同进程ResourceManager和ApplicationMaster实现,ResourceManager负责所有应用程序的资源分配,Application负责管理一个应用程序。
2.在HDFS方面,2.0版本引入HDFS Federation,它让多个NameNode分管不同的目录进而实现访问隔离和横向扩展,同时彻底解决NameNode单点故障问题。
3.Hadoopv 2.0默认的block大小是128MB,Hadoop v 1.0默认的block大小是64MB
3. 简述HBase的基本数据模型。
HBase是一个分布式多维表,表中的数据通过一个行关键字、一个列关键字、一个时间戳进行索引和查询定位的。按照列储存的稀疏行/列矩阵。物理储存格式上按逻辑模型中的行进行分割,并按照列族储存。行为空的列不予储存。
下面将对HBase的数据存储模型的概念进行解释:
表: 表的作用将存储在HBase的数据组织起来。
行: 行包含在表中,数据以行的形式存储在HBase的表中。HBase的表中的每一行数据都会被一个唯一标识的行键标识。行键没有数据类型,在HBase存储系统中行键总是被看作一个byte数组。
列族: 在行中的数据都是根据列族分组,由于列族会影响存储在HBase中的数据的物理布置,所以列族会在使用前定义(在定义表的时候就定义列族),并且不易被修改。
在HBase的存储系统中数据存储在相同的表中的所有行的数据都会有相同的列族(这和关系型数据库的表一样,每一行数据都有相同的列)。
列限定符: 存储在在列族中的数据通过列限定符或列来寻址的,列不需要提前定义(不需要在定义表和列族的时候就定义列),列与列之间也不需要保持一致。列和行键一样没有数据类型,并且在HBase存储系统中列也总是被看作一个byte数组。
单元格: 根据行键、列族和列可以映射到一个对应的单元格,单元格是HBase存储数据的具体地址。在单元格中存储具体数据都是以Byte数组的形式存储的,也没有具体的数据类型。
时间戳: 时间戳是给定值的一个版本号标识,每一个值都会对应一个时间戳,时间戳是和每一个值同时写入HBase存储系统中的。在默认情况下,时间戳表示数据服务在写入数据时的时间,但可以在将数据放入单元格时指定不同的时间戳值。