锁屏面试题百日百刷,每个工作日保持更新面试题。锁屏面试题app、小程序现已上线,官网地址:https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容,还蕴含特色的解锁屏幕温习面试题、每日编程题目邮件推送等性能。让你在面试中后人一步!接下来的是今日的面试题:

1.形容HBase的rowKey的设计准则?**

① Rowkey长度准则

Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者倡议说设计在10~100 个字节,不过倡议是越短越好,不要超过16 个字节。

起因如下:

(1)数据的长久化文件HFile 中是依照KeyValue 存储的,如果Rowkey 过长比方100 个字节,1000 万列数据光Rowkey 就要占用100*1000 万=10 亿个字节,将近1G 数据,这会极大影响HFile 的存储效率;

(2)MemStore 将缓存局部数据到内存,如果Rowkey 字段过长内存的无效利用率会升高,零碎将无奈缓存更多的数据,这会升高检索效率。因而Rowkey 的字节长度越短越好。

(3)目前操作系统是都是64 位零碎,内存8 字节对齐。管制在16 个字节,8 字节的整数倍利用操作系统的最佳个性。

② Rowkey散列准则

如果Rowkey 是按工夫戳的形式递增,不要将工夫放在二进制码的后面,倡议将Rowkey的高位作为散列字段,由程序循环生成,低位放工夫字段,这样将进步数据平衡散布在每个Regionserver 实现负载平衡的几率。如果没有散列字段,首字段间接是工夫信息将产生所有新数据都在一个 RegionServer 上沉积的热点景象,这样在做数据检索的时候负载将会集中在个别RegionServer,升高查问效率。

③ Rowkey惟一准则

必须在设计上保障其唯一性。

2.形容HBase中scan和get的性能以及实现的异同?**

HBase的查问实现只提供两种形式:

1)按指定RowKey 获取惟一一条记录,get办法(org.apache.hadoop.hbase.client.Get)

Get 的办法解决分两种 : 设置了ClosestRowBefore 和没有设置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.请形容HBase中scan对象的setCache和setBatch办法的应用?**

setCache用于设置缓存,即设置一次RPC申请能够获取多行数据。对于缓存操作,如果行的数据量十分大,多行数据有可能超过客户端过程的内存容量,由此引入批量解决这一解决方案。

setBatch 用于设置批量解决,批量能够让用户抉择每一次ResultScanner实例的next操作要取回多少列,例如,在扫描中设置setBatch(5),则一次next()返回的Result实例会包含5列。如果一行包含的列数超过了批量中设置的值,则能够将这一行分片,每次next操作返回一片,当一行的列数不能被批量中设置的值整除时,最初一次返回的Result实例会蕴含比拟少的列,如,一行17列,batch设置为5,则一共返回4个Result实例,这4个实例中包含的列数别离为5、5、5、2。

组合应用扫描器缓存和批量大小,能够让用户不便地管制扫描一个范畴内的行键所须要的RPC调用次数。

Cache设置了服务器一次返回的行数,而Batch设置了服务器一次返回的列数。

如果咱们建设了一张有两个列族的表,增加了10行数据,每个行的每个列族下有10列,这意味着整个表一共有200列(或单元格,因为每个列只有一个版本),其中每行有20列。

① Batch参数决定了一行数据分为几个Result,它只针对一行数据,Batch再大,也只能将一行的数据放入一个Result中。所以当一行数据有10列,而Batch为100时,也只能将一行的所有列都放入一个Result,不会混合其余行;

② 缓存值决定一次RPC返回几个Result,依据Batch划分的Result个数除以缓存个数能够失去RPC音讯个数(之前定义缓存值决定一次返回的行数,这是不精确的,精确来说是决定一次RPC返回的Result个数,因为在引入Batch之前,一行封装为一个Result,因而定义缓存值决定一次返回的行数,但引入Batch后,更精确的说法是缓存值决定了一次RPC返回的Result个数);