hbase常用命令

1、hbase 创建namespace

create_namespace ‘test’

2、给一个用户赋权namespace完全管理权限:

grant ‘hive’,’RWXCA’,’@test’

PS:在cdh启用了kerberos后,hive在映射表到hbase的时候。会报权限问题:

我当前kinit的用户hive用户,但是报错的时候说的是hive/bdp04@PICC.COM这个用户没有权限。然后我执行了:

grant ‘hive/bdp04′,’RWXCA’,’@default’
grant ‘hive/bdp04@PICC.COM’,’RWXCA’,’@default’

都还是报错。接着我在hbae shell输入whoami,结果显示当前的用户是:

hive@PICC.COM

这个和kinit是一直。然后我赋权:

grant ‘hive@PICC.COM’,’RWXCA’,’@default’

也是无效的。。。哎。。最后一通乱赋权成功了。下面语句有效:

grant ‘hive’,’RWXCA’,’@default’

3、在hive映射一张表到hbae,指定的namespace

CREATE EXTERNAL TABLE hbase_image_20181124(rk string,
IMAGE_ID STRING)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,
image:IMAGE_ID STRING”)
TBLPROPERTIES(“hbase.table.name” = “test:hbase_image_20181124″,”hbase.mapred.output.outputtable” = “hbase_image_20181124”);

4、hbase删除表:

disable ‘test:hbase_image_20181124’
drop ‘test:hbase_image_20181124’

5、hbase创建到namespace为test的表:
create ‘test:hbase_image_20181124′,’image’,SPLITS => [‘0000000000000000000fffffffffffffffffffff’,’1000000000000000000000000000000000000000′,’2000000000000000000000000000000000000000′,’3000000000000000000000000000000000000000′,’4000000000000000000000000000000000000000′,’5000000000000000000000000000000000000000′,’6000000000000000000000000000000000000000′,’7000000000000000000000000000000000000000′,’8000000000000000000000000000000000000000′,’9000000000000000000000000000000000000000′,’a000000000000000000000000000000000000000′,’b000000000000000000000000000000000000000′,’c000000000000000000000000000000000000000′,’d000000000000000000000000000000000000000′,’e000000000000000000000000000000000000000′,’f000000000000000000000000000000000000000′]

PS:SPLITS是一种预分区的方法,防止在第一次建表的时候由于rowkey不均衡,在region server上造成热点数据,同时也可以加快数据加载速度。hive到hbase有一种blukload的方法。

6、将一个字符串传给hbase shell执行:
echo “create ‘hbase_test3′,’family_base’,SPLITS => [‘2′,’4′,’6′,’8′,’a’,’d’]” | hbase shell

7、hbase shell执行一个代码文件:
hbase shell ./sample_commands.txt
参考地址

HBase和Solr的性能对比

以前一直没有搞懂既然Solr可以做多维检索,为什么还要用HBase呢?HBase的Rowkey只能做一个行键查询,远不如Solr的多维检索,而且性能也不差。然后我们就做了一个测试,测试结果如下:

测试结论:如果查询可以做成基于rowkey查询的话,最好使用hBase,这个性能比Solr快太多。而且在1000个并发的时候,solr无法承受住压力,而hbase性能依旧良好。

 

从HIVE导入数据到HBase

从hive到hbase导入数据,最快的方式是使用bulkload。这种方式正好已经被hive实现了,可以从这个链接中找到原文解释。https://cwiki.apache.org/confluence/display/Hive/HBaseBulkLoad

整个代码非常简单,只有如下几步:

1、创建映射表。
CREATE TABLE new_hbase_table(rowkey string, x int, y int)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,cf:x,cf:y”);
SET hive.hbase.bulk=true;
INSERT OVERWRITE TABLE new_hbase_table
SELECT rowkey_expression, x, y FROM …any_hive_query…;
上面的代码只是先建表,然后再将数据插入到HBASE中。官方文档对上面的代码所做的背后处理,进行了简单的解释。
1、Decide how you want the data to look once it has been loaded into HBase.
决定hbase中的数据格式和模式。
2、Decide on the number of reducers you’re planning to use for parallelizing the sorting and HFile creation. This depends on the size of your data as well as cluster resources available.
根据数据量大小和集群可用资源,决定reucer数量。
3、Run Hive sampling commands which will create a file containing “splitter” keys which will be used for range-partitioning the data during sort.
计算预分区键。
4、Prepare a staging location in HDFS where the HFiles will be generated.
准备HFile的存放路径
5、Run Hive commands which will execute the sort and generate the HFiles.
(Optional: if HBase and Hive are running in different clusters, distcp the generated files from the Hive cluster to the HBase cluster.)
执行HIVE命令,生成HFile。
6、Run HBase script loadtable.rb to move the files into a new HBase table.
(Optional: register the HBase table as an external table in Hive so you can access it from there.)
将HFile装载入HBase表。
大致为以上步骤。建议看下官方文档,查阅每步的具体藐视。
但是经过性能测试后,实际的导入性能,只做到了每分钟100万的导入量。后来我尝试将原来的HIVE表做成parquet+snappy压缩,使spark的task数从513降低到了70,但是性能还是每分钟100万。说明这个性能是卡在HBASE。
—————————————————————————-
后来发现在导入的时候实际上,最好要提前在HBASE做预分区。虽然HIVE的官方指南中说明了它确实做了预分区,但是我发现CDH5.13应该是没有做。下图是在执行插入时,通过检测hbase的表的分区信息截图:
scan ‘hbase:meta’,{FILTER=>”PrefixFilter(‘testzx.h_cust_cont_zx’)”}
为什么要做预分区呢?我记得官方解释说是,做了预分区后,导入一开始的时候压力负载就会被打散。不会造成压力会集中。
除了预分区,另外一种有可能的时候数据倾斜。数据倾斜也会导致部分region server压力过大。
了解以上后,改造代码。我将rowkey做了md5,然后按照md5进行了预分区。参考资料:https://stackoverflow.com/questions/28165833/how-can-i-pre-split-in-hbase
1、在HBase中建立预分区表
MD5开头只有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,我有6个region server,分区信息如下:
create ‘h_cust_cont_zx’, ‘cf’,SPLITS => [‘3′,’6′,’9′,’c’,’e’]
2、然后再在HIVE中用外表映射到已建立好的HBase表中:
–这两个指令不知道有没有用
SET hive.hbase.bulk=true;
set hive.hbase.wal.enabled=false;
CREATE EXTERNAL TABLE h_cust_cont_zx(rk string,
ecif_id string,
customer_id string)
STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key,cf:ecif_id
,cf:customer_id”)
TBLPROPERTIES(“hbase.table.name” = “h_cust_cont_zx”,”hbase.mapred.output.outputtable” = “h_cust_cont_zx”);
INSERT OVERWRITE TABLE h_cust_cont_zx
select md5(concat(ecif_id,customer_id)),* from t_r_cust_cont0720_snappy;
最后的导入性能是1.5小时3亿,每分钟333万。
—————————————————————————-
接着我追加了一个region server,将分区提升到了7个后。再进行导入,执行速度为每分钟接近700万。
使用了预分区,只是是负载在一开始的时候,使分区较为均衡。但是最终还是会进行自动分区。
上面图可以看见,虽然预分区7个。但是最终还是重分区了。