创建命名空间:
例如:
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'}
要设置属性可参考如下格式:
案例:
假设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目录的作用:
每天的通话记录上亿条,保存在hbase中。
rowkey:本人电话+日期。日期在rowkey上,需要的话,可分割rowkey取出时间。图中假设查询2015年4月10日到4月12日的通话记录。
hbase不像关系型数据库自动建立索引,所以需要自己建立索引表。
关系型数据库主表和索引表数据自动同步。
VERSIONS:表示列的版本数,超过版本数的老版本在合并时将被忽略,即被删除。
MIN_VERSIONS为0:表示可以一个列也没有。
案例:
VERSIONS可用作是否检测套牌,即在很短的时间内,有多个相同的车牌的信息。
执行了以上操作,在进入hbase shell时不能加载native的警告就会消失。
只在创建表的时候设置压缩格式还不行,必须在hbase-site中设置hbase.regionserver.codecs(这个一开始就要设置)告诉RegionServer压缩格式。
除了meta表,一般的表IN_MEMORY通常为false
作用域可在代码中覆盖掉:
RegionServer内存的使用:
Memstore和BlockCache:
将meta元数据保存到IN_MEMORY可加快查询速度。
查看meta表:
hbase表中会被删除的三类数据:
① 被打上删除标记的数据
② 超过版本号限制的数据
③ 生存周期结束的数据
使用Web UI管理表:
为什么store的数量大于storeFile?
因为我们创建了很多空表,并且有的表的数据还在memStore中没有写到storeFile中。
设置日志的级别:
ps -ef |grep java
使用hbase shell管理表:
查看region可scan 'hbase:meta' 或者查看web ui。
使用hbase shell管理hbase数据:
为什么在删除表的时候要禁用(disable)表?
因为表被region和regionserver管理,要告诉它们。
使用hbase shell管理集群:
可见使用hbase shell管理hbase表。
在hbase shell使用JAVA方法:
例如:
Row counter:
管理预写日志WAL:
管理hfile:
检查整个集群的状态:
bin/hbase hbck
hbase表的修复:
(最常用的是-fix和-fixMeta)
本质:
Hive是HBase的客户端,需要HBase的一些配置和jar包。
handler:数据的处理。
查看文档:
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration
① 复制hbase的jar包到hive的lib
需要的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.jar(hive 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
|
(这里是伪分布式)
在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查看文件是否存在:
可能出现的异常:
将以下两个jar包cp到hive 的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放到hive的lib下(最好建立软链接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外部表,外部表的数据不会被删除:
Hive和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 |
什么是Thrift?
Thrift是apache的一个顶级项目。比如我用java编写的hbase框架,我现在只会python,可以通过Thrift去读写hbase的数据。Thrift起到桥梁的作用。hue对hbase来说是个客户端,但是hue走的不是API而是Thrift Server去读取表中的数据。查看hue源码可知,hue后台使用的是python。很多公司都用python和hbase进行交互。
① 启动Thrift服务
不启动Thrift会报如下异常:
② 修改hue.ini
③ 启动hue,并查看HBase
build/env/bin/supervisor
修改hbase配置文件,并把hadoop的配置文件软链接到hbase下:
订单显示页:
订单和子订单:用户买的多个商品属于一个订单,这些商品有的是京东自营的有的是京东合作的商家的,这些作为子订单。
订单详情页:
RDBMS和HBase结合使用:
当订单完成时,就把数据从rdbms迁移到hbase。
其他还用到一些内存的数据库比如:Redis、MongoDB等,便于多次查询,例如双十一发货慢,用户经常查询自己的订单。
Cache一般缓存:比较畅销、发货速度较慢的用户经常查的。
订单编码为了方便查询。
订单显示页的rowkey为什么要加上orderId字段?
方便二次查询。
创建索引表:
该图中根据查询设计的表都是索引表。例如根据商品编号查询的rowkey设计:商品编号+用户id+订单号/订单创建时间。这样才能保证唯一,因为一个用户可能多次购买同一个商品。