Ⅰ hbase基础语法
名称
命令表达式
创建表
create '表名', '列族名1','列族名2','列族名N'
查看所有表
list
描述表
describe ‘表名’
判断表存在
exists '表名'
判断是否禁用启用表
is_enabled '表名'
is_disabled ‘表名’
添加记录
put ‘表名’, ‘rowKey’, ‘列族 : 列‘ , '值'
查看记录rowkey下的所有数据
get '表名' , 'rowKey'
查看表中的记录总数
count '表名'
获取某个列族
get '表名','rowkey','列族'
获取某个列族的某个列
get '表名','rowkey','列族:列’
删除记录
delete ‘表名’ ,‘行名’ , ‘列族:列'
删除整行
deleteall '表名','rowkey'
删除一张表
先要屏蔽该表,才能对该表进行删除
第一步 disable ‘表名’ ,第二步 drop '表名'
清空表
truncate '表名'
查看所有记录
scan "表名"
查看某个表某个列中所有数据
scan "表名" , {COLUMNS=>'列族名:列名'}
更新记录
就是重写一遍,进行覆盖,hbase没有修改,都是追加
Ⅱ Phoenix实战
Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。
1) 容易集成:如Spark,Hive,Pig,Flume和Map Rece。
2) 性能好:直接使用HBase API以及协处理器和自定义过滤器,可以为小型查询提供毫秒级的 性能 ,或者为数千万行提供数秒的性能。
3) 操作简单:DML命令以及通过DDL命令创建表和版本化增量更改。
4) 安全功能: 支持GRANT和REVOKE 。
5) 完美支持Hbase二级索引创建。
解压到/opt/mole 改名为phoenix
[root@hadoop101 mole]$ tar -zxvf /opt/software/apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz -C /opt/mole [root@hadoop101 mole]$ mv apache-phoenix-4.14.1-HBase-1.3-bin phoenix
在phoenix目录下
[root@hadoop101 mole]$ cd /opt/mole/phoenix/
向每个节点发送server jar
[root@hadoop101 phoenix]$ cp phoenix-4.14.1-HBase-1.3-server.jar /opt/mole/hbase-1.3.1/lib/ [root@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-server.jar hadoop102:/opt/mole/hbase-1.3.1/lib/ [root@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-server.jar hadoop103:/opt/mole/hbase-1.3.1/lib/
向每个节点发送client jar
[root@hadoop101 phoenix]$ cp phoenix-4.14.1-HBase-1.3-client.jar /opt/mole/hbase-1.3.1/lib/ [root@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-client.jar hadoop102:/opt/mole/hbase-1.3.1/lib/ [root@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-client.jar hadoop103:/opt/mole/hbase-1.3.1/lib/
#phoenix export PHOENIX_HOME=/opt/mole/phoenix export PHOENIX_CLASSPATH=$PHOENIX_HOME export PATH=$PATH:$PHOENIX_HOME/bin
[root@hadoop101 phoenix]$ /opt/mole/phoenix/bin/sqlline.py hadoop101,hadoop102,hadoop103:2181
!table 或 !tables
CREATE TABLE IF NOT EXISTS us_population ( State CHAR(2) NOT NULL, City VARCHAR NOT NULL, Population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city));
如下显示:
在phoenix中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。
upsert into us_population values('NY','NewYork',8143197);
select * from us_population ; select * from us_population wherestate='NY';
delete from us_population wherestate='NY';
drop table us_population;
!quit
默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的。如图1和图2,US_POPULATION是在phoenix中直接创建的,而kylin相关表是在hbase中直接创建的,在phoenix中是查看不到kylin等表的。
图1 phoenix命令行中查看所有表:
图2 hbase命令行中查看所有表:
如果要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种: 视图映射和表映射
Hbase 中test的表结构如下,两个列簇name、company.
Rowkeynamecompany
启动Hbase shell
[root@hadoop101 ~]$ /opt/mole/hbase-1.3.1/bin/hbase shell
创建Hbase表test
hbase(main):001:0> create 'test','name','company'
创建表,如下图:
Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。
在phoenix中创建视图test表
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create view "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
删除视图
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> drop view "test";
使用Apache Phoenix创建对HBase的表映射,有两种方法:
1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create table "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
2) 当HBase中不存在表时,可以直接使用create table指令创建需要的表,系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create table "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
在Phoenix中查看数据
select * from STOCK_SYMBOL
如下显示:
在Hbase中查看数据
scan "STOCK_SYMBOL"
更多使用详情,请参考 http://phoenix.apache.org/phoenix_spark.html
相比于直接创建映射表,视图的查询效率会低,原因是:创建映射表的时候,Phoenix会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。
使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。
Ⅲ HBase存储架构
上图是HBase的存储架构图。
由上图可以知道,客户端是通过Zookeeper找到HMaster,然后再与具体的Hregionserver进行沟通读写数据的。
具体到物理实现,细节包括以下这些:
首先要清楚HBase在hdfs中的存储路径,以及各个目录的作用。在hbase-site.xml 文件中,配置项 <name> hbase.rootdir</name> 默认 “/hbase”,就是hbase在hdfs中的存储根路径。以下是hbase0.96版本的个路径作用。1.0以后的版本请参考这里: https://blog.bcmeng.com/post/hbase-hdfs.html
1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之后,会将 HFile 移到.archive 目录中,然后将之前的 hfile 删除掉,该目录由 HMaster 上的一个定时任务定期去清理。
2、 /hbase/.corrupt
存储HBase损坏的日志文件,一般都是为空的。
3、 /hbase/.hbck
HBase 运维过程中偶尔会遇到元数据不一致的情况,这时候会用到提供的 hbck 工具去修复,修复过程中会使用该目录作为临时过度缓冲。
4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 会在第一次启动之初会给每一台 RegionServer 在.log 下创建一个目录,若客户端如果开启WAL 模式,会先将数据写入一份到.log 下,当 RegionServer crash 或者目录达到一定大小,会开启 replay 模式,类似 MySQL 的 binlog。
5、 /hbase/oldlogs
当.logs 文件夹中的 HLog 没用之后会 move 到.oldlogs 中,HMaster 会定期去清理。
6、 /hbase/.snapshot
hbase若开启了 snapshot 功能之后,对某一个用户表建立一个 snapshot 之后,snapshot 都存储在该目录下,如对表test 做了一个 名为sp_test 的snapshot,就会在/hbase/.snapshot/目录下创建一个sp_test 文件夹,snapshot 之后的所有写入都是记录在这个 snapshot 之上。
7、 /hbase/.tmp
当对表做创建或者删除操作的时候,会将表move 到该 tmp 目录下,然后再去做处理操作。
8、 /hbase/hbase.id
它是一个文件,存储集群唯一的 cluster id 号,是一个 uuid。
9、 /hbase/hbase.version
同样也是一个文件,存储集群的版本号,貌似是加密的,看不到,只能通过web-ui 才能正确显示出来
10、 -ROOT-
该表是一张的HBase表,只是它存储的是.META.表的信息。通过HFile文件的解析脚本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存储的内容,如下所示:
以上可以看出,-ROOT-表记录的.META.表的所在机器是dchbase2,与web界面看到的一致:
11、 .META.
通过以上表能找到.META.表的信息,该表也是一张hbase表,通过以上命令,解析其中一个region:
以上可以看出,adt_app_channel表的数据记录在dchbase3这台reginserver上,也与界面一致,如果有多个region,则会在表名后面加上rowkey的范围:
通过以上描述,只要找到-ROOT-表的信息,就能根据rowkey找到对应的数据,那-ROOT-在哪里找呢?从本文一开始的图中可以知道,就是在zookeeper中找的。进入zookeeper命令行界面:
可以看出-ROOT-表存储在 dchbase3 机器中,对应界面如下:
以上就是HBase客户端根据指定的rowkey从zookeeper开始找到对应的数据的过程。
那在Region下HBase是如何存储数据的呢?
以下就具体操作一张表,查询对应的HFile文件,看HBase的数据存储过程。
在HBase创建一张表 test7,并插入一些数据,如下命令:
查看wal日志,通过 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,内容如下:
查看HFile文件,内容如下:
由此可见,HFile文件就是存储HBase的KV对,其中Key的各个字段包含了的信息如下:
由于hbase把cf和column都存储在HFile中,所以在设计的时候,这两个字段应该尽量短,以减少存储空间。
但删除一条记录的时候,HBase会怎么操作呢?执行以下命令:
删除了rowkey为200的记录,查看hdfs,原来的HFile并没有改变,而是生成了一个新的HFile,内容如下:
所以在HBase中,删除一条记录并不是修改HFile里面的内容,而是写新的文件,待HBase做合并的时候,把这些文件合并成一个HFile,用时间比较新的文件覆盖旧的文件。HBase这样做的根本原因是,HDFS不支持修改文件。
Ⅳ Hbase表映射到phoenix
在phoenix中操作hbase已有数据表就需要手动进行配置
直接在安装了hbase服务的环境中,输入hbase shell执行命令,进入hbase下进行操作: hbase shell
进入hbase: hbase shell
创建hbase表: create 'phoenix','info'
插入数据: put 'phoenix','row001','info:name','phoenix'
进入phoenix的cli命令:到phoenix的bin目录执行: ./sqlline.py
创建phoenix表: create view "phoenix"(rowkey varchar primary key,"info"."name" varchar);
验证:在phoenix的cli命令下查看数据: select * from "phoenix" limit 10;
注意事项:
1.phoenix验证的时候,查询表名需要用双引号括起来,强制不转换成大写
2.创建phoenix时,表名和列族以及列名需要用双引号括起来,不然会自动将小写转换成大写。
Ⅳ 创建Hbase表&Hbse表映射到hive表
create 'testTable',{NAME=>'data', VERSIONS =>1},{NAME=>'jsonStr', VERSIONS=>1}
创建一张hive表,实现将hbase表中的数据映射到该hive表中,而且当hbase表中的数据有更新时,该hive表中的数据也能够动态更新
--key是hbase的rowkey, 各个字段是hbase中的quailiter
CREATE external table hbase_table(row_key STRING, name STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, jsonStr:jsonStr")
TBLPROPERTIES ("hbase.table.name" = "nameTable");
Ⅵ HBase调优:预分区与行键设计
基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。像这样预先创建hbase表分区的方式,称之为预分区。
hash(主键) + 年月日时(2019062315)
这里只取hash(主键)的前6位,使得行键的长度正好是16,也就是8的整数倍,在64位计算机中,效果最好。
列族固定,只有一个,设为f,标签为分钟加上秒数:
分秒(5623)
如果需要精确到毫秒,可以为列族f设置有多个版本或者将标签设计为分秒毫秒(5623142)或者分秒.版本号(5623.1)
一个regionserver可以管理的region数量和列族数量与每个列族缓存的大小有关,计算公式如下:
我这里只分了三个region,用hbase shell命令创建表,设置预分区数量为3
下图中,可以看到,预分区以后,数据的读写访问请求数量均匀分布在3台RegionServer上,避免了热点问题。
Ⅶ Ubuntu HBASE 创建文件出错
base 的新手,并尝试使用以下命令在hortonworks沙箱hbase shell中创建一个表: create 'testtable', 'colfam1' 这样做时,我不断收到此错误: hbase(main):0..
Ⅷ hbase输入出现了星号
两个单引号 当命令行出现星号的时候使用
hbase shell
进入hbase
ctrl+backspace
退格
ddl
dml
list
help
查看所有命令
create ‘probe_log’,‘info’
创建表,表名+列族名,该名称任意
describe ‘probe_log’
查看表信息 表名
create_namespace ‘probe_log’
新建命名空间create
create ‘probe_log:user_event_v2’,‘info’
在命名空间下新建表
Ⅸ HBase创建,删除,清空数据表
HBase shell窗口进入,执行命令hbase shell
语法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
例如:创建表t1,有两个family name:f1,f2,且版本数前者为3,后者为1
disable表
drop表
Ⅹ 怎么创建关于hbase的hive表
1. 启动hive,并连接到hbase
./hive --auxpath /opt/apache/hive-0.12.0-bin/lib/hive_hbase-handler-
2. 创建内表
CREATE TABLE hive_123(word string, count bigint)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "hive_123");
执行这条命令后,hive将会在hbase上创建表"hive_123",hive列与hbase列的映射关系为:
word字段为hbase表的rowkey,count字段则为cf1:val即column family为cf1,qualifier为val
3. 创建外表
CREATE EXTERNAL TABLE hive_vv(key string, sip string, count int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf0:sip,cf1:count")
TBLPROPERTIES ("hbase.table.name" = "hive_vv");
创建一个hive外表,将名为hive_w的hbase表识别到hive中。