Ⅰ 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中。