在上一篇已經介紹過了hbase安裝及結構,下面我在說一下hbase的基本使用及優化方面的問題。
一、基本使用(操作)
1.首先hbase中有一個namespace(命名空間)的概念,namespace命名空間指的是對一組表的邏輯分組,類似於rdbms中的database,方便對錶在業務上劃分。Apache HBase從0.98.0,0.95.2兩個版本開始支持namespace級別的授權操作,HBase全局管理員可以創建、修改和回收namespace的授權。
namespace介紹引用自:https://blog.csdn.net/maligebazi/article/details/79952459
在HBase系統中,默認定義了兩個缺省的namespace
(1)hbase:系統內建表,包括namespace和meta表
(2)default:用戶建表時未指定namespace的表都創建在此
關於namespace的一些基本用法:
①創建namespace
create_namespace 'mynamespace'
②刪除namespace
drop_namespace 'mynamespace'
③查看namespace
describe_namespace 'mynamespace'
④列出所有的namespace
list_namespace
⑤在namespace下創建表
create 'mynamespace:mytable', 'info'
⑥查看namespace下的表
list_namespace_tables 'mynamespace'
2.hbase使用
①list:
list命令可以查看當前命名空間下所有的表,也可以查看特定命名空間下的表。
list 'ns:abc.*' --->查看命名空間ns下面的所有的以表名以abc開頭的表的列表
list ---> 查看hhase中所有的表
②創建表
create 't1', 'cf1' --->在默認的命名空間下創建一張表名爲t1,只有一個列族,列族名爲cf1
③查看一張表的所有內容
scan 't1' -->查看錶中的所有數據
scan 'ns1:t1' --> 查看錶中某個列族的所有數據
④ 往表中增加一條記錄
put 't1'(表名), '1'(rowkey), 'cf1:name'(列族:字段名), 'zhangsan'(value)
⑤查看行鍵
get 't1', '1', 'cf1:name'
⑥ 查看錶的屬性信息
describe/desc 't1'
⑦根據行鍵刪除某條記錄
delete 't1', '1', 'cf1:age' -->刪除某一個rowkey對應的cf1:age對應的單元格
deleteall 't1', '2' -->刪除rowkey=2對應的所有的單元格
⑧刪除一張表
注意:刪除表之前,需要先確認表狀態是否爲disable,如果不是,需要disable '表名'
disable 't1'
drop 't1'
二、行鍵和列族的設計
1.行鍵
在hbase中可能會出現行鍵的熱點問題,那什麼是熱點問題呢?
熱點問題指的是:由於行鍵相似,連續且數據量過大,造成了單個region的數據量過大,從而影響了對這個region 的讀寫效率。所以在我們設計行鍵的時候,如果數據量特別大,應該儘量的去隨機,一定不要出現連續的
2.列族
(1)在我們設計hbase中表的時候,建議將我們的表做成高表,及減少列族數量,增加列族中的列。因爲如果一個表擁有很多列族的話,那就代表操作表時,跨越的文件(HFile)就會很多,對我們的操作效率會有很大的影響。(當然如果數據量不大的話,那就隨意嘍)
(2)在設計表的時候,各個列/列族的名稱不宜過長,因爲hbase需要對這些數據在內存中做緩存,做索引,如果名稱太長的話,可能會影響我們內存的容量。如下:
f1----->"cccccccccccccffffffff"
cf2----->"cf"
三、使用hive操作HBase
1.啓動hive,進入hive的終端
hive --auxpath /opt/hive/lib/hive-hbase-handler-2.1.0.jar,/opt/hive/lib/zookeeper-3.4.6.jar
--hiveconf hbase.master=master:16010
--hiveconf hbase.zookeeper.quorum=master,slave01,slave02
2.在hive中創建hbase的表
①如果hbase重不存在該表,那麼我們只能在hive中使用創建內部表的方式,來創建一張表,同時也會在hbase中創建相關的表。例如:
create table hbase_of_hive(
id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "hbase_of_hive"
);
sql解釋:在hive中創建了一張hbase_of_hive表,有三列內容id,name,age,同時映射到hbase中的表hbase_of_hive,其中id對應行鍵,並有一個列族cf,該列族下有兩個字段name、age
②如果hbase中已經存在該表
如果使用上述建表語句創建的時候,則會報錯,因爲在hbase中已經存在了一張表爲hbase_of_hive,所以這時只能創建外部表,去映射hbase中的一張表。例如:
create external table hbase_of_hive
(id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "t"
);
以上已經將hbase中基本的操作已經介紹完了,其實hbase中是可以創建二級索引的,其實說白了就是爲除主鍵以外的字段添加索引。這個在我以後的文章中會做介紹,此處就不進行說明了~