HBase的前提條件:
JDK
SSH
Hadoop
JDK:Hadoop和JDK運行的環境,他們的守護進程運行在JVM下。HBase支持JDK 1.6以上的版本。比如: jdk-8u161-linux-x64.rpm。
SSH:實現簡單的服務器與主機的通信。在集群中,只有啟動sshd后,才可以通過腳本遠程操作其他的Hadoop和HBase進程。為了實現自動化操作,需要配置SSH免密碼的的登錄方式。
Hadoop:HDFS是HBase的底層存儲文件系統。
1、HBase的安裝與配置
進入HBase官網,下載HBase對應版本:
src和bin版本的區別:
src版本包含源碼,主要給高級開發人員准備,可以去修改其中的源碼改變或擴展功能。
bin版本主要是一般開發人員或使用者准備,只需要使用其固化功能即可。
HBase 的運行模式包括單機、偽分布式和分布式三種。
1.1 單機模式
單機模式搭建:使用本地文件系統,所有進程運行在一個 JVM 上,單機模式一 般只用於測試,HBase 需要結合 Hadoop 才能展現出其分布式存儲的能力。
//單機模式搭建步驟: //1.解壓 [root@localhost hbase]# tar zxvf hbase-2.2.3-bin.tar.gz //2.修改hbase/conf/hbase-env.sh,添加java環境變量 [root@localhost conf]# vi hbase-env.sh export JAVA_HOME=/usr/local/java/jdk1.8.0_241/ export HBASE_MANAGES_ZK=true //(使用hbase內置的zookeeper) //3.編輯hbase-site.xml,若是不配置默認是temp 每次啟動會被清空 <configuration> <property> <name>hbase.rootdir</name> <value>file:///home/local/hbase-2.2.3-bin/rootDir</value> <description> hbase.rootdir是RegionServer的共享目錄,用於持久化存儲HBase數據,默認寫入/tmp中。如果不修改此配置,在HBase重啟時,數據會丟失。此處一般設置的是hdfs的文件目錄, 如NameNode運行在namenode.Example.org主機的9090端口,則需要設置為hdfs://namenode.example.org:9090/hbase </description> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/local/hbase-2.2.3-bin/zookeeperDir</value> <description>此項用於設置存儲ZooKeeper的元數據,如果不設置默認存在/tmp下,重啟時數據會丟失。</description> </property> <property> <name>hbase.master.info.port</name> <value>60010</value> </property> </configuration> //4.添加hbase環境變量 [root@localhost bin]# vi /etc/profile //5.啟動hbase [root@localhost bin]# ./hbase shell //6.jps查看,出現HMaster就是啟動成功了
1.2 偽分布模式
修改配置文件,修改安裝目錄下的conf文件夾中的配置文件,主要包括2個文件:hbase-env.sh和hbase-site.xml.
- hbase-env.sh:配置hbase運行時變量,如java路徑、regionserver相關參數等.
- hase-site.xml:hbase相關配置,如分布式模式、zookeeper的配置等.
偽分布式模式下,所有進程運行在一個 JVM 上,可以進行小集群的配置,用於測試。在生產環境下,需要在不同機器上的 JVM 中運行守護進程。
//1、下載安裝hbase,官網:https://hbase.apache.org/downloads.html
tar xzvf hbase-2.2.4-bin.tar.gz /usr/local cd /usr/local mv hbase-2.2.4-bin.tar.gz hbase ls
//2、修改配置文件,修改安裝目錄下的conf文件夾中的配置文件:hbase-env.sh和hbase-site.xml,同時分發到集群中的各個regionserver節點. //比如:hbase-env.sh文件修改
export JAVA_HOME=/usr/java/j dkl.8.0_161 export HBASE_MANAGES_ZK=true
ps: ZooKeeper 也可以作為獨立的集群來運行,即完全與 HBase 脫離關系,這時需要設置 HBASE_MANAGES_ZK 變量為 false。
1.3分布式模式
分布式模式是一種主從模式,基本由一個Master 節點和多個 Slave 節點組成,均使用 HDFS作為底層文件系統。
//1、分布式集群實例進行hbase-site.xml文件配置,hbase-site.xml配置文件如下:
<configuration>
<property>
<name> hbase.rootdir </name>
<value>hdfs://example0:9000/hbase</value>
<description> hbase.rootdir是RegionServer的共享目錄,用於持久化存儲HBase數據,默認寫入/tmp中。如果不修改此配置,在HBase重啟時,數據會丟失。此處一般設置的是hdfs的文件目錄,如NameNode運行在namenode.Example.org主機的9090端口,則需要設置為hdfs://namenode.example.org:9090/hbase
</description>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
<description>此項用於配置HBase的部署模式,false表示單機或者偽分布式模式,true表不完全分布式模式。 </description>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>examplel,example2,example3</value>
<description>此項用於配置ZooKeeper集群所在的主機地址。examplel、 example2、example3是運行數據節點的主機地址,zookeeper服務的默認端口為2181。 </description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
<description>此項用於設置存儲ZooKeeper的元數據,如果不設置默認存在/tmp下,重啟時數據會丟失。</description>
</property>
</configuration>
//2、修改 conf/regionservers 文件,羅列了所有region服務器的主機名.同時在配置完成后,需要同步這些文件到集群上的其他節點 .
2、hbase的啟動和關閉
ps:在master服務器上已經配置了對集群中所有slave機器的無密碼登錄,使用start-hbase.sh腳本即可啟動整個集群.
前提條件:
hdfs處於運行狀態,jps命令查看namenode和datanode的服務是否正常啟動
hbase啟動命令:
//hbase的bin目錄下,啟動偽分布式集群或分布式集群的執行命令
bin/start-hbase.sh jps //查看進程,如果是完全分布式模式,則在master節點運行有hmaster和hquorumpeer進程;在slave節點上有hregionserver和hquorumpeer進程.
hbase關閉命令:
//hbase的bin目錄下,關閉hbase集群,執行命令
bin/stop-hbase.sh
3、Hbase shell及其常用命令
hbase shell是一個命令行工具。在linux上,輸入命令: . /hbase shell
3.1 hbase shell
version:顯示當前hbase的版本號
status:顯示各主節點的狀態,之后可以加入參數
whoami:顯示當前用戶名
退出shell模式:exit或quit.
[test@cs010 bin]$ ./hbase shell //version顯示當前hbase版本號 hbase(main):001:0> version 1.4.12, r6ae4a77408ad35d6a7a4e5cebfd401fc4b72b5ec, Sun Nov 24 13:25:41 CST 2019 //status顯示各主節點的狀態 hbase(main):002:0> status 1 active master, 0 backup masters, 1 servers, 1 dead, 7.0000 average load //whoami顯示當前用戶名 hbase(main):003:0> whoami test(auth:SIMPLE) groups: test
3.2 表和列族操作
Hbase的表結構(schema)只有表名和列族兩項內容.但列族的屬性很多,在修改和建立表結構時,可以對列族的數量和屬性進行設定.
HBase Shell操作表命令:
3.2.1 創建表
//創建表,必須指明兩個參數:表名和列族的名字 1. create 'table1','basic' //建立表名為table1,含有一個列族basic 2. create 'table1','basic','advanced' //建立表名為table1,建立了2個列族basic,advanced. 3. create 'table2','basic',MAX_FILESIZE=>'134217728' //對表中所有列族設定,所有分區單次持久化的最大值為128MB 4. create 'TABLE1','basic' //hbase區分大小寫,與第一個table1是2張不同的表 5. create 'table1',{NAME => 'basic',VERSION => 5,BLOCKCACHE => true} //大括號內是對列族basic進行描述,定義了VERSION=>5,表示對於同一個cell,保留最近的5個歷史版本,BLOCKCACHE賦值為true,允許讀取數據時進行緩存.其他未指定的參數,采用默認值 //大括號中的語法,NAME和VERSION為參數名,不需要用括號引用. //創建命名空間 create_namespace 'bigdata' //命名空間下創建表 create 'bigdata:student','info' //命名空間下刪除表,如果有表,需要先刪除表
drop_namespace 'bigdata'
3.2.2 查看表名列表
//list命令查看當前所有表名 list //list命令查看當前命名空間 list_space //exists 命令查看此表是否存在 exists 'table_test1' eg: hbase(main):010:0> list TABLE table_test1 1 row(s) in 0.0060 seconds hbase(main):043:0> list_namespace NAMESPACE default 1 row(s) in 0.0190 seconds hbase(main):011:0> exists 'table_test1' Table table_test1 does exist 0 row(s) in 0.0070 seconds
3.2.3 描述表結構
//描述表結構 describe命令查看指定表的列族信息,包括有多少個列族、每個列族的參數信息 describe 'table_test1'
//描述命名空間下的表結構
describe 'bigdata:table_test1'
eg: hbase(main):013:0> describe 'table_test1' Table table_test1 is ENABLED table_test1 COLUMN FAMILIES DESCRIPTION {NAME => 'test001', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE => '0'} {NAME => 'test002', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE => '0'} 2 row(s) in 0.0250 seconds
3.2.4 修改表結構
//修改表結構,alter命令,比如增加列族或修改列族參數. //eg:表table_test1中新增列族test002 1. alter 'table_test1','test001','test002' //新增列族test002 2. alter 'table_test1','test002' //新增列族test002 3. alter 'table_test1','test001',{NAME=> 'test002',IN_MEMORY =>true} //新增列族test002 //修改列族名稱,該列族下已存有數據,需要對數據進行修改 4. alter 'table_test1',{NAME=> 'test001',IN_MEMORY =>true} //刪除一個列族,以及其中的數據(前提是至少要有一個列族) 5. alter 'table_test1','delete'=>'test001' 6. alter 'table_test1',{NAME=> 'test002',METHOD=>'delete'} eg: [haishu@cs010 bin]$ . /hbash shell hbase(main):001:0> list TABLE table_test1 1 row(s) in 0.1710 seconds hbase(main):002:0> alter 'table_test1','delete'=>'test001' Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 1.9480 seconds hbase(main):003:0> alter 'table_test1',{NAME=>'test002',METHOD=>'delete'} Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 1.8710 seconds
3.2.5 刪除表
//先禁用表,再刪除表 disable 'table1' //禁用表table1 is_disable 'table1'//查看是否禁用成功 drop 'table1'//刪除表 //順序完成禁用、刪除表、刪除所有數據、重新建立空表,即清空表中所有的數據 truncate 'table1'
3.3 數據更新
HBase Shell 增刪改查命令:
3.3.1 數據插入
//數據插入,參數依次顯示為:表名、行鍵名稱、列族:列的名稱、單元格的值、時間戳或數據版本號,數值越大表示時間或版本越新,如果省略,默認顯示當前時間戳 put 'table_test','001','basic:test001','micheal jordan',1 put 'table_test','002','basic:test002','kobe'
3.3.2 數據更新
//數據更新,put語句行鍵、列族已存在,但不考慮時間戳。建表時設定VERSIONS=>n,則用戶可以查詢到同一個cell,最新的n個數據版本 put 'table_test','001','basic:test001','air jordan',2
3.3.3 數據刪除
HBase 的刪除操作並不會立即將數據從磁盤上刪除,刪除操作主要是對要被刪除的數據打上標記。
當執行刪除操作時,HBase 新插入一條相同的 KeyValue 數據,但是使 keytype=Delete,這便意味着數據被刪除了,直到發生 Major compaction 操作時,數據才會被真正的從磁盤上刪除,刪除標記也會從StoreFile刪除。
//數據刪除,用delete,必須指明表名和列族名稱 delete 'table_test','001','basic' delete 'table_test','002','basic:test002' delete 'table_test','002','basic:test002',2 //如果指明了版本,默認刪除的是所有版本<=2的數據 //delete命令的最小粒度是cell,且不能跨列族刪除。 //刪除表中所有列族在某個行鍵上的數據,即刪除一個邏輯行,則需要使用deleteall命令 deleteall 'table_test','001' deleteall 'table_test','002',1 //hbase並不能做實時刪除數據,當hbase刪除數據時,可以看作為這條數據put了新的版本,有一個刪除標記(tombstone)
3.3.4 計數器
//incr命令可以將cell的數值在原值上加入指定數值 incr 'table_test','001','basic:scores',10 //get_counter命令可以查看計數器的當前值 get_counter 'table_test','001','basic:scores'
3.3 數據查詢
hbase有2種基本的數據查詢方法:
1.get:按行鍵獲取一條數據
2.scan:掃描一個表,可以指定行鍵范圍或使用過濾器限制范圍。
3.count:采用count指令計算表的邏輯行數
//get命令的必選參數為表名和行鍵名 get 'table_test','001' //可選項,指明列族名稱、時間戳的范圍、數據版本數、使用過濾器 get 'table_test','001',{COLUMN=>'basic'} get 'table_test','001',{COLUMN=>'basic',TIMERANGE=>[1,21]} get 'table_test','001',{COLUMN=>'basic',VERSIONS=>3} get 'table_test','001',{COLUMN=>'basic',TIMERANG=>[1,2],VERSION=>3} get 'table_test','001',{FILTER=>"ValueFilter(=,'binary:Michael Jordan 1')"}
//scan數據掃描,不指定行鍵,hbase只能通過全表掃描的方式查詢數據 scan 'table_test' //指定列族名稱 scan 'table_test' ,{COLUMN =>'basic'} //指定列族和列名 scan 'table_test' ,{COLUMN =>'basic:name'} //指定輸出行數 scan 'table_test' ,{LIMIT => 1} //指定行鍵的范圍,中間用逗號隔開 scan 'table_test' ,{LIMIT =>'001',LIMIT => '003'} //指定時間戳或時間范圍 scan 'table_test' ,{TIMESTAMP => 1} scan 'table_test' ,{TIMESTAMP => [1,3]} //使用過濾器 scan 'table_test' ,FILTER=>"RowFilter(=,substring:0')" //指定對同一個鍵值返回的最多歷史版本數量 scan 'table_test' ,{version=> 1}
//采用count指令可以計算表的邏輯行數 count 'table_test'
3.3 過濾查詢
無論是在get方法還是scan方法,均可以使用過濾器(filter)來顯示掃描或輸出的范圍。
//過濾器進行過濾查詢,配合比較運算符或比較器共同使用:>、<、=、>=、<=、!= show_filters
比較器:
- BinaryComparator:完整字節比較器,如:binary:001,表示用字典順序依次比較數據的所有字節。
- BinaryPrefixComparator:前綴字節比較器,如:binaryprefix:001,表示用字典順序依次比較數據的前3個字節。
- RegexStringComparator:正則表達式比較器,如regexstring:a*c,表示字符串'a'開頭,'c'結構的所有字符串。只可以用=或!=兩種運算符。
- SubstringComparator:子字符串比較器,如substring:00.只可以用=或!=兩種運算符。
- BitComparator:比特位比較器。只可以用=或!=兩種運算符。
- NullComparator:空值比較器。
//比較器語法使用,用FILTER=> "過濾器(比較方式)"的方式指明所使用的過濾方法 //在語法格式上,過濾的方法用雙引號引用,而比較方式用小括號引用 scan 'table_test',FILTER=>"RowFilter(=,'substring:0')" scan 'table_test',{FILTER=>"RowFilter(=,'substring:0')"}
過濾器的用途:
- 行鍵過濾器
- 列族和列過濾器
- 值過濾器
- 其他過濾器
行鍵過濾器:
//行鍵過濾器,RowFilter:可以配合比較器及運算符,實現行鍵字符串的比較和過濾。 //需求:顯示行鍵前綴為0開頭的鍵值對,進行子串過濾只能用=或!=兩種方式,不支持采用大於或小於 scan 'table_test',FILTER=>"RowFilter(=,'Substring:0')" scan 'table_test',FILTER=>"RowFilter(>=,'BinaryPrefix:0')"
//行鍵前綴比較器,PrefixFilter:比較行鍵前綴(等值比較)的命令 scan 'table_test',FILTER=>"PrefixFilter('0')"
//KeyOnlyFilter:只對cell的鍵進行過濾和顯示,不顯示值,掃描效率比RowFilter高 scan 'table_test',{FILTER=>"KeyOnlyFilter()"} //FirstKeyFilter:只掃描相同鍵的第一個cell,其鍵值對都會顯示出來,如果有重復的行鍵則跳過。可以用來實現對行鍵(邏輯行)的計數,和其他計數方式相比。 scan 'table_test',{FILTER=>"FirstKeyFilter()"} //InclusiveStopFilter:使用STARTROW和ENDROW進行設定范圍的scan時,結果會包含STARTROW行,但不包括ENDROW,使用該過濾器替代ENDROW條件 scan 'table_test',{STARTROW=>'001',ENDROW=>'002'} scan 'table_test',{STARTROW=>'001',FILTER=>"InclusiveStopFilter ('binary:002')",ENDROW=>'002'}
列族和列過濾器:
//列族和列過濾器 //列族過濾器:FamilyFilter scan 'table_test',FILTER=>"FamilyFilter(=,'substring:test001')" //列名(列標識符)過濾器:QualifierFilter scan 'table_test',FILTER=>"QualifierFilter(=,'substring:test001')" //列名前綴過濾器:ColumnPrefixFilter scan 'table_test',FILTER=>"ColumnPrefixFilter('f')" //指定多個前綴的ColumnPrefixFilter:MultipleColumnPrefixFilter scan 'table_test',FILTER=>"MultipleColumnPrefixFilter('f','l')" //時間戳過濾器:TimestampsFilter scan 'table_test',{FILTER=>"TimestampsFilter(1,2)"} //列名范圍過濾器:ColumnRangeFilter scan 'table_test',{FILTER=>"ColumnRangeFilter('f',false,'lastname',true)"} //參考列過濾器:DependentColumnFilter,設定一個參考列(即列名),如果某個邏輯行包含該列,則返回該行中和參考列時間戳相同的所有鍵值對 //過濾器參數中,第一項是需要過濾數據的列族名,第二項是參考列名,第三項是false說明掃描包含"basic:firstname",如果是true則說明在basic列族的其他列中進行掃描。 scan 'table_test',{FILTER=>"DependentColumnFilter('basic','firstname',false)"}
值過濾器:
//ValueFilter:值過濾器,get或者scan方法找到符合值條件的鍵值對,變量=值:Michael Jordan
get 'table_test','001',{FILTER=>"ValueFilter(=,'binary:Michael Jordan')"}
scan 'table_test',{FILTER=>"ValueFilter(=,'binary:Michael Jordan')"}
//SingleColumnValueFilter:在指定的列族和列中進行比較的值過濾器,使用該過濾器時盡量在前面加上一個獨立的列名限定
scan 'table_test',{ COLUMN => 'basic:palyername' , FILTER => "SingleColumnValueExcludeFilter('basic','playername',=,'binary:Micheal Jordan 3')"}
//SingleColumnValueExcludeFilter:和SingleColumnValueFilter類似,但功能正好相反,即排除匹配成功的值
scan 'table_test', FILTER => "SingleColumnValueExcludeFilter( 'basic' , 'playername' ,=,'binary:Micheal Jordan 3')"
SingleColumnValueFilter和SingleColumnValueExcludeFilter區別: Value = "Micheal Jordan "的鍵值對,或者返回除此之外的其他所有鍵值對。
//其他過濾器
1. ColumnCountGetFilter:限制每個邏輯行最多返回多少個鍵值對(cell),一般用get,不用scan.
2. PageFilter:對顯示結果按行進行分頁顯示
3. ColumnPaginationFilter:對顯示結果按列進行分頁顯示
4. 自定義過濾器:hbase允許采用Java編程的方式開發新的過濾器
eg: scan 'table_test', FILTER => "ColumnPrefixFilter( 'first' ) AND ValueFilter(=, 'substring:kobe')"
eg:
hbase(main):012:0> get 'Test','002',{FILTER=>"ValueFilter(=,'binary:test004')"}
COLUMN CELL
zhangsan:wendy001 timestamp=1587208488702, value=test004
zhangsan:wendy002 timestamp=1587208582262, value=test004
1 row(s) in 0.0100 seconds
hbase(main):013:0> scan 'Test',{FILTER=>"ValueFilter(=,'binary:test004')"}
ROW COLUMN+CELL
001 column=zhangsan:wendy001, timestamp=1587208452109, value=test004
002 column=zhangsan:wendy001, timestamp=1587208488702, value=test004
002 column=zhangsan:wendy002, timestamp=1587208582262, value=test004
2 row(s) in 0.0100 seconds
hbase(main):018:0> scan 'Test',{ COLUMN => 'zhangsan:wendy002' , FILTER => "SingleColumnValueExcludeFilter('zhangsan','wendy002',=,'binary:test004')"}
ROW COLUMN+CELL
0 row(s) in 0.0040 seconds
hbase(main):019:0> scan 'Test',{COLUMN=>'zhangsan:wendy002',FILTER=>"SingleColumnValueFilter('zhangsan','wendy002',=,'binary:test004')"}
ROW COLUMN+CELL
002 column=zhangsan:wendy002, timestamp=1587208582262, value=test004
1 row(s) in 0.0060 seconds
3.4 快照操作
快照:一種不復制數據就能建立表副本的方法,可以用於數據恢復,構建每日、每周或每月的數據報告,並在測試中使用等。
快照前提:Hbase的配置文件hbase-site.xml中配置hbase.snpashot.enabled屬性為true。一般情況下,HBase的默認選項即為true。
//建立表的快照p1 snapshot 'test001','p1' //顯示快照列表 List_snapshots //刪除快照 delete_snapshot 'p1' PS:注意刪除快照后,原表的數據仍然存在。刪除原表,快照的數據也仍然存在。 //通過快照生成新表play_1,注意用此種方法生成新表,不會發生數據復制,只會進行元數據操作 clone_snapshot 'p1','play_1' //快照恢復原表格,將拋棄快照之后的所有變化 restore_snapshot 'p1' //利用快照實現表改名,方法:制作一個快照,再將快照生成為新表,最后將不需要的舊表和快照刪除 snapshot 'player','p1' clone_snapshot 'p1','play_1' disable 'player' drop 'player' delete_snapshot 'p1'
3.5 批量導入導出
場景:put方法用於逐條采集數據,但如果需要將大量數據一次性寫入HBase,則需要進行批量操作。此外,如果需要將數據備份到HDFS等位置,也需要進行批量操作,基於hadoopde的MapReduce方法實現,而數據的導入源頭和備份目的,通常是在HDFS之上。
3.5.1 批量導入數據
批量導入數據,有兩種方式:
1、第一種是並行化的數據插入,利用MapReduce等方式將數據發給多個RegionServer。
2、第二種是根據表信息直接將原始數據轉換成HFile,並將數據復制到HDFS的相應位置,再將文件中的數據納入管理。
方法1,利用ImportTsv類方法:將存儲在HDFS上的文本文件導入到HBase的指定表,TXT文件當中應當有明確的列分隔符,比如利用'\t'(TAB鍵)分割的TSV格式,或逗號分割的CSV格式。
原理:執行機制是掃描整個文件,逐條將數據寫入。使用MapReduce方法在多個節點上啟動多個進程,同時讀取多個HDFS上的文件分塊。數據根據所屬分區不同,被發向不同的Regionserver,利用分布式並行讀寫的方式,加快數據導入的速度。
//在linux的命令行通過HBase指令調用ImportTsv類 //player為表名,hdfs://namenode:8020/input/為導入文件所在的目錄,這里不需要指定文件名,導入時會遍歷目錄中的所有文件。
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns= HBASE_ROW_KEY,basic:playername,advance:scores -Dimporttsv.skip.bad.lines =true player hdfs://namenode:8020/input/
//-Dimporttsv.columns=HBASE_ROW_KEY,參數依次為:第一個關鍵字HBASE_ROW_KEY是指定文本文件中的行鍵,第二個是寫入列族basic下名為playername的列,第三個是寫入advance列族下的scores列,這一參數一般為必選項。
//-Dimporttsv.skip.bad.lines=true表示略過無效的行,如果設置為false,則遇到無效行會導入報告失敗
//可選參數
//-Dimporttsv.separator=',',用逗號作為分隔符,也可以指定為其他形式的分隔符,例如'\0',默認情況下分隔符為'\t'。
//-Dimporttsv.timestamp =1298529542218,導入時使用指定的時間戳,如果不指定則采用當前時間。
方法二,利用bulk-load方法:直接將原始數據轉換成HFile,並將數據復制到HDFS的相應位置,再將文件中的數據納入管理,分為2個步驟。
//前提:表結構已經建立好,並且在命令中指定了表名,因為要根據表結構和分區狀況准備文件 //第一步:利用ImportTsv生成文件 //第二步:復制 //第一步:利用ImportTsv生成文件 hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.columns= HBASE_ROW_KEY,basic:playername,advance:scores -Dimporttsv.skip.bad.lines =true -Dimporttsv.bulk.output=hdfs://namenode:8020/bulkload/ player hdfs://namenode:8020/input/ //-Dimporttsv.bulk.output 參數,設定了HDFS路徑,准備好HFile文件的存放地址:hdfs://namenode:8020/bulkload/,由於MapReduce的特性,該路徑不能提前存在
//第二步:復制,利用MapReduce實現,參數為HFile文件所在路徑和表名。 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://namenode:8020/bulkload player
方法三,從關系型數據庫中導入數據到HBase:Hadoop系列組件中,有名為Sqoop的組件可以實現Hadoop、Hive、HBase等大數據工具與關系型數據庫(例如MySQL、Oracle)之間的數據導入、導出。
Sqoop分為1和2兩個版本,Sqoop1使用較為簡單,Sqoo2則繼承了更多功能,架構也更復雜。
//以sqoop1為例,其安裝過程基本為解壓。 //訪問MySQL等數據庫,則需要自行下載數據庫連接組件(mysql-connector-java-x.jar),並復制到其lib目錄中。 sqoop import --connect jdbc:mysql://node1:3306/database1 --table table1 --hbase-table player --column-family f1 --hbase-row-key playername --hbase-create-table --username 'root' -password '123456' //從mysql中導入數據(import),之后指明了作為數據源的mysql的訪問地址(node1)、端口(3306)、數據庫名(database1)、表名(table1)。 //數據導入名為player的HBase表,並存入名為f1的列族,列名則和MySQL中保持一致,行鍵為MySQL表中名為playername的列。 //--hbase-create-table :HBase中建立這個表,最后指明了訪問mysql的用戶名和密碼。
3.5.2 備份和恢復
HBase支持將表或快照復制到HDFS,支持將數據復制到其他HBase集群,以實現數據備份和恢復功能。有四種方式:
//Export、Import、ExportSnapshot、CopyTable //Export:將HBase的數據導出到HDFS。目的;備份,文件並不能直接以文本方式查看。 //參數中<tablename>為表名,<outputdir>為HDFS路徑。 hbase org.apache.hadoop.hbase.mapreduce.Export <tablename> <outputdir> //Import:導出的數據可以恢復到HBase。 hbase org.apache.hadoop.hbase.mapreduce.Import <tablename> <outputdir> //ExportSnapshot hbase org.apache.hadoop.hbase.mapreduce.ExportSnapshot -snapshot <snapshot name> -copy-to <outputdir> //snapshot 快照名 ;outputdir為HDFS路徑,導出的快照文件可以利用Import方法恢復到表中。 //CopyTable:可以將一個表的內容復制到新表中,新表和原表可以在同一個集群內,也可以在不同的集群上。復制過程利用MapReduce進行。 //前提:新表已經建立起來 hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=<NEW_TABLE_NAME> -peer.adr=<zookeeper_peer:2181:/hbase> <TABLE_NAME> //--new.name=<NEW_TABLE_NAME>參數描述新表的名字,如果不指定則默認和原表名相同。 //-peer.adr=<zookeeper_peer:2181:/hbase>參數指向目標集群Zookeeper服務中的hbase數據入口(包括meta表的地址信息等) //CopyTable幫助 hbase org.apache.hadoop.hbase.mapreduce.CopyTable --help
5、phoenix工具
phoenix核心功能:HBase提供SQL語言支持和JDBC接口。基於協處理器等功能,仿照關系型數據庫的常見功能,對HBase進行了功能擴展:
- 事務機制:目的是通過一個處在孵化中(incubator)的開源軟件Tephra,實現分布式全局事務機制
- 二級索引:利用寫核處理器等級制實現二級索引,並通過SQL語句操作索引
- 用戶自定義函數(UDFs),在使用SQL語句時調用用戶自行開發的函數
- 游標(cursor):指示當前行,方便基於當前行開展下一步查詢
- 批量導入(Bulkdataloading):可以采用單線程和多線程兩種方式導入CSV或JSON格式的數據
- 視圖(views):關系型數據庫中的視圖概念
- 抽樣:利用SQL語句
- 定義存儲格式(storage formats):該功能類似於在OpenTSDB中使用偏移量和編碼等方式降低行鍵和列族的存儲空間占用
- 多租戶(multi-tenancy):即為不同用戶提供不同的視圖。
4.1 phoenix 配置
squirrel-sql客戶端下載:http://squirrel-sql.sourceforge.net/#installation
phoenix下載:http://mirror.bit.edu.cn/apache/phoenix/
配置方法:
1.下載相應的phoenix軟件包,將其中的Jar包復制到regionserver下、HBase安裝目錄下的lib文件夾,並重啟HBase
2.SQL客戶端(如squirrel-sql)配置連接到phoenix的JDBCdriver.在命令行執行命令:java -jar squirrel-sql-<version>-install.jar
PS:On Windows, execute the file squirrel-sql.bat to run the application. On Unix, the file is squirrel-sql.sh.