乐趣区

关于后端:面试题百日百刷HBase中HTable-API有没有线程安全问题在程序是单例还是多例

锁屏面试题百日百刷,每个工作日保持更新面试题。请看到最初就能获取你想要的, 接下来的是今日的面试题:

1.HBase 外部机制是什么?**

Hbase 是一个能适应联机业务的数据库系统

物理存储:hbase 的长久化数据是将数据存储在 HDFS 上。

存储管理:一个表是划分为很多 region 的,这些 region 分布式地寄存在很多 regionserver 上 Region 外部还能够

划分为 store,store 外部有 memstore 和 storefile。

版本治理:hbase 中的数据更新实质上是一直追加新的版本,通过 compact 操作来做版本间的文件合并 Region

的 split。

集群治理:ZooKeeper + HMaster + HRegionServer。

2.HTable API 有没有线程平安问题,在程序是单例还是多例?**

在单线程环境下应用 hbase 的 htable 是没有问题,然而忽然高并发多线程状况下就可能呈现问题。

以下为 Htable 的 API 阐明:

This class is not thread safe for updates; the underlying write buffer can be corrupted if multiple threads contend over a single HTable instance. 当有多个线程竞争时可能把以后正在写的线程 corrupted,那么起因是什么呢?

依据 Htable 的源码:

public HTable(final byte [] tableName)throws IOException{this(HBaseConfiguration.create(), tableName);
}
public static Configuration create() {Configuration conf = new Configuration(); 
    return addHbaseResources(conf);
}

从下面咱们能够看到每一个 HTable 的实例化过程都要创立一个新的 conf,咱们甚至能够认为一个 conf 对应的是一个 HTable 的 connection,因而如果客户端对于同一个表,每次新 new 一个 configuration 对象的话,那么意味着这两个 HTable 尽管操作的是同一个 table,然而建设的是两条链接 connection,它们的 socket 不是共用的,在多线程的状况下,常常会有 new Htable 的状况产生,而每一次的 new 都可能是一个新的 connection,而咱们晓得 zk 上的链接是有限度的如果链接达到肯定阈值的话,那么新建设的链接很有可能挤掉原先的 connection,而导致线程不平安。

因而 hbase 官网文档倡议咱们:HTable 不是线程平安的。倡议应用同一个 HBaseConfiguration 实例来创立 HTable 实例,这样能够共享 ZooKeeper 和 socket 实例。例如,最好这样做:

HBaseConfiguration conf = HBaseConfiguration.create();
HTable table1 = new HTable(conf, "myTable");
HTable table2 = new HTable(conf, "myTable");

而不是这样:

HBaseConfiguration conf1 = HBaseConfiguration.create();
HTable table1 = new HTable(conf1, "myTable");
HBaseConfiguration conf2 = HBaseConfiguration.create();
HTable table2 = new HTable(conf2, "myTable");

当然最不便的办法就是应用 HTablepool 了,维持一个线程平安的 map 外面寄存的是 tablename 和其援用的映射,能够认为是一个简略的计数器,当须要 new 一个 HTable 实例时间接从该 pool 中取,用完放回。

3.HBase 有没有并发问题?**

针对 HBase 在高并发状况下的性能,咱们进行如下测试:

测试版本:hbase 0.94.1、hadoop 1.0.2、jdk-6u32-linux-x64.bin、snappy-1.0.5.tar.gz

测试 hbase 搭建:14 台存储机器 + 2 台 master、DataNode 和 regionserver 放在一起。

测试一:高并发读(4w+/s) + 大量写(容许分拆、负载平衡)

症状:1- 2 天后,hbase 挂掉(零碎性能极差,不到失常的 10%)。其实并非全副挂掉,而是某些 regionserver 挂了,并在几个小时内引发其余 regionserver 挂掉。零碎无奈复原:独自启 regionserver 无奈恢复正常。重启后失常。

测试二:高并发读(4w+/s)

症状:1- 2 天后,hbase 挂掉(零碎性能极差,不到失常的 10%)。后发现是因为 zookeeper.session.timeout 设置不正确导致(参见 regionserver 局部:http://hbase.apache.org/book.html#trouble)。重启后失常。

测试三:高并发读(4w+/s)

症状:1- 2 天后,hbase 挂掉(零碎性能极差,不到失常的 10%)。从 log 未看出问题,但 regionserver 宕机,且 datanode 也宕机。重启后失常。

测试四:高并发读 (4w+/s)+ 禁止分拆、禁止 majorcompaction、禁止负载平衡(balance_switch 命令) 症状:1- 2 天后,hbase 挂掉(零碎性能极差,不到失常的 10%)。从 log 未看出问题,但 regionserver 宕机,且 datanode 也宕机。重启后失常。

测试期间,还发现过:无奈获取 ”.MATE.” 表的内容(想晓得 regionserver 的散布状况)、hbase 无奈正确进行、hbase 无奈正确启动(日志复原失败,文件谬误,最终手动删除日志重启)。

全部内容在 git 上, 理解更多请点我头像或到我的主页去取得,谢谢**

退出移动版