HBase学习笔记 (三)

三、HBase高级使用





1HBase Shell创建表(多个列簇和设置属性)



创建命名空间:


例如:

Createa table with namespace=ns1 and table qualifier=t1

  hbase> create 'ns1:t1', {NAME => 'f1',VERSIONS => 5}

 

Createa table with namespace=default and table qualifier=t1

  hbase> create 't1', {NAME => 'f1'},{NAME => 'f2'}, {NAME => 'f3'}

  hbase> # The above in shorthand would bethe following:

  hbase> create 't1', 'f1', 'f2', 'f3'

  hbase> create 't1', {NAME => 'f1',VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}

  hbase> create 't1', {NAME => 'f1',CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}

  hbase> create 't1', {NAME => 'f1',IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY=> 'weekly'}


要设置属性可参考如下格式:



 


2HBase表创建时的预分区及创建方式一






案例:

假设rowkey为年月日时分秒毫秒。


方式一:


hbase(main):015:0> create 'bflogs','info',SPLITS =>['20180201000000000','20180211000000000','20180221000000000']


 

方式二(最常用):



hbase(main):016:0> create'bflogs2','info',SPLITS_FILE => '/opt/datas/bflogs-split.txt'


 

方式三:

使用自定义的类进行分割,这里我们用官方提供的


create 't11', 'f11', {NUMREGIONS =>5, SPLITALGO => 'HexStringSplit'} 采用十六进制


 

create 't22', 'f22', {NUMREGIONS =>5, SPLITALGO => ' UniformSplit'}



当创建表无反应时:

可能是分的Region太多了,修改Region数量。

查看日志,因为创建表归master管,所以查看hbase-root-master-hadoop-senior.log。

 

.tmp目录的作用:


 


3.依据【话单】查询需求分析HBase的表设计


每天的通话记录上亿条,保存在hbase中。






4.  设计【话单】数据存储表的rowkey设计


rowkey:本人电话+日期。日期在rowkey上,需要的话,可分割rowkey取出时间。图中假设查询2015410日到412日的通话记录。

 

 

5.  设计【话单】数据存储索引表的设计及数据同步解决方案



hbase不像关系型数据库自动建立索引,所以需要自己建立索引表。

 

关系型数据库主表和索引表数据自动同步。

 


6.  HBase 表属性压缩配置讲解



VERSIONS:表示列的版本数,超过版本数的老版本在合并时将被忽略,即被删除。

MIN_VERSIONS0:表示可以一个列也没有。

案例:

VERSIONS可用作是否检测套牌,即在很短的时间内,有多个相同的车牌的信息。


执行了以上操作,在进入hbase shell时不能加载native的警告就会消失。



只在创建表的时候设置压缩格式还不行,必须在hbase-site中设置hbase.regionserver.codecs(这个一开始就要设置)告诉RegionServer压缩格式。



 


7.  HBase  BlockCache配置



除了meta表,一般的表IN_MEMORY通常为false

作用域可在代码中覆盖掉:


RegionServer内存的使用:




MemstoreBlockCache




meta元数据保存到IN_MEMORY可加快查询速度。

 

查看meta表:

 


8.  HBase 表的Compaction深入剖析讲解






hbase表中会被删除的三类数据:

① 被打上删除标记的数据

② 超过版本号限制的数据

③ 生存周期结束的数据



9.  HBase 集群及表的管理讲解



 

使用Web UI管理表:


为什么store的数量大于storeFile

因为我们创建了很多空表,并且有的表的数据还在memStore中没有写到storeFile中。


设置日志的级别:

ps -ef |grep java






使用hbase shell管理表:





查看regionscan 'hbase:meta' 或者查看web ui。

 

使用hbase shell管理hbase数据:


为什么在删除表的时候要禁用(disable)表?

因为表被regionregionserver管理,要告诉它们。


使用hbase shell管理集群:

可见使用hbase shell管理hbase表。

 

hbase shell使用JAVA方法:

例如: 



Row counter



管理预写日志WAL





 

管理hfile




检查整个集群的状态:

bin/hbase hbck



hbase表的修复:




(最常用的是-fix-fixMeta)


10.  HBase Hive集成使用讲解

 

本质:

HiveHBase的客户端,需要HBase的一些配置和jar包。


handler:数据的处理。


查看文档:

https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration



①  复制hbasejar包到hivelib

需要的jar包:

hive-hbase-handler-1.1.0-cdh5.13.0.jar(hive lib已存在)

hbase-client-1.2.0-cdh5.13.0.jar

hbase-server-1.2.0-cdh5.13.0.jar

hbase-protocol-1.2.0-cdh5.13.0.jar

hbase-common-1.2.0-cdh5.13.0.jar

hbase-it-1.2.0-cdh5.13.0.jar

htrace-core-3.2.0-incubating.jar

zookeeper-3.4.5-cdh5.13.0.jarhive lib已存在)

(建立软链接时查看jar包是否已存在ls lib |grep xxx,而且建立软连接一定要是全路径。否则在查看时,链接就会变成红色,代表链接错误如下图:


ln -s /opt/cdh5.13.0/hbase-1.2.0-cdh5.13.0/lib/hbase-client-1.2.0-cdh5.13.0.jar /opt/cdh5.13.0/hive-1.1.0-cdh5.13.0/lib/hbase-client-1.2.0-cdh5.13.0.jar

 

ln -s /opt/cdh5.13.0/hbase-1.2.0-cdh5.13.0/lib/hbase-server-1.2.0-cdh5.13.0.jar /opt/cdh5.13.0/hive-1.1.0-cdh5.13.0/lib/hbase-server-1.2.0-cdh5.13.0.jar

 

ln -s /opt/cdh5.13.0/hbase-1.2.0-cdh5.13.0/lib/hbase-it-1.2.0-cdh5.13.0.jar /opt/cdh5.13.0/hive-1.1.0-cdh5.13.0/lib/hbase-it-1.2.0-cdh5.13.0.jar

 

②  hive-site.xml中添加hbase client zookeeper




  <property>

         <name>hbase.zookeeper.quorum</name>

         <value>hadoop-senior</value>

  </property>

(这里是伪分布式)


hive Cli查看:


③  如果开启了远程metastore,要开启metastore服务

hive --service metastore

否则会报以下异常:

执行sql报错:



 创建一个hive表,指定数据存储在hbase



CREATE TABLE hbase_table_1(key int, value string)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")

TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");

":key,cf1:val"":key, 列簇:列名"。


通过shell查看表是否存在:

hive shell:



 

hbase shell:


通过hdfs查看文件是否存在:




可能出现的异常:



将以下两个jarcphive lib

netty-all-4.1.6.Final.jar

metrics-core-2.2.0.jar


 插入数据



报了该错误说明少了jar包。

解决:hbase lib目录下的hbase-hadoop-compat-1.2.0-cdh5.13.0.jar放到hivelib下(最好建立软链接ln -s





⑥  查看

查看hive表数据:



查看hbase表数据:


hdfs


(没有文件是因为数据都存在hbase表了)


(没有文件是因为数据还在memStore中)


flush数据到storefile


⑦  删除表



删除hive表时,hbase表也被删除了。因为该表是管理表。也就是说要看hive管理表和外部表的本质。


创建hive外部表,数据在HBase表中:




(命令下方又输出了一遍sql是因为我们在开启hive服务的时候加了-v参数)

CREATE EXTERNAL TABLE hbase_basic(id int, name string, age int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age")
TBLPROPERTIES ("hbase.table.name" = "basic");

 

删除hive外部表,外部表的数据不会被删除:



 

HiveHBase集成的应用场景:



(一号店就是这么做的)



11.  使用Sqoop导入数据到HBase表中



sqoop只有map任务没有reduce任务。




mysql数据迁移到hbase


sqoop import \

--connect jdbc:mysql://hadoop-senior:3306/test \

--username "root" \

--password "123456" \

--table "my_user" \

--columns "id,acount,password" \

--column-family "info" \

--hbase-table "hivetohbase" \

--hbase-create-table // hbase表不存在时,创建表

--hbase-row-key "id" -m 1


 


12.  HBase 如何与Hue集成使用


 

什么是Thrift

Thriftapache的一个顶级项目。比如我用java编写的hbase框架,我现在只会python,可以通过Thrift去读写hbase的数据。Thrift起到桥梁的作用。huehbase来说是个客户端,但是hue走的不是API而是Thrift Server去读取表中的数据。查看hue源码可知,hue后台使用的是python。很多公司都用pythonhbase进行交互。

 

①  启动Thrift服务


不启动Thrift会报如下异常:



②  修改hue.ini


 

③  启动hue,并查看HBase

build/env/bin/supervisor



13.  企业实战之HBase 集群安装部署




修改hbase配置文件,并把hadoop的配置文件软链接到hbase下:



 

 

14.  企业实战之【电商订单】存储分析



 

订单显示页:


订单和子订单:用户买的多个商品属于一个订单,这些商品有的是京东自营的有的是京东合作的商家的,这些作为子订单。


订单详情页:


 

RDBMSHBase结合使用:


当订单完成时,就把数据从rdbms迁移到hbase

其他还用到一些内存的数据库比如:RedisMongoDB等,便于多次查询,例如双十一发货慢,用户经常查询自己的订单。


Cache一般缓存:比较畅销、发货速度较慢的用户经常查的。





订单编码为了方便查询。




订单显示页的rowkey为什么要加上orderId字段?

方便二次查询。

 

创建索引表:


该图中根据查询设计的表都是索引表。例如根据商品编号查询的rowkey设计:商品编号+用户id+订单号/订单创建时间。这样才能保证唯一,因为一个用户可能多次购买同一个商品。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值