Resumen de las preguntas frecuentes de la entrevista HBase Classic

Tabla de contenido

1 Cada día se almacenan decenas de miles de millones de datos en HBase. Cómo garantizar que los datos se almacenen correctamente y que todos se ingresen dentro del tiempo especificado sin datos residuales

2 ¿Cómo proporciona HBase una interfaz para el acceso front-end web?

3 método de optimización HBase

4 principios de RowFilter y BloomFilter en HBase

5 Cómo importar y exportar HBase

6 Cómo preconstruir una región

7 ¿Cómo lidiar con el tiempo de inactividad de HRegionServer?

8 Proceso simple de lectura y escritura de HBase

9 Comparación de HBase y Hive

10 Primer proceso de lectura y escritura de HBase

11 ¿A qué debo prestar atención al compilar HBase?


1 Cada día se almacenan decenas de miles de millones de datos en HBase. Cómo garantizar que los datos se almacenen correctamente y que todos se ingresen dentro del tiempo especificado sin datos residuales

答:看到这个题目的时候我们要思考的是它在考查什么知识点?
我们来看看要求:
1)百亿数据:证明数据量非常大
2)存入HBase:证明是跟HBase的写入数据有关
3)保证数据的正确:要设计正确的数据结构保证正确性
4)在规定时间内完成:对存入速度是有要求的

那么针对以上的四个问题我们来一一分析
1)数据量百亿条,什么概念呢?假设一整天60x60x24 = 86400秒都在写入数据,那么每秒的写入条数高达100万条,HBase当然是支持不了每秒百万条数据的,所以这百亿条数据可能不是通过实时地写入,而是批量地导入。批量导入推荐使用BulkLoad方式(推荐阅读:Spark之读写HBase),性能是普通写入方式几倍以上
2)存入HBase:普通写入是用JavaAPI put来实现,批量导入推荐使用BulkLoad
3)保证数据的正确:这里需要考虑RowKey的设计、预建分区和列族设计等问题
4)在规定时间内完成也就是存入速度不能过慢,并且当然是越快越好,使用BulkLoad

2 ¿Cómo proporciona HBase una interfaz para el acceso front-end web?

答:使用JavaAPI来编写WEB应用;使用HBase提供的RESTful接口

3 método de optimización HBase

答:优化手段主要有以下四个方面

1)减少调整

减少调整这个如何理解呢?HBase中有几个内容会动态调整,如region(分区)、HFile,所以通过一些方法来减少这些会带来I/O开销的调整

Region
如果没有预建分区的话,那么随着region中条数的增加,region会进行分裂,这将增加I/O开销,所以解决方法就是根据你的RowKey设计来进行预建分区,减少region的动态分裂
HFile
HFile是数据底层存储文件,在每个memstore进行刷新时会生成一个HFile,当HFile增加到一定程度时,会将属于一个region的HFile进行合并,这个步骤会带来开销但不可避免,但是合并后HFile大小如果大于设定的值,那么HFile会重新分裂。为了减少这样的无谓的I/O开销,建议估计项目数据量大小,给HFile设定一个合适的值
2)减少启停

数据库事务机制就是为了更好地实现批量写入,较少数据库的开启关闭带来的开销,那么HBase中也存在频繁开启关闭带来的问题。

关闭Compaction,在闲时进行手动Compaction
因为HBase中存在Minor Compaction和Major Compaction,也就是对HFile进行合并,所谓合并就是I/O读写,大量的HFile进行肯定会带来I/O开销,甚至是I/O风暴,所以为了避免这种不受控制的意外发生,建议关闭自动Compaction,在闲时进行compaction
批量数据写入时采用BulkLoad
如果通过HBase-Shell或者JavaAPI的put来实现大量数据的写入,那么性能差是肯定并且还可能带来一些意想不到的问题,所以当需要写入大量离线数据时建议使用BulkLoad
3)减少数据量

虽然我们是在进行大数据开发,但是如果可以通过某些方式在保证数据准确性同时减少数据量,何乐而不为呢?

开启过滤,提高查询速度
开启BloomFilter,BloomFilter是列族级别的过滤,在生成一个StoreFile同时会生成一个MetaBlock,用于查询时过滤数据
使用压缩:一般推荐使用Snappy和LZO压缩
4)合理设计

在一张HBase表格中RowKey和ColumnFamily的设计是非常重要,好的设计能够提高性能和保证数据的准确性

RowKey设计:应该具备以下几个属性

散列性:散列性能够保证相同相似的rowkey聚合,相异的rowkey分散,有利于查询
简短性:rowkey作为key的一部分存储在HFile中,如果为了可读性将rowKey设计得过长,那么将会增加存储压力

唯一性:rowKey必须具备明显的区别性

业务性:举些例子

假如我的查询条件比较多,而且不是针对列的条件,那么rowKey的设计就应该支持多条件查询
如果我的查询要求是最近插入的数据优先,那么rowKey则可以采用叫上Long.Max-时间戳的方式,这样rowKey就是递减排列
列族的设计
列族的设计需要看应用场景

多列族设计的优劣
优势:HBase中数据时按列进行存储的,那么查询某一列族的某一列时就不需要全盘扫描,只需要扫描某一列族,减少了读I/O;其实多列族设计对减少的作用不是很明显,适用于读多写少的场景
劣势:降低了写的I/O性能。原因如下:数据写到store以后是先缓存在memstore中,同一个region中存在多个列族则存在多个store,每个store都一个memstore,当其实memstore进行flush时,属于同一个region
的store中的memstore都会进行flush,增加I/O开销

4 principios de RowFilter y BloomFilter en HBase

答:

1)RowFilter原理简析

RowFilter顾名思义就是对rowkey进行过滤,那么rowkey的过滤无非就是相等(EQUAL)、大于(GREATER)、小于(LESS),大于等于(GREATER_OR_EQUAL),小于等于(LESS_OR_EQUAL)和不等于(NOT_EQUAL)几种过滤方式。Hbase中的RowFilter采用比较符结合比较器的方式来进行过滤。

比较器的类型如下:

BinaryComparator
BinaryPrefixComparator
NullComparator
BitComparator
RegexStringComparator
SubStringComparator
例子:

Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(rowKeyValue)));
Scan scan = new Scan();
scan.setFilter(rowFilter)
...
在上面例子中,比较符为EQUAL,比较器为BinaryComparator

2)BloomFilter原理简析

主要功能:提供随机读的性能
存储开销:BloomFilter是列族级别的配置,一旦表格中开启BloomFilter,那么在生成StoreFile时同时会生成一份包含BloomFilter结构的文件MetaBlock,所以会增加一定的存储开销和内存开销
粒度控制:ROW和ROWCOL
BloomFilter的原理
简单说一下BloomFilter原理
内部是一个bit数组,初始值均为0
插入元素时对元素进行hash并且映射到数组中的某一个index,将其置为1,再进行多次不同的hash算法,将映射到的index置为1,同一个index只需要置1次。
查询时使用跟插入时相同的hash算法,如果在对应的index的值都为1,那么就可以认为该元素可能存在,注意,只是可能存在
所以BlomFilter只能保证过滤掉不包含的元素,而不能保证误判包含
设置:在建表时对某一列设置BloomFilter即可

5 Cómo importar y exportar HBase

答:
1)导入:bin/hbase org.apache.hadoop.hbase.mapreduce.Driver import 表名 路径

路径:来源

本地路径 file:///path
HDFS hdfs://cluster1/path
2)导出:bin/hbase org.apache.hadoop.hbase.mapreduce.Driver export 表名 路径

路径:目的地

本地路径 file:///path
HDFS hdfs://cluster1/path

6 Cómo preconstruir una región

预建分区的方法很简单,有以下两种

hbase shell
create 't1', 'f1',SPLITS=>['10','20','30']
create 't1','f1',SPLITS_FILE =>'splits.txt'
Java API
创建一个byte[][] splitKeys = {
   
   {1,2,3},{4,5,6}}
admin.createTable(tableDesc,splitKeys)
预建分区的难点在于key如何设计,分多少个和如何分的问题,那么下面我们就对这三个问题一一分析:

1)如何设计Key,我们设计Key的原则就是要让Key足够散列,但同时又要保持Key的长度适中,这里给出一个方法,样本取自Spark读写HBase中的数据

01055HAXMTXG10100001@[email protected]@[email protected]@1.55
我想要的rowKey是:01055HAXMTXG10100001KEY_VOLTAGE_TEC_PWR

但是很明显这样肯定是不会足够散列的,那么我们可以对上面那个Key进行MD5,然后取前面三个字符(为了更加散列,可以取1,3,5或者其他组合)再加上原来的Key

DigestUtils.md5Hex(x(0)+x(1)).substring(0,3)+x(0)+x(1)
这样的话我们就可以得到足够散列的数据,并且MD5取得的是十六进制字符串,那么Key的范围就是(0,0,0)至(f,f,f)

2)分多少个:这个需要我们就要根据我们集群规模来进行安排,假设我们有5regionServer,每个regionServer有20个region,那么总共就是100个region,最后的工作就是将000-fff分成100份。

3)如何分:就是生成一个byte[][],用于创建表格,这个我将会些一篇另外的博文来介绍,敬请期待

7 ¿Cómo lidiar con el tiempo de inactividad de HRegionServer?

1)ZooKeeper会监控HRegionServer的上下线情况,当ZK发现某个HRegionServer宕机之后会通知HMaster进行失效备援;
2)该HRegionServer会停止对外提供服务,就是它所负责的region暂时停止对外提供服务
3)HMaster会将该HRegionServer所负责的region转移到其他HRegionServer上,并且会对HRegionServer上存在memstore中还未持久化到磁盘中的数据进行恢复
4)这个恢复的工作是由WAL重播来完成,这个过程如下:

wal实际上就是一个文件,存在/hbase/WAL/对应RegionServer路径下
宕机发生时,读取该RegionServer所对应的路径下的wal文件,然后根据不同的region切分成不同的临时文件recover.edits
当region被分配到新的RegionServer中,RegionServer读取region时会进行是否存在recover.edits,如果有则进行恢复

8 Proceso simple de lectura y escritura de HBase

读:

找到要读取数据的region所在的RegionServer,然后按照以下顺序进行读取:先去BlockCache读取,若BlockCache没有,则到Memstore读取,若MemStore中没有,则到HFile中读取。

写:

找到要写入数据的region所在的RegionServer,然后将数据先写到WAL中,然后再将数据写到MemStore等待刷新,回复客户端写入完成。

9 Comparación de HBase y Hive

HBase    Hive
类型    列式数据库    数据仓库
内部机制    数据库引擎    MapReduce
增删改查    都支持    只支持导入和查询
Schema    只需要预先定义列族,不需要具体到列列可以动态修改    需要预先定义表格
应用场景    实时    离线处理
特点    以K-V形式存储    类SQL

10 Primer proceso de lectura y escritura de HBase

Client从ZooKeeper中读取hbase:meta表
Client从hbase:meta中获取想要操作的region的位置信息,并且将hbase:meta缓存在Client端,用于后续的操作
当一个RegionServer宕机而执行重定位之后,Client需要重新获取新的hase:meta信息进行缓存

11 ¿A qué debo prestar atención al compilar HBase?

hbase-env.sh的配置

是否使用外部ZooKeeper,这个一般使用Hadoop集群的ZooKeeper集群即可。
HBASE_MANAGES_ZK=false
hbase-site.sh的配置

hbase.zookeeper.quorum="host1:2181,host2:2181"

hbase中Compaction的理解及RegionServer内存的使用,CacheBlock机制

Compaction有两种类型:

(1)minor compaction:属于轻量级。将多个小的storefile文件重写为数量较少的大storefile文件,减少存储文件的数量,实际上是个多路归并的过程。它不会删除被标记为“删除”的数据和以往过期的数据,并且执行过一次minor合并操作后,还会有多个storefile文件。因为Hfile的每个文件都是经过归类的,所以合并速度很快,只受到磁盘I/O性能的影响。

(2)major compaction:属于重量级。将一个region中,一个列簇的若干个storefile重写为一个storefile,它能扫描所有的<key,value>对,顺序重写所有的数据,重写数据的过程中,会略过做了删除标记的数据,断言删除在此时生效,同时会阻塞所有客户端对该操作所属的region的请求直到合并完毕,最后删除已合并的storefile文件

RegionServer的内存,在设置的时候,一般这样配置:

(1)MemStore ,约占40%的内存空间(主要用于写):

写请求会先写入memstore,RegionServer会给每个region提供一个memstore, memstore写满以后,会启动flush刷新到磁盘。当memstore的总大小超过限制时,会强行启动flush进程,从最大的memstore开始flush知道低于限制

(2)BlockCache,约占40%的内存空间(主要用于读):

读请求先到memstore中查数据,查不到就到blockCache中查,再查不到就到磁盘上读,并把读的结果放入blockCache。Blockcache采用lru算法,当blockcache达到上限值时,淘汰掉最近最久未使用的一批数据淘汰掉,每个regionserver只有一个blockcache

(3)其他,约占20%的内存空间。

在注重读响应时间的应用场景下,可以将blockcache设置的大一些,memstore设置的小一些,以加大缓存的命中率。

blockCache分级思想:

(1)首先通过inmemory类型cache,可以由选择地将inmemory的column famlies放到RegionServer内存中,例如meta元数据信息;

(2)通过区分Single和Multi类型的cache,可以防止由于Scan操作带来的频繁颠簸,将最少使用的block加入到淘汰算法中去。

默认配置下。对于整个BlockCache的内存,按照以下百分比分给Single、Multi、InMemory使用:0.25,0.50和0.25

 

Supongo que te gusta

Origin blog.csdn.net/godlovedaniel/article/details/113242751
Recomendado
Clasificación