大数据面试题

本文深入探讨了大数据领域的核心知识点,覆盖Hadoop、Spark、Flink、HBase、HDFS、MySQL、Hive等技术的面试题及解答,解析了大数据组件的工作原理,包括数据存储、处理流程、优化策略及常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我自己整理的一部分大数据面试题分享给大家 包含 spark flink hbase hdfs mysql hive什么的
一、.hdfs写文件的步骤

答案:

(1)client向NameNode申请上传…/xxx.txt文件

(2)NN向client响应可以上传文件

(3)Client向NameNode申请DataNode

(4)NN向Client返回DN1,DN2,DN3

(5)Client向DN1,DN2,DN3申请建立文件传输通道

(6)DN3,DN2,DN1依次响应连接

(7)Client向DN1上传一个block,DN1向DN2,DN3冗余文件

二、hdfs读取文件步骤**

答案:

(1)client向NN请求下载…/xxx.txt文件

(2)NN向client返回文件的元数据

(3)Client向DN1请求访问读数据blk_1

(4)DN1向Client传输数据

(5)Client向DN2请求访问读数据blk_2

(6)DN2向Client传输数据

五、简单说一下hadoop的map-reduce模型

Map阶段:

Step 1:读取输入文件的内容,并解析成键值对(<key, value>)的形式,输入文件中的每一行被解析成一个<key, value>对,每个<key, value>对调用一次map()函数。

Step 2:用户写map()函数,对输入的<key,value>对进行处理,并输出新的<key,value>对。

Step 3:对Step 2中得到的<key,value>进行分区操作。

Step 4:不同分区的数据,按照key值进行排序和分组,具有相同key值的value则放到同一个集合中。

Step 5(可选):分组后的数据进行规约。

Reduce阶段:

Step 1:对于多个map任务的输出,按照不同的分区,通过网络传输到不同的Reduce节点。

Step 2:对多个map任务的输出结果进行合并、排序,用户书写reduce函数,对输入的key、value进行处理,得到新的key、value输出结果。

Step 3:将reduce的输出结果保存在文件中。

Hive数据倾斜

原因

key分布不均匀

业务数据本身的特性

SQL语句造成数据倾斜

解决方法

hive设置hive.map.aggr=true和hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job在根据预处理的数据结果按照 Group By Key 分布到Reduce中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。

SQL语句调整:

选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变小的效果。

大小表Join: 使用map join让小的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。

大表Join大表:把空值的Key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。

count distinct大量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union.

Hive中的排序关键字有哪些

sort by ,order by ,cluster by ,distribute by

sort by :不是全局排序,其在数据进入reducer前完成排序

order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序).只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。

cluster by : 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort

distribute by :按照指定的字段对数据进行划分输出到不同的reduce中

Hive中追加导入数据的4种方式是什么?请写出简要语法

从本地导入: load data local inpath ‘/home/1.txt’ (overwrite)into table student;

从Hdfs导入: load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;

查询导入: create table student1 as select * from student;(也可以具体查询某项数据)

查询结果导入:insert (overwrite)into table staff select * from track_log;

hive 内部表和外部表区别

创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。

删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

分区和分桶的区别

分区

是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。

那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找

分桶

分桶是相对分区进行更细粒度的划分。

分桶将整个数据内容安装某列属性值得hash值进行区分,如要按照name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。

如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件

MYSQL读操作的IO流程

1、查看缓存中是否存在id,

2、如果有则从内存中访问,否则要访问磁盘,

3、并将索引数据存入内存,利用索引来访问数据,

4、对于数据也会检查数据是否存在于内存,

5、如果没有则访问磁盘获取数据,读入内存。

6、返回结果给用户。

spark中的RDD是什么,有哪些特性

  • RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。

hive数据迁移

DAtax

mysql优化

1.表的是设计合理化(符合 3范式)

2.添加适当的索引(index)[四种:普通索引,主键索引,唯一索引,unique,全文索引]

3.分表技术(水平分割,垂直分割)

4.读写[写:update/delete/add]分离

5.存储过程[模块化编程,可以提高速度]

hive的分层

源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。

细节层(DW):为数据仓库层,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。

应用层(DA 或 APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。

(ADS):调整使用

Spark为什么比mapreduce快

  • 基于内存计算,减少低效的磁盘交互
  • 高效的调度算法,基于DAG
  • 容错机制Linage
  1. 什么是RDD宽依赖和窄依赖?

窄依赖:每一个parent RDD的Partition最多被子RDD的一个Partition使用 (一父一子)

宽依赖:多个子RDD的Partition会依赖同一个parent RDD的Partition (一父多子)

  1. map与flatMap的区别
  • map:对RDD每个元素转换,文件中的每一行数据返回一个数组对象
  • flatMap:对RDD每个元素转换,然后再扁平化,将所有的对象合并为一个对象,会抛弃值为null的值

简述对大数据组件的理解

  1. Yarn:大数据组件运行的job的管理器
  2. Spark:分布式的利用内存进行分布式运算的大数据组件
  3. Hbase:基于Hadoop的大数据常用数据库
  4. Hive:基于Hadoop的大数据数据仓库,操作和关系型数据库(MySQL)类似

2、hdfs文件系统中NameNode和DataNode的区别和联系?

NameNode存储了元数据,并且调度,协调整个集群

DataNode主要用来存储数据

hive与mysql(传统数据库)的区别?

查询语言不同:hive是hql语言,mysql是sql语言

数据存储位置不同:hive是把数据存储在hdfs上,mysql数据是存储在自己的系统中

数据格式:hive数据格式用户可以自定义,mysql有自己的系统定义格式

数据更新:hive不支持数据更新,只可以读,不可以写,而sql支持数据更新

索引:hive没有索引,因此查询数据的时候是通过mapreduce很暴力的把数据都查询一遍,也造成了hive查询数据速度很慢的原因,而mysql有索引;

延迟性:hive延迟性高,原因就是上边一点所说的,而mysql延迟性低;

数据规模:hive存储的数据量超级大,而mysql只是存储一些少量的业务数据;

底层执行原理:hive底层是用的mapreduce,而mysql是excutor执行器;

Spark程序编写的一般步骤

初始化,资源,数据源,并行化,rdd转化,action算子打印输出结果或者也可以存至相应的数据存储介质

Spark有哪两种算子?

Transformation(转化)算子和Action(执行)算子。

事务四大特性

  • 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态
  • 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;
  • 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
  • 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。

什么是事务?

事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

MySQL数据库提供的四种隔离级别?

  • read uncommitted(读未提交)
  • read committed(读已提交)
  • repeatable read(可重复读):InnoDB的默认隔离级别
  • serializable(串行

非关系型数据库和关系型数据库区别,优势比较?

非关系型数据库的优势:

  • 性能:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
  • 可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

  • 复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持:使得对于安全性能很高的数据访问要求得以实现

31、什么是 内连接、外连接、交叉连接、笛卡尔积等?

  • 内连接: 只连接匹配的行

  • 左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

  • 右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

  • 全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

  • 交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配

sprakSQL的运行原理

将 Spark SQL 转化为 RDD, 然后提交到集群执行

二、 Flink 相比传统的 Spark Streaming 有什么区别

Flink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批(Micro-Batch)的模型

Flink 程序在运行时主要有 TaskManager,JobManager,Client三种角色。

其中JobManager扮演着集群中的管理者Master的角色,它是整个集群的协调者,负责接收Flink Job,协调检查点,Failover 故障恢复等,同时管理Flink集群中从节点TaskManager。

TaskManager是实际负责执行计算的Worker,在其上执行Flink Job的一组Task,每个TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向JobManager汇报。

Client是Flink程序提交的客户端,当用户提交一个Flink程序时,会首先创建一个Client,该Client首先会对用户提交的Flink程序进行预处理,并提交到Flink集群中处理,所以Client需要从用户提交的Flink程序配置中获取JobManager的地址,并建立到JobManager的连接,将Flink Job提交给JobManager。

Flink有没有重启策略?说说有哪几种?

固定延迟重启策略(Fixed Delay Restart Strategy)

故障率重启策略(Failure Rate Restart Strategy)

没有重启策略(No Restart Strategy)

Fallback重启策略(Fallback Restart Strategy)

1.hbase的特点是什么?

答:1)hbase是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理。

2)hbase 适合存储半结构化或非结构化的数据,对于数据结构字段不够确定或者杂乱无章很难按照一个概念去抽取的数据。

3)hbase为null的数据不会被存储

4)基于的表包含rowKey,时间戳和列族,新写入数据时,时间戳更新,同时可以查询到以前的版本

5)hbase是主从结构,hmaster作为主节点,hregionServer作为从节点

2.hbase如何导入数据?

使用 MapReduce Job 方式,根据 Hbase API 编写 java 脚本,将文本文件用文件流的方式截取,然后存储到多个字符串数组中,在 put 方法下,通过对表中的列族进行 for 循环遍历列名,用 if 判断列名后进行 for 循环调用 put.add 的方法对列族下每一个列进行设值,每个列族下有几个了就赋值几次!没有表先对先创建表。

3.hbase 的存储结构?

答: Hbase 中的每张表都通过行键(rowkey)按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一个子表时,会创建一个 HRegion 对象,然后对表的每个列族(Column Family)创建一个 store 实例,每个 store 都会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile, HFile 就是实际的存储文件,因此,一个 HRegion 还拥有一个 MemStore 实例。

4.Hbase 和 hive 有什么区别hive 与 hbase 的底层存储是什么?hive是产生的原因是什么?habase是为了弥补hadoop的什么缺陷?

答案:共同点:1.hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储

区别:2.Hive是建立在Hadoop之上为了减少MapReducejobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。

3.想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop 。

4.Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多。

5.Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。

6.hive借用hadoop的MapReduce来完成一些hive中的命令的执行

7.hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作。

8.hbase是列存储。

9.hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。

10.hive需要用到hdfs存储文件,需要用到MapReduce计算框架。

5.解释下 hbase 实时查询的原理

答:实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内。 HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。

6.列簇怎么创建比较好?(<=2)

答: rowKey 最好要创建有规则的 rowKey,即最好是有序的。 HBase 中一张表最好只创建一到两个列族比较好,因为 HBase 不能很好的处理多个列族。

7.描述 Hbase 中 scan 和 get 的功能以及实现的异同.

1.按指定RowKey 获取唯一一条记录, get方法(org.apache.hadoop.hbase.client.Get)Get 的方法处理分两种 : 设置了 ClosestRowBefore 和没有设置的 rowlock .主要是用来保证行的事务性,即每个 get 是以一个 row 来标记的.一个 row 中可以有很多 family 和 column.

2.按指定的条件获取一批记录, scan 方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是 scan 方式.1)scan 可以通过 setCaching 与 setBatch 方法提高速度(以空间换时间); 2)scan 可以通过 setStartRow 与 setEndRow 来限定范围([start, end]start 是闭区间, end 是开区间)。范围越小,性能越高。3)scan 可以通过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。

3.全表扫描,即直接扫描整张表中所有行记录

8.请详细描述 Hbase 中一个 Cell 的结构

HBase 中通过 row 和 columns 确定的为一个存贮单元称为 cell。Cell:由{row key, column(= +

9.请描述 Hbase 中 scan 对象的 setCache 和 setBatch 方法的使用.

cache:

在默认情况下,如果你需要从hbase中查询数据,在获取结果ResultScanner时,hbase会在你每次调用ResultScanner.next()操作时对返回的每个Row执行一次RPC操作。即使你使用ResultScanner.next(int nbRows)时也只是在客户端循环调用RsultScanner.next()操作,你可以理解为hbase将执行查询请求以迭代器的模式设计,在执行next()操作时才会真正的执行查询操作,而对每个Row都会执行一次RPC操作。

 因此显而易见的就会想如果我对多个Row返回查询结果才执行一次RPC调用,那么就会减少实际的通讯开销。这个就是hbase配置属性“hbase.client.scanner.caching”的由来,设置cache可以在hbase配置文件中显示静态的配置,也可以在程序动态的设置。



 cache值得设置并不是越大越好,需要做一个平衡。cache的值越大,则查询的性能就越高,但是与此同时,每一次调用next()操作都需要花费更长的时间,因为获取的数据更多并且数据量大了传输到客户端需要的时间就越长,一旦你超过了maximum heap the client process 拥有的值,就会报outofmemoryException异常。当传输rows数据到客户端的时候,如果花费时间过长,则会抛出ScannerTimeOutException异常。

batch:

 在cache的情况下,我们一般讨论的是相对比较小的row,那么如果一个Row特别大的时候应该怎么处理呢?要知道cache的值增加,那么在client process 占用的内存就会随着row的增大而增大。在hbase中同样为解决这种情况提供了类似的操作:Batch。可以这么理解,cache是面向行的优化处理,batch是面向列的优化处理。它用来控制每次调用next()操作时会返回多少列,比如你设置setBatch(5),那么每一个Result实例就会返回5列,如果你的列数为17的话,那么就会获得四个Result实例,分别含有5,5,5,2个列。

下面会以表格的形式来帮助理解,假设我们拥有10Row,每个row拥有2个family,每个family拥有10个列。(也就是说每个Row含有20列)

caching batch Results RPCs Notes
1 1 200 201 额外的一个RPC是用来判断scan是否完成
200 1 200 2
2000 100 10 1 超过的部分没有用处,但是判断scan也在那一个RPC 中完成
2 100 10 6 10/2 +1 (额外的判断开销)
2 10 20 11
5 100 10 3
5 20 10 3
10 10 20 3

RPCs=(Rows* Cols per Row) / Min(Cols per Row, Batch size) / Scanner caching

上图引用自hbase权威指南,是用来表示一个RPC call的构成。

10.简述 HBASE 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?

在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile 的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。

Compact 的作用:

1>.合并文件

2>.清除过期,多余版本的数据

3>.提高读写数据的效率

HBase 中实现了两种 compaction 的方式:

minor and major. 这两种 compaction 方式的区别是:

1、 Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。

2、 Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。简述 Hbase filter 的实现原理是什么?结合实际项目经验,写出几个使用 filter 的场景HBase 为筛选数据提供了一组过滤器,通过这个过滤器可以在 HBase 中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列名,时间戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是通过scan设置的,所以是基于scan的查询结果进行过滤.过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;如在进行订单开发的时候,我们使用rowkeyfilter过滤出某个用户的所有订单

11. Hbase 内部是什么机制

12.HBase 宕机如何处理

答:宕机分为 HMaster 宕机和 HRegisoner 宕机,如果是 HRegisoner 宕机, HMaster 会将其所管理的 region 重新分布到其他活动的 RegionServer 上,由于数据和日志都持久在 HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。如果是 HMaster 宕机, HMaster 没有单点问题, HBase 中可以启动多个 HMaster,通过Zookeeper 的 Master Election 机制保证总有一个 Master 运行。即 ZooKeeper 会保证总会有一个 HMaster 在对外提供服务。

13.导致Hbase挂掉的场景

导致Hbase挂掉的场景

HMaster

HMaster会出现异常(执行abort())停止的场景如下:

1.zk异常导致的master停止服务是最常见的场景,涉及操作包含但不限于以下:

a)Zk链接超时,超时时间通过zookeeper.session.timeout配置,默认为3分钟, 如果fail.fast.expired.active.master配置的值为false(默认为false),则不会立即abort,而是会尝试恢复zk的过期session;

b)在打开region后,需要从zk中删除opened节点,如果zk有该节点,但是删除失败;

c)在split region过程中,从zk删除split节点时;

d)Master节点改变时;

e)从zk中创建unassigned节点时;

f)在下线disabled的regoin时,从zk中删除disabled的region如果发生zk异常;

g)还有很多操作zk的节点时如果出现异常。

2.在assign时,如果设置region为offlined状态,但是region之前的状态不是closed或者offlined;

3.在assign时,如果无法从.META.表中读取region信息;

4.把新的hbase集群加入到正在运行的hbase集群时,如果zk的/hbase/unassigned节点没有数据;

5.使用线程池批量分配region时,如果出现未被捕获的异常,实现方式如下:

6.在启动master的服务线程时,出现了异常;

7.在hdfs中检查hbase日志路径时,发现了dead的server时,需从hdfs中读出log,如果出现io异常需要检查hdfs文件系统,如果fsOk状态为true,但是通过FSUtils工具类进行检查时出现io异常;

8.在校验并且分配-ROOT-的region时,如果zk异常,或者其它异常(其它异常会重试10次),比如:“-ROOT- is onlined on the dead server”。

HRegionServer

HRegionServer会出现异常停止(执行abort())服务的场景如下:

1.在读写hdfs时如果出现IOException异常,此时会发起hdfs的文件系统检查(checkFileSystem)1.

2.Regionserver的服务线程出现了未捕获异常;

3.在启动HRegionServer时出现异常;

4.在进行HLog回滚时,出现异常;

5.在flush memstore时,如果持久化失败,会重启RS,在重启中把hlog的内容重新加载到memstore;

6.出现zk异常,包括但不限于以下场景:

a)Zk链接超时,超时时间通过zookeeper.session.timeout配置,默认为3分钟,与master不同,如果zk操作不会重试;

b)启动HRegionServer时出现KeeperException异常;

c)在进行split操作时,如果出现异常会进行回滚操作,在回滚过程中需要从zk中删除region的spliting状态,如果删除时出现KeeperException或者回滚的其它操作出现异常;

d)在打开region时,出现了KeeperException异常;

e)在进行hbase集群复制时,很多与zk交互的操作出现KeeperException异常时均会导致abort;

7.在close region时,如果出现异常,比如:不能成功的flush memstore;

8.Flush memstore时,如果HLog发现该region已经在flush则会强制终止JVM,采用的是Runtime.getRuntime().halt(1)方法,该方法不会执行正常退出的关闭钩子,从而不会flush RS的所有region,也不会迁移region,只有等待ZK的session超时后master才会发现该RS不可用,做迁移工作。

总结

Hbase挂掉的可能性有很多,主要由zk或者hdfs的问题导致,因此zk、hdfs的可用对于hbase极其重要,关于zk:

1.zk如果停止了服务则在很多时候会导致master、rs挂掉,hbase集群基本上就失去了服务的能力,因此zk一定要是稳定可靠的,当client已经于rs建立了链接,这时zk挂掉,如果不进行split等小数与zk交互失败会导致触发rs的abort()的操作时rs还是可以提供服务的;

2.如果rs/master进行了长时间的gc或者改动了服务器时间,导致出现zk的session超时会导致rs/master停止服务,目前已经出现了2次因为服务器时间变化导致hbase停止服务的事故;

3.别轻易人为改变zk的hbase节点数据,master/rs在进行很多操作时会比较依赖zk的数据,如果发现不符合预期可能会导致master/rs停止服务,尤其是master。

Master通过ZK知道RS是否可用,一般情况下RS在停止服务时均会正常退出,在正常退出时会从ZK中删除/hbase/rs/$regionserver的节点,Master会监听该节点的被删除,从而较快的(速度取决于所有region关闭时间)对该RS负责的region进行重新分配,如果是强制退出,比如 kill -9或者出现HRegionServer挂掉的第8条时则只有等待ZK的session超时时才会删除RS在ZK的节点(RS在ZK中添加节点时采用的是CreateMode.EPHEMERAL模式,该模式创建的节点会在session关闭时自动删除),那时Master才会进行重新assign。

Kill RS的进程也是正常退出(不能使用kill -9强制退出),RS使用Runtime的addShutdownHook方法注册了jvm关闭钩子,在关闭钩子中会执行RS的退出逻辑,实际上hbase-daemon.sh的停止RS就是采用kill。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值