Q1、 HBase中rowkey的设计原则?
建议使用String如果不是特殊要求,RowKey最好都是String。 方便线上使用Shell查数据、排查错误 更容易让数据均匀分布 不必考虑存储成本 RowKey的长度尽量短。如果RowKey太长话,第一是,存储开销会增加,影响存储效率;第二是,内存中Rowkey字段过长,内存的利用率会降低,这会降低索引命中率。
一般的做法是: 时间使用Long来表示 尽量使用编码压缩 RowKey尽量散列RowKey的设计,最重要的是要保证散列,这样就会保证所有的数据都不都是在一个region上,避免做读写的时候负载将会集中在个别region上面。
Q2、 hbase导入数据的几种方式?
- 使用HBase的API中的Put方法。
- 使用bulk load工具从TSV文件中导入数据。
- 自己编写MapReduce Job导入数据。
Q3、 现在有50亿条数据,150个字段,怎么快速的传到hbase上面,hbase的rowkey是怎么设计的,这150个字段怎么设计才合理?
使用hbase自带的工具ImportTsv
ImportTsv是Hbase提供的一个命令行工具,可以将存储在HDFS上的自定义分隔符(默认\t)的数据文件,通过一条命令方便的导入到HBase表中,对于大数据量导入非常实用,其中包含两种方式将数据导入到HBase表中:
第一种是使用TableOutputformat在reduce中插入数据;
第二种是先生成HFile格式的文件,再执行一个叫做CompleteBulkLoad的命令,将文件move到HBase表空间目录下,同时提供给client查询。
依据rowkey长度原则 rowkey散列原则 rowkey唯一原则设计rowkey,根据字段关系生成列簇,生成一个列簇最好,视情况增加列簇的个数,最好1-2个
Q4、 为什么会有列簇这个概念?
一行有若干列组成,若干列又构成一个列族(column family),这不仅有助于构建数据的语义边界或者局部边界,还有助于给他们设置某些特性(如压缩),或者指示他们存贮在内存中,一个列族的所有列存贮在同一个底层的存储文件中,这个存储文件叫做HFile
Q5、 解释下布隆过滤器?
实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。
Q6、 hbase 过滤器实现原则?
Hbase过滤器实现了一些更细粒度的进行筛选,过滤器最基本的接口是Filter,还有一些其他可以直接使用的类,所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证过滤掉的数据不会被传送回客户端。提高系统性能,Hbase中常见的过滤器有比较过滤器,专用过滤器,附加过滤器,FilterList(过滤器列表),当然我们可以通过实现Filter接口或者直接继承FilterBase类来按照自己的需求自定义过滤器
Q7、 在每天增量数据较大(每天大约5T左右)时,在设计表和Hbase整体的参数配置方面有何建议?
Rowkey的设计,遵从几个原则,在长度方面在满足需求的情况下越短越好,因为数据在持久化文件Hfile中是按照keyvalue存储的,如果rowkey过长,数据量大的是后光rowkey就要占据很大空间,影响存储效率,第二个是满足散列原则,避免数据热点堆积现象的发生,还有必须保证rowkey的唯一性,并且覆盖尽可能多的业务场景
参数:hbase.regionserver.handler.count:rpc请求的线程数量,默认值是10,生产环境建议使用100,也不是越大越好,特别是当请求内容很大的时候,比如scan/put几M的数据,会占用过多的内存,有可能导致频繁的GC,甚至出现内存溢出。
hbase.hregion.max.filesize:默认是10G, 如果任何一个column familiy里的StoreFile超过这个值, 那么这个Region会一分为二,因为region分裂会有短暂的region下线时间(通常在5s以内),为减少对业务端的影响,建议手动定时分裂,可以设置为60G。
hbase.hstore.compaction.max:默认值为10,一次最多合并多少个storefile,避免OOM
Q8、 Hbase有哪4要素,hbase中region是谁分配的,又由谁来维护?
client,zookeeper,master,RegionServer,
hbase中的region是由master进行分配的,regionServer用来管理region
Q9、 描述hbase存储架构?
HBase中的存储包括HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等
HMaster:为Region server分配region;负责Region server的负载均衡;发现失效的Region server并重新分配其上的region;HDFS上的垃圾文件回收;处理schema更新请求
HRegionServer:维护master分配给他的region,处理对这些region的io请求;负责切分正在运行过程中变的过大的region
HRegion:table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一行是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值(默认256M)时就会分成两个新的region。
Store:每一个region有一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者多个StoreFile组成。
HBase以store的大小来判断是否需要切分region。
MemStore:memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认64MB)时,memStore会被flush到文件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。
StoreFile:memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
HFile:HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件。
首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer中又指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。
HLog:其实HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,equence number的起始值为0,或者是最近一次存入文件系统中的equence number。
Q10、 HBase存储一个大量的小文件,设计Hbase存储设计方案
对于小文件,我这里假设不足10M,这样我们就不需要对文件split。每个小文件保存到不同的cell中,在HBase中,每一个行与列的交汇处,称为一个cell,其默认上限是10M,当然这个是可以通过配置文件调整的,调整的配置项是 “hbase.client.keyvalue.maxsize”,其默认值是10485760。对于文件源,可以是本地的文件,本测试用例中使用的是本地的email文件,大小才15k左右,我们将创建一个本地Java工程,读取本地文件后,再通过API保存到HBase中。另外一个可能的场景是,将本地程序变换为一个RESTful API,外部系统远程调用这个RESTful API,将数据存到HBase中,通过这个API,可以串起2个独立的系统。
Q11、 hbase 和hive 中 增、删、改、查、 库、表的概念哪些有哪些没有?
Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Reduce. 虽然Hive提供了SQL查询功能,但是Hive不能够进行交互查询–因为它只能够在Haoop上批量的执行Hadoop,Hive中有增、查、库、表的概念。
Apache HBase是一种Key/Value系统,它运行在HDFS之上。和Hive不一样,Hbase的能够在它的数据库上实时运行,Hbase被分区为表格,表格又被进一步分割为列簇。列簇必须使用schema定义,列簇将某一类型列集合起来(列不要求schema定义)。例如,“message”列簇可能包含:“to”, ”from” “date”, “subject”, 和”body”. 每一个 key/value对在Hbase中被定义为一个cell,每一个key由row-key,列簇、列和时间戳。在Hbase中,行是key/value映射的集合,这个映射通过row-key来唯一标识。Hbase利用Hadoop的基础设施,可以利用通用的设备进行水平的扩展。Hbase中有增删、改、查、表的概念
Q12、 hive和hbase整合实现
(1) 进入 hive 安装包的 lib 目录下, 里面有一个 hive-hbase-handler 的 jar 包, 复制此 jar 包到 hbase 的 lib 目录下
scp $HIVE_HOME/lib/hive-hbase-handler-1.1.0-cdh5.4.0.jar $HBASE_HOME/lib/
(2) 将 HBASE 下的 lib 下的所有包都复制到 hive 的 lib 目录下
scp $HBASE_HOME/lib/*.jar $HIVVE_HOME/lib/
Q13、 HBase不用Scan和get查询使用什么方式可以查询?
1、 协处理器
2、 Mapreduce