HBase的基本使用(安裝配置、啟動關閉、hbash shell的基本操作、phoenix、實戰)


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的底層存儲文件系統。

jdk和hadoop配置文件參考文章

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進行了功能擴展:

  1. 事務機制:目的是通過一個處在孵化中(incubator)的開源軟件Tephra,實現分布式全局事務機制
  2. 二級索引:利用寫核處理器等級制實現二級索引,並通過SQL語句操作索引
  3. 用戶自定義函數(UDFs),在使用SQL語句時調用用戶自行開發的函數
  4. 游標(cursor):指示當前行,方便基於當前行開展下一步查詢
  5. 批量導入(Bulkdataloading):可以采用單線程和多線程兩種方式導入CSV或JSON格式的數據
  6. 視圖(views):關系型數據庫中的視圖概念
  7. 抽樣:利用SQL語句
  8. 定義存儲格式(storage formats):該功能類似於在OpenTSDB中使用偏移量和編碼等方式降低行鍵和列族的存儲空間占用
  9. 多租戶(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.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM