Hbase-基本

1 在hbase中cell、rowkey、columnfamily、column、timestamp 都代表什么意思?之间有什么关系?
RowKey(行键):
是Byte array,是表中每条记录的“主键”,按照字典顺序排序,方便快速查找,Rowkey的设计非常重要;
Column Family(列族):
列族,拥有一个名称(string),包含一个或者多个相关列;
建表时指定。
Column(列):
属于某一个columnfamily,familyName:columnName。
建表时不指定列,列可动态添加;
timestamp(时间戳)
Version Number类型为Long,默认值是系统时间戳Timestamp,可由用户自定义;
用于标记同一份数据的不同版本。
Value(Cell):
是Byte array,是由rowkey、列族、列、时间戳唯一确定;
key: <rowkey, 列族, 列, 时间戳>
value: 具体的值
总之,在一个HBase 表中:
表可以有1到N个列族,建表时指定列族;
表的每一行由一个或多个列族组成,一个列族中可以包含任意多个列,添加数据时随意添加列;
通过 key: <rowkey, 列族, 列, 时间戳> 来定位 Cell。


--------------------------------------------------
2 hbase 与 hive的区别?
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能。
Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。hive需要用到hdfs存储文件,需要用到MapReduce计算框架。
hive可以认为是map-reduce的一个包装。hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序。
适合统计分析。hive执行的是mapreduce任务,延迟高。
HBase是Hadoop的数据库,一个分布式、可扩展、大数据的存储。
hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作
hbase可以认为是hdfs的一个包装。他的本质是数据存储,是个NoSql数据库;
hbase部署于hdfs之上,适合大数据量查询,不适合统计分析,hbase是键值对存储,可以快速返回数据。
HBase的出现主要是为了弥补hive 查询高延迟,克服了hdfs在随机读写方面的缺点。


--------------------------------------------------
3 hbase:meta表的作用?
存储了集群中所有用户HRegion的位置信息,且不能split;
存储表的元数据,能够定位region所在的regionserver

 


--------------------------------------------------
4 在每个HRegionServer上有个HLog,HLog的作用是什么?
灾难恢复。
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,
MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

 

--------------------------------------------------
5 每个HRegion包含一个或多个store,每个store代表什么意思?
列族
每个HStore对应了一个Table在这个HRegion中的一个Column Family,
即每个Column Family就是一个集中的存储单元,
因而最好将具有相近IO特性的Column存储在一个Column Family,以实现高效读取。


--------------------------------------------------
6 请写一下hbase写数据的流程?
1)从hbase:meta表找到该写数据最终需要去的HRegionServer;
2)然后客户端将写请求发送给相应的HRegionServer,
在HRegionServer中它首先会将该写操作写入WAL(Hlog)日志文件中(Flush到磁盘中)。
3)写完WAL日志文件后,HRegionServer根据Put中的TableName和RowKey,startkey、endkey
找到对应的HRegion,并根据Column Family找到对应的HStore,并将Put写入到该HStore的MemStore中。
此时写成功,并返回通知客户端。

先通过要写入的region找到regionserver
先写一份数据到HLog日志
再找到对应的store,将数据写入memstore
写流程结束


--------------------------------------------------
7 如何创建预分region的表,不需要写命令,说步骤即可
先分析使用行键的前几位字符作为split的key
再分析每一位字符的数量占比,形成最优的排列组合
将生成的所有的split key存入一个文件split_data
创建表,指定SPLITS_FILE => '表目录/表名'

 

--------------------------------------------------
8 hive表有 用户名、转账金额、转账时间、收款人户名、备注 五个字段,我想将数据导到hbase表中,
能快速查询出指定用户名在指定时间段内的转账记录,且要考虑写热点问题,不考虑两个人的同名问题,
该如何设计表的rowkey?设计完后,该如何查询?
用户名+转账时间
根据 用户名+转账时间 指定startrow endrow进行范围查询
scan 'table',{STARTROW => 'XXX',STOPROW => 'XXX'}


--------------------------------------------------
9 用javaAPI操作hbase表时,会先创建对象,什么时候用HBaseAdmin? 什么时候用HTable?
HBaseAdmin:hbase表管理对象,建表、删表
HTable:表操作对象,添加数据、删除数据等
DDL:创建表、删除表、修改表等情况下用HBaseAdmin
DML、DQL:表数据的增删改查使用HTable

--------------------------------------------------
11 hbase中一个表有多个region,多个region必须在一个HRegionServer上吗?
不一定,如果在一个会出现写热点问题
可以在一个相同的HRegionServer上,也可以分布在不同的HRegionServer上,
一个HRegionServer可以有多个HRegion,分别属于不同的Table。


--------------------------------------------------
12 为什么要预分region?
HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,
在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断增加,此region已经不能承
受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:
1)数据往一个region上写,会有写热点问题。
2)region split会消耗宝贵的集群I/O资源。
基于此可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,
这样只要rowkey设计能均匀的命中各个region,就不会存在写热点问题。

--------------------------------------------------
13 如果给你个orc文件,但不告诉你内部的字段及类型,你该怎么做能知道?
hive --orcfiledump orc文件对应的hdfs目录


--------------------------------------------------
14 hbase是如何优化读性能的?

1)把经常读取的数据放到读缓存

2)大量使用内存存储,文件写入时存储在memstore,能够快速读取
3)memstore达到阈值,进行flush,生成小文件,当小文件数量达到阈值的时候,会进行合并,避免因为需要过多的reduce影响了文件读取
4)合并后的region达到阈值,会自动进行分裂,避免文件过大影响读取性能

hdfs数据
自上而下进行读取,减小磁盘命中

上一篇:HDFS原理


下一篇:java基础之----hbase