最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 14:10:11
文檔

工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用

工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用:HBase配置和使用文檔 HBase配置和使用文檔...................................................................................................... 1 一、 HBase原理和結(jié)構(gòu)說(shuō)明............................
推薦度:
導(dǎo)讀工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用:HBase配置和使用文檔 HBase配置和使用文檔...................................................................................................... 1 一、 HBase原理和結(jié)構(gòu)說(shuō)明............................

HBase配置和使用文檔 HBase配置和使用文檔...................................................................................................... 1 一、 HBase原理和結(jié)構(gòu)說(shuō)明.......................................................................

HBase配置和使用文檔

HBase配置和使用文檔...................................................................................................... 1

一、 HBase原理和結(jié)構(gòu)說(shuō)明............................................................................................. 2

二、 HBase的表結(jié)構(gòu)....................................................................................................... 2

1) Row Key............................................................................................................... 3

2) 列族 column family.............................................................................................. 4

3) 單元 Cell............................................................................................................. 4

4) 時(shí)間戳 timestamp................................................................................................. 4

三、 HBASe單機(jī)配置...................................................................................................... 5

2) 使用root身份登錄目標(biāo)服務(wù)器系統(tǒng)(Suse10Linux).................................................. 5

3) 創(chuàng)建hadoop用戶(hù),$useraddhadoop可以用$passwdhadoop修改hadoop用戶(hù)的登錄密碼. 5

4) 解壓hadoop:......................................................................................................... 6

5) 配置hbase-site.xml文件........................................................................................ 6

6) 啟動(dòng)和關(guān)閉.......................................................................................................... 7

7) 說(shuō)明..................................................................................................................... 7

四、 Hbase配置解釋........................................................................................................ 8

1) 修改linux 系統(tǒng)參數(shù) Linux系統(tǒng)最大可打開(kāi)文件數(shù)一般默認(rèn)的參數(shù)值是1024,如果你不進(jìn)行修改并發(fā)量上來(lái)的時(shí)候會(huì)出現(xiàn)“TooMany Open Files”的錯(cuò)誤,導(dǎo)致整個(gè)HBase不可運(yùn)行,你可以用ulimit-n 命令進(jìn)行修改,或者修改/etc/security/limits.conf 和/proc/sys/fs/file-max 的參數(shù),具體如何修改可以去Google 關(guān)鍵字 “l(fā)inux limits.conf ”........................................................................................................ 8

2) JVM 配置 修改hbase-env.sh 文件中的配置參數(shù),根據(jù)你的機(jī)器硬件和當(dāng)前操作系統(tǒng)的JVM(32/64位)配置適當(dāng)?shù)膮?shù) HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小 HBASE_OPTS "‐server ‐XX:+UseConcMarkSweepGC"JVMGC 選項(xiàng) HBASE_MANAGES_ZKfalse 是否使用Zookeeper進(jìn)行分布式管理 8

3) 配置HBase運(yùn)行參數(shù) hbase.rootdir.................................................................. 9

五、 HBase shell的基本用法........................................................................................... 23

1) 建立一個(gè)表和列族.............................................................................................. 23

2) 按設(shè)計(jì)的表結(jié)構(gòu)插入值:.................................................................................... 24

3) 根據(jù)鍵值查詢(xún)數(shù)據(jù).............................................................................................. 24

4) 掃描所有數(shù)據(jù)..................................................................................................... 25

5) 刪除指定數(shù)據(jù)..................................................................................................... 25

6) 修改表結(jié)構(gòu)......................................................................................................... 26

7) 統(tǒng)計(jì)行數(shù):......................................................................................................... 27

8) disable 和 enable 操作........................................................................................ 27

9) 表的刪除............................................................................................................ 27

10) hbase shell腳本.................................................................................................. 28

六、 JAVA操作HBASE方面......................................................................................... 28

1) 連接原理和配置.................................................................................................. 28

2) 創(chuàng)建表................................................................................................................ 30

3) 刪除表................................................................................................................ 31

4) 查詢(xún)數(shù)據(jù)............................................................................................................ 31

5) 插入數(shù)據(jù)............................................................................................................ 33

6) 刪除數(shù)據(jù)............................................................................................................ 34

7) 切分表................................................................................................................ 35

一、HBase原理和結(jié)構(gòu)說(shuō)明

HBase是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù),源于google的一篇論文《bigtable:一個(gè)結(jié)構(gòu)化數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)》

HBase是Google Bigtable的開(kāi)源實(shí)現(xiàn),它利用Hadoop HDFS作為其文件存儲(chǔ)系統(tǒng),利用Hadoop MapReduce來(lái)處理HBase中的海量數(shù)據(jù),利用Zookeeper作為協(xié)同服務(wù)。

二、HBase的表結(jié)構(gòu)

HBase以表的形式存儲(chǔ)數(shù)據(jù)。表有行和列組成。列劃分為若干個(gè)列族/列簇(column family)。

實(shí)際情況為:

如上圖所示,key1,key2,key3是三條記錄的唯一的row key值,column-family1,column-family2,column-family3是三個(gè)列族,每個(gè)列族下又包括幾列。比如column-family1這個(gè)列族下包括兩列,名字是column1和column2,t1:abc,t2:gdxdf是由rowkey1和column-family1-column1唯一確定的一個(gè)單元cell。這個(gè)cell中有兩個(gè)數(shù)據(jù),abc和gdxdf。兩個(gè)值的時(shí)間戳不一樣,分別是t1,t2, hbase會(huì)返回最新時(shí)間的值給請(qǐng)求者。

這些名詞的具體含義如下:

1) Row Key

與nosql數(shù)據(jù)庫(kù)們一樣,row key是用來(lái)檢索記錄的主鍵。訪(fǎng)問(wèn)hbase table中的行,只有三種方式:

(1.1) 通過(guò)單個(gè)row key訪(fǎng)問(wèn)

(1.2) 通過(guò)row key的range

(1.3) 全表掃描

Rowkey行鍵 (Row key)可以是任意字符串(最大長(zhǎng)度是 64KB,實(shí)際應(yīng)用中長(zhǎng)度一般為 10-100bytes),在hbase內(nèi)部,row key保存為字節(jié)數(shù)組。

存儲(chǔ)時(shí),數(shù)據(jù)按照Row key的字典序(byte order)排序存儲(chǔ)。設(shè)計(jì)key時(shí),要充分排序存儲(chǔ)這個(gè)特性,將經(jīng)常一起讀取的行存儲(chǔ)放到一起。(位置相關(guān)性)

注意:

字典序?qū)nt排序的結(jié)果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行鍵必須用0作左填充。

行的一次讀寫(xiě)是原子操作 (不論一次讀寫(xiě)多少列)。這個(gè)設(shè)計(jì)決策能夠使用戶(hù)很容易的理解程序在對(duì)同一個(gè)行進(jìn)行并發(fā)更新操作時(shí)的行為。

2) 列族 column family

hbase表中的每個(gè)列,都?xì)w屬與某個(gè)列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如courses:history , courses:math 都屬于courses 這個(gè)列族。

訪(fǎng)問(wèn)控制、磁盤(pán)和內(nèi)存的使用統(tǒng)計(jì)都是在列族層面進(jìn)行的。實(shí)際應(yīng)用中,列族上的控制權(quán)限能幫助我們管理不同類(lèi)型的應(yīng)用:我們?cè)试S一些應(yīng)用可以添加新的基本數(shù)據(jù)、一些應(yīng)用可以讀取基本數(shù)據(jù)并創(chuàng)建繼承的列族、一些應(yīng)用則只允許瀏覽數(shù)據(jù)(甚至可能因?yàn)殡[私的原因不能瀏覽所有數(shù)據(jù))。

3) 單元 Cell

HBase中通過(guò)row和columns確定的為一個(gè)存貯單元稱(chēng)為cell。由{row key, column( = +

4) 時(shí)間戳 timestamp

每個(gè)cell都保存著同一份數(shù)據(jù)的多個(gè)版本。版本通過(guò)時(shí)間戳來(lái)索引。時(shí)間戳的類(lèi)型是 64位整型。時(shí)間戳可以由hbase(在數(shù)據(jù)寫(xiě)入時(shí)自動(dòng) )賦值,此時(shí)時(shí)間戳是精確到毫秒的當(dāng)前系統(tǒng)時(shí)間。時(shí)間戳也可以由客戶(hù)顯式賦值。如果應(yīng)用程序要避免數(shù)據(jù)版本沖突,就必須自己生成具有唯一性的時(shí)間戳。每個(gè)cell中,不同版本的數(shù)據(jù)按照時(shí)間倒序排序,即最新的數(shù)據(jù)排在最前面。

為了避免數(shù)據(jù)存在過(guò)多版本造成的的管理 (包括存貯和索引)負(fù)擔(dān),hbase提供了兩種數(shù)據(jù)版本回收方式。一是保存數(shù)據(jù)的最后n個(gè)版本,二是保存最近一段時(shí)間內(nèi)的版本(比如最近七天)。用戶(hù)可以針對(duì)每個(gè)列族進(jìn)行設(shè)置。

三、HBASe單機(jī)配置

1) 下載
在Apache/Hadoop項(xiàng)目的網(wǎng)站(hadoop.apache.org/)下載hadoophbase發(fā)行包,此處兩個(gè)發(fā)行包的大版本號(hào)一定要一致,譬如都是0.18版本:hadoop-0.18.2.tar.gzhbase-0.18.1.tar.gz

2) 使用root身份登錄目標(biāo)服務(wù)器系統(tǒng)(Suse10Linux)

首先安裝java虛擬機(jī),這個(gè)比較簡(jiǎn)單,隨便找個(gè)綠色的解壓就可以了,在這個(gè)例子里面我使用IBMWAS6.1附帶的jdk,它的home目錄是/opt/IBM/WebSphere/AppServer/java,我們只需要配置系統(tǒng)的環(huán)境變量就可以了.
編輯全局環(huán)境變量文件/etc/profile,在文件后面添加
exportJAVA_HOME=/opt/IBM/WebSphere/AppServer/java
exportPATH=$JAVA_HOME:$PATH
保存profile文件后使用$source/etc/profile命令重新加載profile,然后隨便在一個(gè)目錄下面運(yùn)行$java-version查看javahome環(huán)境變量和path變量是否被正確加載.
另外到/etc/hosts文件中查看主機(jī)映射是否存在,例如127.0.0.1localhost或者什么其他的名字,在這里默認(rèn)配置本機(jī)為localhost,如果需要做分布式的話(huà),本機(jī)要做namenode,所以要把所有的datanode的host添加到這里面.

3) 創(chuàng)建hadoop用戶(hù),$useraddhadoop可以用$passwdhadoop修改hadoop用戶(hù)的登錄密碼.

創(chuàng)建hadoop用戶(hù)的home目錄,如果打算在別處安裝hadoop/hbase的話(huà)可以不這樣做,這里我們默認(rèn)將hadoophbase安裝在/home/${username}目錄下.

$cd/home
$mkdirhadoop
將目錄用戶(hù)指派給hadoop
$chownhadoophadoop
改變目錄權(quán)限,這里我們配大一些,其實(shí)只要644就足夠了:
$chmod755hadoop

使用hadoop用戶(hù)登錄系統(tǒng),將下載的兩個(gè)發(fā)行包文件傳到/home/hadoop目錄下面,然后給它們加上執(zhí)行權(quán)限:
$chmoda+xhadoop-0.18.2.tar.gz
$chmoda+xhbase-0.18.1.tar.gz

4) 解壓hadoop:

$tarzxvfhadoop-0.18.2.tar.gz
這樣做會(huì)在/home/hadoop目錄下解壓hadoop發(fā)行包并創(chuàng)建到/home/hadoop/hadoop。

5) 配置hbase-site.xml文件

hbase.rootdir

file:///home/data/hbase

hbase.coprocessor.user.region.classes

com.avos.uluru.hbase.AggrEndPoint

hbase.zookeeper.quorum

10.5.31.10

zookeeper.session.timeout

60000

hbase.zookeeper.property.clientPort

2181

hbase.regionserver.dns.nameserver

test.hbase.com

hbase.master.dns.interface

em3

6) 啟動(dòng)和關(guān)閉

/bin/start-hbase.sh

/bin/stop-hbase.sh

7) 說(shuō)明

必須配置的參數(shù):

Hbase.zookeeper.quorum 本機(jī)的IP地址,不能為localhost或127.0.0.1,否則不能遠(yuǎn)程鏈接。

Hbase.master.dns.interface 為master綁定的網(wǎng)卡,多網(wǎng)卡的服務(wù)器必須配置,否則默認(rèn)綁定到虛擬的輪回網(wǎng)卡,不配置不能遠(yuǎn)程鏈接。

ZooKeeper服務(wù)不認(rèn)Ip,只認(rèn)主機(jī)名,因此需要在/etc/hosts文件里增加一個(gè)ZooKeeper服務(wù)的IP地址與本機(jī)主機(jī)名的配置。如:10.5.31.10 amber-mts

如果不配置,Zookerper會(huì)綁定到locahost的主機(jī)名,遠(yuǎn)程就不能鏈接。

遠(yuǎn)程調(diào)用客戶(hù)端也需要配置本機(jī)的DNS,在c:\windows\system32\driver\etc\host文件里增加Zookerper的Ip與主機(jī)名的配置。

四、Hbase配置解釋

1) 修改linux 系統(tǒng)參數(shù)
Linux系統(tǒng)最大可打開(kāi)文件數(shù)一般默認(rèn)的參數(shù)值是1024,如果你不進(jìn)行修改并發(fā)量上來(lái)的時(shí)候會(huì)出現(xiàn)“Too Many Open Files”的錯(cuò)誤,導(dǎo)致整個(gè)HBase不可運(yùn)行,你可以用ulimit -n 命令進(jìn)行修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max 的參數(shù),具體如何修改可以去Google 關(guān)鍵字“l(fā)inux limits.conf ”

2) JVM 配置
修改 hbase-env.sh 文件中的配置參數(shù),根據(jù)你的機(jī)器硬件和當(dāng)前操作系統(tǒng)的JVM(32/64位)配置適當(dāng)?shù)膮?shù)
HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小
HBASE_OPTS "‐server‐XX:+UseConcMarkSweepGC"JVMGC 選項(xiàng)
HBASE_MANAGES_ZKfalse 是否使用Zookeeper進(jìn)行分布式管理

HBase持久化
重啟操作系統(tǒng)后HBase中數(shù)據(jù)全無(wú),你可以不做任何修改的情況下,創(chuàng)建一張表,寫(xiě)一條數(shù)據(jù)進(jìn)行,然后將機(jī)器重啟,重啟后你再進(jìn)入HBase的shell中使用 list 命令查看當(dāng)前所存在的表,一個(gè)都沒(méi)有了。是不是很杯具?沒(méi)有關(guān)系你可以在hbase/conf/hbase-default.xml中設(shè)置hbase.rootdir的值,來(lái)設(shè)置文件的保存位置指定一個(gè)文件夾,例如:file:///you/hbase-data/path,你建立的HBase中的表和數(shù)據(jù)就直接寫(xiě)到了你的磁盤(pán)上,如圖所示:
同樣你也可以指定你的分布式文件系統(tǒng)HDFS的路徑例如:hdfs://NAMENODE_SERVER:PORT/HBASE_ROOTDIR,這樣就寫(xiě)到了你的分布式文件系統(tǒng)上了。

3) 配置HBase運(yùn)行參數(shù)
hbase.rootdir

這個(gè)目錄是region server的共享目錄,用來(lái)持久化Hbase。URL需要是'完全正確'的,還要包含文件系統(tǒng)的scheme。例如,要表示hdfs中的'/hbase'目錄,namenode 運(yùn)行在namenode.example.org的9090端口。則需要設(shè)置為hdfs://namenode.example.org:9000 /hbase。默認(rèn)情況下Hbase是寫(xiě)到/tmp的。不改這個(gè)配置,數(shù)據(jù)會(huì)在重啟的時(shí)候丟失。

默認(rèn):file:///tmp/hbase-${user.name}/hbase

hbase.master.port

Hbase的Master的端口.

默認(rèn): 60000

hbase.cluster.distributed

Hbase的運(yùn)行模式。false是單機(jī)模式,true是分布式模式。若為false,Hbase和Zookeeper會(huì)運(yùn)行在同一個(gè)JVM里面。

默認(rèn): false

hbase.tmp.dir

本地文件系統(tǒng)的臨時(shí)文件夾??梢孕薷牡揭粋€(gè)更為持久的目錄上。(/tmp會(huì)在重啟時(shí)清楚)

默認(rèn):/tmp/hbase-${user.name}

hbase.master.info.port

HBase Master web界面端口. 設(shè)置為-1 意味著你不想讓他運(yùn)行。

默認(rèn): 60010

hbase.master.info.bindAddress

HBase Master web界面綁定的端口

默認(rèn):0.0.0.0

hbase.client.write.buffer

HTable 客戶(hù)端的寫(xiě)緩沖的默認(rèn)大小。這個(gè)值越大,需要消耗的內(nèi)存越大。因?yàn)榫彌_在客戶(hù)端和服務(wù)端都有實(shí)例,所以需要消耗客戶(hù)端和服務(wù)端兩個(gè)地方的內(nèi)存。得到的好處是,可以減少RPC的次數(shù)??梢赃@樣估算服務(wù)器端被占用的內(nèi)存:hbase.client.write.buffer * hbase.regionserver.handler.count

默認(rèn):2097152

hbase.regionserver.port

HBaseRegionServer綁定的端口

默認(rèn): 60020

hbase.regionserver.info.port

HBaseRegionServer web 界面綁定的端口 設(shè)置為 -1 意味這你不想與運(yùn)行RegionServer 界面.

默認(rèn): 60030

hbase.regionserver.info.port.auto

Master或RegionServer是否要?jiǎng)討B(tài)搜一個(gè)可以用的端口來(lái)綁定界面。當(dāng)hbase.regionserver.info.port已經(jīng)被占用的時(shí)候,可以搜一個(gè)空閑的端口綁定。這個(gè)功能在測(cè)試的時(shí)候很有用。默認(rèn)關(guān)閉。

默認(rèn): false

hbase.regionserver.info.bindAddress

HBaseRegionServer web 界面的IP地址

默認(rèn):0.0.0.0

hbase.regionserver.class

RegionServer 使用的接口。客戶(hù)端打開(kāi)代理來(lái)連接region server的時(shí)候會(huì)使用到。

默認(rèn):org.apache.hadoop.hbase.ipc.HRegionInterface

hbase.client.pause

通常的客戶(hù)端暫停時(shí)間。最多的用法是客戶(hù)端在重試前的等待時(shí)間。比如失敗的get操作和region查詢(xún)操作等都很可能用到。

默認(rèn): 1000

hbase.client.retries.number

最大重試次數(shù)。例如region查詢(xún),Get操作,Update操作等等都可能發(fā)生錯(cuò)誤,需要重試。這是最大重試錯(cuò)誤的值。

默認(rèn): 10

hbase.client.scanner.caching

當(dāng) 調(diào)用Scanner的next方法,而值又不在緩存里的時(shí)候,從服務(wù)端一次獲取的行數(shù)。越大的值意味著Scanner會(huì)快一些,但是會(huì)占用更多的內(nèi)存。當(dāng)緩沖被占滿(mǎn)的時(shí)候,next方法調(diào)用會(huì)越來(lái)越慢。慢到一定程度,可能會(huì)導(dǎo)致超時(shí)。例如超過(guò)了 hbase.regionserver.lease.period。

默認(rèn): 1

hbase.client.keyvalue.maxsize

一 個(gè)KeyValue實(shí)例的最大size.這個(gè)是用來(lái)設(shè)置存儲(chǔ)文件中的單個(gè)entry的大小上界。因?yàn)橐粋€(gè)KeyValue是不能分割的,所以可以避免因?yàn)?數(shù)據(jù)過(guò)大導(dǎo)致region不可分割。明智的做法是把它設(shè)為可以被最大region size整除的數(shù)。如果設(shè)置為0或者更小,就會(huì)禁用這個(gè)檢查。默認(rèn)10MB。

默認(rèn):10485760

hbase.regionserver.lease.period

客戶(hù)端租用HRegionserver 期限,即超時(shí)閥值。單位是毫秒。默認(rèn)情況下,客戶(hù)端必須在這個(gè)時(shí)間內(nèi)發(fā)一條信息,否則視為死掉。

默認(rèn): 60000

hbase.regionserver.handler.count

RegionServers受理的RPCServer實(shí)例數(shù)量。對(duì)于Master來(lái)說(shuō),這個(gè)屬性是Master受理的handler數(shù)量

默認(rèn): 10

hbase.regionserver.msginterval

RegionServer 發(fā)消息給Master 時(shí)間間隔,單位是毫秒

默認(rèn): 3000

hbase.regionserver.optionallogflushinterval

將Hlog同步到HDFS的間隔。如果Hlog沒(méi)有積累到一定的數(shù)量,到了時(shí)間,也會(huì)觸發(fā)同步。默認(rèn)是1秒,單位毫秒。

默認(rèn): 1000

hbase.regionserver.regionSplitLimit

region的數(shù)量到了這個(gè)值后就不會(huì)在分裂了。這不是一個(gè)region數(shù)量的硬性限制。但是起到了一定指導(dǎo)性的作用,到了這個(gè)值就該停止分裂了。默認(rèn)是MAX_INT.就是說(shuō)不阻止分裂。

默認(rèn):2147483647

hbase.regionserver.logroll.period

提交commitlog的間隔,不管有沒(méi)有寫(xiě)足夠的值。

默認(rèn):3600000

hbase.regionserver.hlog.reader.impl

HLog file reader的實(shí)現(xiàn).

默認(rèn):org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogReader

hbase.regionserver.hlog.writer.impl

HLog file writer的實(shí)現(xiàn).

默認(rèn):org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter

hbase.regionserver.thread.splitcompactcheckfrequency

region server 多久執(zhí)行一次split/compaction檢查.

默認(rèn): 20000

hbase.regionserver.nbreservationblocks

儲(chǔ)備的內(nèi)存block的數(shù)量(譯者注:就像石油儲(chǔ)備一樣)。當(dāng)發(fā)生out of memory 異常的時(shí)候,我們可以用這些內(nèi)存在RegionServer停止之前做清理操作。

默認(rèn): 4

hbase.zookeeper.dns.interface

當(dāng)使用DNS的時(shí)候,Zookeeper用來(lái)上報(bào)的IP地址的網(wǎng)絡(luò)接口名字。

默認(rèn): default

hbase.zookeeper.dns.nameserver

當(dāng)使用DNS的時(shí)候,Zookeepr使用的DNS的域名或者IP地址,Zookeeper用它來(lái)確定和master用來(lái)進(jìn)行通訊的域名.

默認(rèn):default

hbase.regionserver.dns.interface

當(dāng)使用DNS的時(shí)候,RegionServer用來(lái)上報(bào)的IP地址的網(wǎng)絡(luò)接口名字。

默認(rèn):default

hbase.regionserver.dns.nameserver

當(dāng)使用DNS的時(shí)候,RegionServer使用的DNS的域名或者IP 地址,RegionServer用它來(lái)確定和master用來(lái)進(jìn)行通訊的域名.

默認(rèn):default

hbase.master.dns.interface

當(dāng)使用DNS的時(shí)候,Master用來(lái)上報(bào)的IP地址的網(wǎng)絡(luò)接口名字。

默認(rèn):default

hbase.master.dns.nameserver

當(dāng)使用DNS的時(shí)候,RegionServer使用的DNS的域名或者IP 地址,Master用它來(lái)確定用來(lái)進(jìn)行通訊的域名.

默認(rèn):default

hbase.balancer.period

Master執(zhí)行regionbalancer的間隔。

默認(rèn): 300000

hbase.regions.slop

當(dāng)任一regionserver有average + (average * slop)個(gè)region是會(huì)執(zhí)行Rebalance

默認(rèn): 0

hbase.master.logcleaner.ttl

Hlog存在于.oldlogdir文件夾的最長(zhǎng)時(shí)間, 超過(guò)了就會(huì)被 Master 的線(xiàn)程清理掉.

默認(rèn): 600000

hbase.master.logcleaner.plugins

LogsCleaner 服務(wù)會(huì)執(zhí)行的一組LogCleanerDelegat。值用逗號(hào)間隔的文本表示。這些WAL/HLog cleaners會(huì)按順序調(diào)用。可以把先調(diào)用的放在前面。你可以實(shí)現(xiàn)自己的LogCleanerDelegat,加到Classpath下,然后在這里寫(xiě)下類(lèi)的全稱(chēng)。一般都是加在默認(rèn)值的前面。

默認(rèn):org.apache.hadoop.hbase.master.TimeToLiveLogCleaner

hbase.regionserver.global.memstore.upperLimit

單個(gè)regionserver的全部memtores的最大值。超過(guò)這個(gè)值,一個(gè)新的update操作會(huì)被掛起,強(qiáng)制執(zhí)行flush操作。

默認(rèn): 0.4

hbase.regionserver.global.memstore.lowerLimit

當(dāng)強(qiáng)制執(zhí)行flush操作的時(shí)候,當(dāng)?shù)陀谶@個(gè)值的時(shí)候,flush會(huì)停止。默認(rèn)是堆大小的 35% . 如果這個(gè)值和hbase.regionserver.global.memstore.upperLimit 相同就意味著當(dāng)update操作因?yàn)閮?nèi)存限制被掛起時(shí),會(huì)盡量少的執(zhí)行flush(譯者注:一旦執(zhí)行flush,值就會(huì)比下限要低,不再執(zhí)行)

默認(rèn): 0.35

hbase.server.thread.wakefrequency

service工作的sleep間隔,單位毫秒??梢宰鳛閟ervice線(xiàn)程的sleep間隔,比如log roller.

默認(rèn): 10000

hbase.hregion.memstore.flush.size

當(dāng)memstore的大小超過(guò)這個(gè)值的時(shí)候,會(huì)flush到磁盤(pán)。這個(gè)值被一個(gè)線(xiàn)程每隔hbase.server.thread.wakefrequency檢查一下。

默認(rèn):67108864

hbase.hregion.preclose.flush.size

當(dāng)一個(gè)region中的memstore的大小大于這個(gè)值的時(shí)候,我們又觸發(fā)了close.會(huì)先運(yùn)行“pre-flush”操作,清理這個(gè)需要關(guān)閉的 memstore,然后將這個(gè)region下線(xiàn)。當(dāng)一個(gè)region下線(xiàn)了,我們無(wú)法再進(jìn)行任何寫(xiě)操作。如果一個(gè)memstore很大的時(shí)候,flush 操作會(huì)消耗很多時(shí)間。"pre-flush"操作意味著在region下線(xiàn)之前,會(huì)先把memstore清空。這樣在最終執(zhí)行close操作的時(shí) 候,flush操作會(huì)很快。

默認(rèn):5242880

hbase.hregion.memstore.block.multiplier

如果memstore有hbase.hregion.memstore.block.multiplier倍數(shù)的hbase.hregion.flush.size的大小,就會(huì)阻塞update操作。這是為了預(yù)防在update高峰期會(huì)導(dǎo)致的失控。如果不設(shè)上 界,flush的時(shí)候會(huì)花很長(zhǎng)的時(shí)間來(lái)合并或者分割,最壞的情況就是引發(fā)out of memory異常。(譯者注:內(nèi)存操作的速度和磁盤(pán)不匹配,需要等一等。原文似乎有誤)

默認(rèn): 2

hbase.hregion.memstore.mslab.enabled

體驗(yàn)特性:?jiǎn)⒂胢emStore分配本地緩沖區(qū)。這個(gè)特性是為了防止在大量寫(xiě)負(fù)載的時(shí)候堆的碎片過(guò)多。這可以減少GC操作的頻率。(GC有可能會(huì)Stopthe world)(譯者注:實(shí)現(xiàn)的原理相當(dāng)于預(yù)分配內(nèi)存,而不是每一個(gè)值都要從堆里分配)

默認(rèn): false

hbase.hregion.max.filesize

最大HStoreFile大小。若某個(gè)Column families的HStoreFile增長(zhǎng)達(dá)到這個(gè)值,這個(gè)Hegion會(huì)被切割成兩個(gè)。 Default: 256M.

默認(rèn):268435456

hbase.hstore.compactionThreshold

當(dāng)一個(gè)HStore含有多于這個(gè)值的HStoreFiles(每一個(gè)memstore flush產(chǎn)生一個(gè)HStoreFile)的時(shí)候,會(huì)執(zhí)行一個(gè)合并操作,把這HStoreFiles寫(xiě)成一個(gè)。這個(gè)值越大,需要合并的時(shí)間就越長(zhǎng)。

默認(rèn): 3

hbase.hstore.blockingStoreFiles

當(dāng)一個(gè)HStore含有多于這個(gè)值的HStoreFiles(每一個(gè)memstore flush產(chǎn)生一個(gè)HStoreFile)的時(shí)候,會(huì)執(zhí)行一個(gè)合并操作,update會(huì)阻塞直到合并完成,直到超過(guò)了hbase.hstore.blockingWaitTime的值

默認(rèn): 7

hbase.hstore.blockingWaitTime

hbase.hstore.blockingStoreFiles所限制的StoreFile數(shù)量會(huì)導(dǎo)致update阻塞,這個(gè)時(shí)間是來(lái)限制阻塞時(shí)間的。當(dāng)超過(guò)了這個(gè)時(shí)間,HRegion會(huì)停止阻塞update操作,不過(guò)合并還有沒(méi)有完成。默認(rèn)為90s.

默認(rèn): 90000

hbase.hstore.compaction.max

每個(gè)“小”合并的HStoreFiles最大數(shù)量。

默認(rèn): 10

hbase.hregion.majorcompaction

一個(gè)Region中的所有HStoreFile的major compactions的時(shí)間間隔。默認(rèn)是1天。 設(shè)置為0就是禁用這個(gè)功能。

默認(rèn):86400000

hbase.mapreduce.hfileoutputformat.blocksize

MapReduce 中HFileOutputFormat可以寫(xiě) storefiles/hfiles. 這個(gè)值是hfile的blocksize的最小值。通常在Hbase寫(xiě)Hfile的時(shí)候,bloocksize是由table schema(HColumnDescriptor)決定的,但是在mapreduce寫(xiě)的時(shí)候,我們無(wú)法獲取schema中blocksize。這個(gè)值 越小,你的索引就越大,你隨機(jī)訪(fǎng)問(wèn)需要獲取的數(shù)據(jù)就越小。如果你的cell都很小,而且你需要更快的隨機(jī)訪(fǎng)問(wèn),可以把這個(gè)值調(diào)低。

默認(rèn): 65536

hfile.block.cache.size

分配給HFile/StoreFile的block cache占最大堆(-Xmx setting)的比例。默認(rèn)是20%,設(shè)置為0就是不分配。

默認(rèn): 0.2

hbase.hash.type

哈希函數(shù)使用的哈希算法??梢赃x擇兩個(gè)值:: murmur (MurmurHash) 和 jenkins(JenkinsHash). 這個(gè)哈希是給 bloom filters用的.

默認(rèn): murmur

hbase.master.keytab.file

HMaster server驗(yàn)證登錄使用的kerberoskeytab 文件路徑。(譯者注:Hbase使用Kerberos實(shí)現(xiàn)安全)

默認(rèn):

hbase.master.kerberos.principal

例如."hbase/_HOST@EXAMPLE.COM". HMaster運(yùn)行需要使用 kerberos principal name. principal name 可以在:user/hostname@DOMAIN 中獲取. 如果"_HOST" 被用做hostname portion,需要使用實(shí)際運(yùn)行的hostname來(lái)替代它。

默認(rèn):

hbase.regionserver.keytab.file

HRegionServer驗(yàn)證登錄使用的kerberoskeytab 文件路徑。

默認(rèn):

hbase.regionserver.kerberos.principal

例如."hbase/_HOST@EXAMPLE.COM". HRegionServer運(yùn)行需要使用 kerberos principalname. principal name 可以在: user/hostname@DOMAIN 中獲取. 如果 "_HOST" 被用做hostname portion,需要使用實(shí)際運(yùn)行的hostname來(lái)替代它。在這個(gè)文件中必須要有一個(gè)entry來(lái)描述 hbase.regionserver.keytab.file

默認(rèn):

zookeeper.session.timeout

ZooKeeper 會(huì)話(huà)超時(shí).Hbase把這個(gè)值傳遞改zk集群,向他推薦一個(gè)會(huì)話(huà)的最大超時(shí)時(shí)間。詳見(jiàn)http://hadoop.apache.org/zookeeper/docs/current/zookeeperProgrammers.html#ch_zkSessions "The client sends a requestedtimeout, the server responds with the timeout that it can givethe client. "。 單位是毫秒

默認(rèn): 180000

zookeeper.znode.parent

ZooKeeper中的Hbase的根ZNode。所有的Hbase的ZooKeeper會(huì)用這個(gè)目錄配置相對(duì)路徑。默認(rèn)情況下,所有的Hbase的ZooKeeper文件路徑是用相對(duì)路徑,所以他們會(huì)都去這個(gè)目錄下面。

默認(rèn): /hbase

zookeeper.znode.rootserver

ZNode 保存的 根region的路徑. 這個(gè)值是由Master來(lái)寫(xiě),client和regionserver 來(lái)讀的。如果設(shè)為一個(gè)相對(duì)地址,父目錄就是 ${zookeeper.znode.parent}.默認(rèn)情形下,意味著根region的路徑存儲(chǔ)在/hbase/root-region- server.

默認(rèn):root-region-server

hbase.zookeeper.quorum

Zookeeper 集群的地址列表,用逗號(hào)分割。例 如:"host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".默認(rèn)是 localhost,是給偽分布式用的。要修改才能在完全分布式的情況下使用。如果在hbase-env.sh設(shè)置了HBASE_MANAGES_ZK, 這些ZooKeeper節(jié)點(diǎn)就會(huì)和Hbase一起啟動(dòng)。

默認(rèn):localhost

hbase.zookeeper.peerport

ZooKeeper節(jié)點(diǎn)使用的端口。詳細(xì)參見(jiàn):http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

默認(rèn): 2888

hbase.zookeeper.leaderport

ZooKeeper用來(lái)選擇Leader的端口,詳細(xì)參見(jiàn):http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper

默認(rèn): 3888

hbase.zookeeper.property.initLimit

ZooKeeper的zoo.conf中的配置。初始化synchronization階段的ticks數(shù)量限制

默認(rèn): 10

hbase.zookeeper.property.syncLimit

ZooKeeper的zoo.conf中的配置。發(fā)送一個(gè)請(qǐng)求到獲得承認(rèn)之間的ticks的數(shù)量限制

默認(rèn): 5

hbase.zookeeper.property.dataDir

ZooKeeper的zoo.conf中的配置。 快照的存儲(chǔ)位置

默認(rèn):${hbase.tmp.dir}/zookeeper

hbase.zookeeper.property.clientPort

ZooKeeper的zoo.conf中的配置??蛻?hù)端連接的端口

默認(rèn): 2181

hbase.zookeeper.property.maxClientCnxns

ZooKeeper的zoo.conf中的配置。 ZooKeeper集群中的單個(gè)節(jié)點(diǎn)接受的單個(gè)Client(以IP區(qū)分)的請(qǐng)求的并發(fā)數(shù)。這個(gè)值可以調(diào)高一點(diǎn),防止在單機(jī)和偽分布式模式中出問(wèn)題。

默認(rèn): 2000

hbase.rest.port

HBase RESTserver的端口

默認(rèn): 8080

hbase.rest.readonly

定義RESTserver的運(yùn)行模式??梢栽O(shè)置成如下的值: false: 所有的HTTP請(qǐng)求都是被允許的 - GET/PUT/POST/DELETE. true:只有GET請(qǐng)求是被允許的

默認(rèn): false

hbase.client.write.buffer
描述:這個(gè)參數(shù)可以設(shè)置寫(xiě)入數(shù)據(jù)緩沖區(qū)的大小,當(dāng)客戶(hù)端和服務(wù)器端傳輸數(shù)據(jù),服務(wù)器為了提高系統(tǒng)運(yùn)行性能開(kāi)辟一個(gè)寫(xiě)的緩沖區(qū)來(lái)處理它,這個(gè)參數(shù)設(shè)置如果設(shè)置的大了,將會(huì)對(duì)系統(tǒng)的內(nèi)存有一定的要求,直接影響系統(tǒng)的性能。

hbasta.thread.rescanfrequency
描述:多長(zhǎng)時(shí)間 HMaster對(duì)系統(tǒng)表 root 和meta掃描一次,這個(gè)參數(shù)可以設(shè)置的長(zhǎng)一些,降低系統(tǒng)的能耗。

hbase.regionserveunt
描述:由于HBase/Hadoop的Server是采用Multiplexed, non-blocking I/O方式而設(shè)計(jì)的,所以它可以透過(guò)一個(gè)Thread來(lái)完成處理,但是由于處理Client端所呼叫的方法是Blocking I/O,所以它的設(shè)計(jì)會(huì)將Client所傳遞過(guò)來(lái)的物件先放置在Queue,并在啟動(dòng)Server時(shí)就先產(chǎn)生一堆Handler(Thread),該Handler會(huì)透過(guò)Polling的方式來(lái)取得該物件并執(zhí)行對(duì)應(yīng)的方法,默認(rèn)為25,根據(jù)實(shí)際場(chǎng)景可以設(shè)置大一些。

hbase.regionserver.thread.splitcompactcheckfrequency
描述:這個(gè)參數(shù)是表示多久去RegionServer服務(wù)器運(yùn)行一次split/compaction的時(shí)間間隔,當(dāng)然split之前會(huì)先進(jìn)行一個(gè)compact操作.這個(gè)compact操作可能是minorcompact也可能是major compact.compact后,會(huì)從所有的Store下的所有StoreFile文件最大的那個(gè)取midkey.這個(gè)midkey可能并不處于全部數(shù)據(jù)的mid中.一個(gè)row-key的下面的數(shù)據(jù)可能會(huì)跨不同的HRegion。

hbase.hregion.max.filesize
描述:HRegion中的HStoreFile最大值,任何表中的列族一旦超過(guò)這個(gè)大小將會(huì)被切分,而HStroeFile的默認(rèn)大小是256M。

hfile.block.cache.size
描述:指定 HFile/StoreFile 緩存在JVM堆中分配的百分比,默認(rèn)值是0.2,意思就是20%,而如果你設(shè)置成0,就表示對(duì)該選項(xiàng)屏蔽。

hbase.zookeeper.property.maxClientCnxns
描述:這項(xiàng)配置的選項(xiàng)就是從zookeeper中來(lái)的,表示ZooKeeper客戶(hù)端同時(shí)訪(fǎng)問(wèn)的并發(fā)連接數(shù),ZooKeeper對(duì)于HBase來(lái)說(shuō)就是一個(gè)入口這個(gè)參數(shù)的值可以適當(dāng)放大些。

hbase.regionservemstore.upperLimit
描述:在Region Server中所有memstores占用堆的大小參數(shù)配置,默認(rèn)值是0.4,表示40%,如果設(shè)置為0,就是對(duì)選項(xiàng)進(jìn)行屏蔽。

hbasmstore.flush.size
描述:Memstore中緩存的內(nèi)容超過(guò)配置的范圍后將會(huì)寫(xiě)到磁盤(pán)上,例如:刪除操作是先寫(xiě)入MemStore里做個(gè)標(biāo)記,指示那個(gè)value, column 或 family等下是要?jiǎng)h除的,HBase會(huì)定期對(duì)存儲(chǔ)文件做一個(gè)major compaction,在那時(shí)HBase會(huì)把MemStore刷入一個(gè)新的HFile存儲(chǔ)文件中。如果在一定時(shí)間范圍內(nèi)沒(méi)有做major compaction,而Memstore中超出的范圍就寫(xiě)入磁盤(pán)上了。

4) HBase中l(wèi)og4j的日志
HBase中日志輸出等級(jí)默認(rèn)狀態(tài)下是把debug、 info 級(jí)別的日志打開(kāi)的,可以根據(jù)自己的需要調(diào)整log級(jí)別,HBase的log4j日志配置文件在 hbase\conf\log4j.properties 目錄下。

五、HBase shell的基本用法

hbase提供了一個(gè)shell的終端給用戶(hù)交互。使用命令hbase shell進(jìn)入命令界面。通過(guò)執(zhí)行 help可以看到命令的幫助信息。

以網(wǎng)上的一個(gè)學(xué)生成績(jī)表的例子來(lái)演示hbase的用法。

namegrad course

mathart

Tom 597 87

Jim 489 80

這里grad對(duì)于表來(lái)說(shuō)是一個(gè)只有它自己的列族,course對(duì)于表來(lái)說(shuō)是一個(gè)有兩個(gè)列的列族,這個(gè)列族由兩個(gè)列組成math和art,當(dāng)然我們可以根據(jù)我們的需要在course中建立更多的列族,如computer,physics等相應(yīng)的列添加入course列族。

1) 建立一個(gè)表和列族

代碼如下:

hbase(main):001:0>create ‘scores','grade', ‘course'

可以使用list命令來(lái)查看當(dāng)前HBase里有哪些表。使用describe命令來(lái)查看表結(jié)構(gòu)。(記得所有的表明、列名都需要加上引號(hào))

2) 按設(shè)計(jì)的表結(jié)構(gòu)插入值:

代碼如下:

put ‘scores','Tom','grade:','5′

put ‘scores','Tom','course:math','97′

put ‘scores','Tom','course:art','87′

put ‘scores','Jim','grade','4′

put ‘scores','Jim','course:','89′

put ‘scores','Jim','course:','80′

這樣表結(jié)構(gòu)就起來(lái)了,其實(shí)比較自由,列族里邊可以自由添加子列很方便。如果列族下沒(méi)有子列,加不加冒號(hào)都是可以的。

put命令比較簡(jiǎn)單,只有這一種用法:

hbase>put ‘t1′, ‘r1′, ‘c1′, ‘value', ts1

t1指表名,r1指行鍵名,c1指列名,value指單元格值。ts1指時(shí)間戳,一般都省略掉了。

3) 根據(jù)鍵值查詢(xún)數(shù)據(jù)

get ‘scores','Jim'

get ‘scores','Jim','grade'

可能你就發(fā)現(xiàn)規(guī)律了,HBase的shell操作,一個(gè)大概順序就是操作關(guān)鍵詞后跟表名,行名,列名這樣的一個(gè)順序,如果有其他條件再用花括號(hào)加上。

get有用法如下:

hbase>get ‘t1′, ‘r1′

hbase>get ‘t1′, ‘r1′, {TIMERANGE => [ts1, ts2]}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′}

hbase>get ‘t1′, ‘r1′, {COLUMN => ['c1', 'c2','c3']}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMERANGE => [ts1, ts2], VERSIONS => 4}

hbase>get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1, VERSIONS => 4}

hbase>get ‘t1′, ‘r1′, ‘c1′

hbase>get ‘t1′, ‘r1′, ‘c1′, ‘c2′

hbase>get ‘t1′, ‘r1′, ['c1', 'c2']

4) 掃描所有數(shù)據(jù)

scan ‘scores'

也可以指定一些修飾詞:TIMERANGE, FILTER, LIMIT,STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。沒(méi)任何修飾詞,就是上邊例句,就會(huì)顯示所有數(shù)據(jù)行。

例句如下:

代碼如下:

hbase>scan ‘.META.'

hbase>scan ‘.META.', {COLUMNS => ‘info:regioninfo'}

hbase>scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT =>10, STARTROW => ‘xyz'}

hbase>scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804, 1303668904]}

hbase>scan ‘t1′, {FILTER => “(PrefixFilter (‘row2′) AND (QualifierFilter (>=, ‘binary:xyz'))) AND (TimestampsFilter ( 123, 456))”}

hbase>scan ‘t1′, {FILTER =>org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}

過(guò)濾器filter有兩種方法指出:

a.Using a filterString –more information on this is available in the

FilterLanguage document attached to the HBASE-4176 JIRA

b.Using the entire package name of the filter.

還有一個(gè)CACHE_BLOCKS修飾詞,開(kāi)關(guān)scan的緩存的,默認(rèn)是開(kāi)啟的(CACHE_BLOCKS=>true),可以選擇關(guān)閉(CACHE_BLOCKS=>false)。

5) 刪除指定數(shù)據(jù)

代碼如下:

delete‘scores','Jim','grade'

delete‘scores','Jim'

刪除數(shù)據(jù)命令也沒(méi)太多變化,只有一個(gè):

hbase>delete ‘t1′, ‘r1′, ‘c1′, ts1

另外有一個(gè)deleteall命令,可以進(jìn)行整行的范圍的刪除操作,慎用!

如果需要進(jìn)行全表刪除操作,就使用truncate命令,其實(shí)沒(méi)有直接的全表刪除命令,這個(gè)命令也是disable,drop,create三個(gè)命令組合出來(lái)的。

6) 修改表結(jié)構(gòu)

代碼如下:

disable‘scores'

alter ‘scores',NAME=>'info'

enable‘scores'

alter命令使用如下(如果無(wú)法成功的版本,需要先通用表disable):

a、改變或添加一個(gè)列族:

hbase>alter ‘t1′, NAME => ‘f1′, VERSIONS => 5

b、刪除一個(gè)列族:

代碼如下:

hbase>alter ‘t1′, NAME => ‘f1′, METHOD => ‘delete'

hbase>alter ‘t1′, ‘delete' => ‘f1′

c、也可以修改表屬性如MAX_FILESIZE

MEMSTORE_FLUSHSIZE,READONLY,和 DEFERRED_LOG_FLUSH:

hbase>alter ‘t1′, METHOD => ‘table_att', MAX_FILESIZE => '134217728′

d、可以添加一個(gè)表協(xié)同處理器

hbase>alter ‘t1′, METHOD => ‘table_att', ‘coprocessor'=> ‘hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2′

一個(gè)表上可以配置多個(gè)協(xié)同處理器,一個(gè)序列會(huì)自動(dòng)增長(zhǎng)進(jìn)行標(biāo)識(shí)。加載協(xié)同處理器(可以說(shuō)是過(guò)濾程序)需要符合以下規(guī)則:

[coprocessorjar file location] | class name | [priority] | [arguments]

e、移除coprocessor如下:

hbase>alter ‘t1′, METHOD => ‘table_att_unset', NAME => ‘MAX_FILESIZE'

hbase>alter ‘t1′, METHOD => ‘table_att_unset', NAME => ‘coprocessor$1′

f、可以一次執(zhí)行多個(gè)alter命令:

hbase>alter ‘t1′, {NAME => ‘f1′}, {NAME => ‘f2′, METHOD => ‘delete'}

7) 統(tǒng)計(jì)行數(shù):

代碼如下:

hbase>count ‘t1′

hbase>count ‘t1′, INTERVAL => 100000

hbase>count ‘t1′, CACHE => 1000

hbase>count ‘t1′, INTERVAL => 10, CACHE => 1000

count一般會(huì)比較耗時(shí),使用mapreduce進(jìn)行統(tǒng)計(jì),統(tǒng)計(jì)結(jié)果會(huì)緩存,默認(rèn)是10行。統(tǒng)計(jì)間隔默認(rèn)的是1000行(INTERVAL)。

8) disable 和 enable 操作

很多操作需要先暫停表的可用性,比如上邊說(shuō)的alter操作,刪除表也需要這個(gè)操作。disable_all和enable_all能夠操作更多的表。

9) 表的刪除

先停止表的可使用性,然后執(zhí)行刪除命令。

drop ‘t1′

以上是一些常用命令詳解,具體的所有hbase的shell命令如下,分了幾個(gè)命令群,看英文是可以看出大概用處的,詳細(xì)的用法使用help “cmd” 進(jìn)行了解。

代碼如下:

COMMANDGROUPS:

Groupname: general

Commands:status, version

Groupname: ddl

Commands:alter, alter_async, alter_status, create, describe, disable, disable_all, drop,drop_all,

enable,enable_all, exists, is_disabled, is_enabled, list, show_filters

Groupname: dml

Commands:count, delete, deleteall, get, get_counter, incr, put, scan, truncate

Groupname: tools

Commands:assign, balance_switch, balancer, close_region, compact, flush, hlog_roll,major_compact,

move,split, unassign, zk_dump

Groupname: replication

Commands:add_peer, disable_peer, enable_peer, list_peers, remove_peer,start_replication,

stop_replication

Groupname: security

Commands:grant, revoke, user_permission

10) hbase shell腳本

既然是shell命令,當(dāng)然也可以把所有的hbase shell命令寫(xiě)入到一個(gè)文件內(nèi),想linux shell腳本程序那樣去順序的執(zhí)行所有命令。如同寫(xiě)linux shell,把所有hbase shell命令書(shū)寫(xiě)在一個(gè)文件內(nèi),然后執(zhí)行如下命令即可:

代碼如下:

$hbase shell test.hbaseshell

六、JAVA操作HBASE方面

1) 連接原理和配置

HBase Master是服務(wù)器負(fù)責(zé)管理所有的HRegion服務(wù)器,HBase Master并不存儲(chǔ)HBase服務(wù)器的任何數(shù)據(jù),HBase邏輯上的表可能會(huì)劃分為多個(gè)HRegion,然后存儲(chǔ)在HRegion Server群中,HBase Master Server中存儲(chǔ)的是從數(shù)據(jù)到HRegion Server的映射。

一臺(tái)機(jī)器只能運(yùn)行一個(gè)HRegion服務(wù)器,數(shù)據(jù)的操作會(huì)記錄在Hlog中,在讀取數(shù)據(jù)時(shí)候,HRegion會(huì)先訪(fǎng)問(wèn)Hmemcache緩存,如果 緩存中沒(méi)有數(shù)據(jù)才回到Hstore中上找,沒(méi)一個(gè)列都會(huì)有一個(gè)Hstore集合,每個(gè)Hstore集合包含了很多具體的HstoreFile文件,這些文 件是B樹(shù)結(jié)構(gòu)的,方便快速讀取。

再看下HBase數(shù)據(jù)物理視圖如下:

Row Key

Timestamp

Column Family

URI

Parser

r1

t3

url=http://www.taobao.com

title=天天特價(jià)

t2

host=taobao.com

t1

r2

t5

url=http://www.alibaba.com

content=每天…

t4

host=alibaba.com

? Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

? Timestamp: 時(shí)間戳,每次數(shù)據(jù)操作對(duì)應(yīng)的時(shí)間戳,可以看作是數(shù)據(jù)的versionnumber

? Column Family:列簇,Table在水平方向有一個(gè)或者多個(gè)Column Family組成,一個(gè)Column Family中可以由任意多個(gè)Column組成,即Column Family支持動(dòng)態(tài)擴(kuò)展,無(wú)需預(yù)先定義Column的數(shù)量以及類(lèi)型,所有Column均以二進(jìn)制格式存儲(chǔ),用戶(hù)需要自行進(jìn)行類(lèi)型轉(zhuǎn)換。

了解了HBase的體系結(jié)構(gòu)和HBase數(shù)據(jù)視圖夠,現(xiàn)在讓我們一起看看怎樣通過(guò)Java來(lái)操作HBase數(shù)據(jù)吧!

先說(shuō)說(shuō)具體的API先,如下

HBaseConfiguration是每一個(gè)hbase client都會(huì)使用到的對(duì)象,它代表的是HBase配置信息。它有兩種構(gòu)造方式:

public HBaseConfiguration()

public HBaseConfiguration(final Configuration c)

默認(rèn)的構(gòu)造方式會(huì)嘗試從hbase-default.xml和hbase-site.xml中讀取配置。如果classpath沒(méi)有這兩個(gè)文件,就需要你自己設(shè)置配置。

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”,“zkServer”);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”,“2181″);

HBaseConfiguration cfg = newHBaseConfiguration(HBASE_CONFIG);

2) 創(chuàng)建表

創(chuàng)建表是通過(guò)HBaseAdmin對(duì)象來(lái)操作的。HBaseAdmin負(fù)責(zé)表的META信息處理。HBaseAdmin提供了createTable這個(gè)方法:

public void createTable(HTableDescriptor desc)

HTableDescriptor 代表的是表的schema, 提供的方法中比較有用的有

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

增加family通過(guò) addFamily方法

public void addFamily(final HColumnDescriptorfamily)

HColumnDescriptor 代表的是column的schema,提供的方法比較常用的有

setTimeToLive:指定最大的TTL,單位是ms,過(guò)期數(shù)據(jù)會(huì)被自動(dòng)刪除。

setInMemory:指定是否放在內(nèi)存中,對(duì)小表有用,可用于提高效率。默認(rèn)關(guān)閉

setBloomFilter:指定是否使用BloomFilter,可提高隨機(jī)查詢(xún)效率。默認(rèn)關(guān)閉

setCompressionType:設(shè)定數(shù)據(jù)壓縮類(lèi)型。默認(rèn)無(wú)壓縮。

setMaxVersions:指定數(shù)據(jù)最大保存的版本個(gè)數(shù)。默認(rèn)為3。

一個(gè)簡(jiǎn)單的例子,創(chuàng)建了4個(gè)family的表:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

HTableDescriptor t = newHTableDescriptor(tableName);

t.addFamily(new HColumnDescriptor(“f1″));

t.addFamily(new HColumnDescriptor(“f2″));

t.addFamily(new HColumnDescriptor(“f3″));

t.addFamily(new HColumnDescriptor(“f4″));

hAdmin.createTable(t);

3) 刪除表

刪除表也是通過(guò)HBaseAdmin來(lái)操作,刪除表之前首先要disable表。這是一個(gè)非常耗時(shí)的操作,所以不建議頻繁刪除表。

disableTable和deleteTable分別用來(lái)disable和delete表。

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

hAdmin.disableTable(tableName);

hAdmin.deleteTable(tableName);

}

4) 查詢(xún)數(shù)據(jù)

查詢(xún)分為單條隨機(jī)查詢(xún)和批量查詢(xún)。

單條查詢(xún)是通過(guò)rowkey在table中查詢(xún)某一行的數(shù)據(jù)。HTable提供了get方法來(lái)完成單條查詢(xún)。

批量查詢(xún)是通過(guò)制定一段rowkey的范圍來(lái)查詢(xún)。HTable提供了個(gè)getScanner方法來(lái)完成批量查詢(xún)。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get對(duì)象包含了一個(gè)Get查詢(xún)需要的信息。它的構(gòu)造方法有兩種:

publicGet(byte [] row)

publicGet(byte [] row, RowLock rowLock)

Rowlock是為了保證讀寫(xiě)的原子性,你可以傳遞一個(gè)已經(jīng)存在Rowlock,否則HBase會(huì)自動(dòng)生成一個(gè)新的rowlock。

Scan對(duì)象提供了默認(rèn)構(gòu)造函數(shù),一般使用默認(rèn)構(gòu)造函數(shù)。

Get/Scan的常用方法有:

addFamily/addColumn:指定需要的family或者column,如果沒(méi)有調(diào)用任何addFamily或者Column,會(huì)返回所有的columns.

setMaxVersions:指定最大的版本個(gè)數(shù)。如果不帶任何參數(shù)調(diào)用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只會(huì)取到最新的版本。

setTimeRange:指定最大的時(shí)間戳和最小的時(shí)間戳,只有在此范圍內(nèi)的cell才能被獲取。

setTimeStamp:指定時(shí)間戳。

setFilter:指定Filter來(lái)過(guò)濾掉不需要的信息

Scan特有的方法:

setStartRow:指定開(kāi)始的行。如果不調(diào)用,則從表頭開(kāi)始。

setStopRow:指定結(jié)束的行(不含此行)。

setBatch:指定最多返回的Cell數(shù)目。用于防止一行中有過(guò)多的數(shù)據(jù),導(dǎo)致OutofMemory錯(cuò)誤。

ResultScanner是Result的一個(gè)容器,每次調(diào)用ResultScanner的next方法,會(huì)返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throwsIOException;

Result代表是一行的數(shù)據(jù)。常用方法有:

getRow:返回rowkey

raw:返回所有的key value數(shù)組。

getValue:按照column來(lái)獲取cell的值

Example:

Scan s = new Scan();

s.setMaxVersions();

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

System.out.println(new String(r.getRow()));

for(KeyValue kv:r.raw()){

System.out.println(newString(kv.getColumn()));

}

}

5) 插入數(shù)據(jù)

HTable通過(guò)put方法來(lái)插入數(shù)據(jù)。

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

可以傳遞單個(gè)批Put對(duì)象或者List put對(duì)象來(lái)分別實(shí)現(xiàn)單條插入和批量插入。

Put提供了3種構(gòu)造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy)

Put常用的方法有:

add:增加一個(gè)Cell

setTimeStamp:指定所有cell默認(rèn)的timestamp,如果一個(gè)Cell沒(méi)有指定timestamp,就會(huì)用到這個(gè)值。如果沒(méi)有調(diào)用,HBase會(huì)將當(dāng)前時(shí)間作為未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的縮寫(xiě),指的是HBase在插入操作前是否寫(xiě)Log。默認(rèn)是打開(kāi),關(guān)掉會(huì)提高性能,但是如果系統(tǒng)出現(xiàn)故障(負(fù)責(zé)插入的Region Server掛掉),數(shù)據(jù)可能會(huì)丟失。

另外HTable也有兩個(gè)方法也會(huì)影響插入的性能

setAutoFlash: AutoFlush指的是在每次調(diào)用HBase的Put操作,是否提交到HBase Server。默認(rèn)是true,每次會(huì)提交。如果此時(shí)是單條插入,就會(huì)有更多的IO,從而降低性能.

setWriteBufferSize: Write Buffer Size在AutoFlush為false的時(shí)候起作用,默認(rèn)是2MB,也就是當(dāng)插入數(shù)據(jù)超過(guò)2MB,就會(huì)自動(dòng)提交到Server

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

Put p= new Put(String.format(“row%09d”,i).getBytes());

r.nextBytes(buffer);

p.add(“f1″.getBytes(), null, buffer);

p.add(“f2″.getBytes(), null, buffer);

p.add(“f3″.getBytes(), null, buffer);

p.add(“f4″.getBytes(),null, buffer);

p.setWriteToWAL(wal);

lp.add(p);

if(i%1000==0){

table.put(lp);

lp.clear();

}

}

6) 刪除數(shù)據(jù)

HTable 通過(guò)delete方法來(lái)刪除數(shù)據(jù)。

public voiddelete(final Delete delete)

Delete構(gòu)造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLockrowLock)

public Delete(final Delete d)

Delete常用方法有

deleteFamily/deleteColumns:指定要?jiǎng)h除的family或者column的數(shù)據(jù)。如果不調(diào)用任何這樣的方法,將會(huì)刪除整行。

注意:如果某個(gè)Cell的timestamp高于當(dāng)前時(shí)間,這個(gè)Cell將不會(huì)被刪除,仍然可以查出來(lái)。

Example:

HTable table = new HTable(hbaseConfig, “mytest”);

Delete d = new Delete(“row1″.getBytes());

table.delete(d)

7) 切分表

HBaseAdmin提供split方法來(lái)將table 進(jìn)行split.

public void split(final StringtableNameOrRegionName)

如果提供的tableName,那么會(huì)將table所有region進(jìn)行split ;如果提供的regionName,那么只會(huì)split這個(gè)region.

由于split是一個(gè)異步操作,我們并不能確切的控制region的個(gè)數(shù)。

Example:

public void split(String tableName,int number,inttimeout) throws Exception {

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”, GlobalConf.ZOOKEEPER_QUORUM);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”,GlobalConf.ZOOKEEPER_PORT);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

HBaseAdmin hAdmin = new HBaseAdmin(cfg);

HTablehTable = new HTable(cfg,tableName);

intoldsize = 0;

t = System.currentTimeMillis();

while(true){

intsize = hTable.getRegionsInfo().size();

logger.info(“the region number=”+size);

if(size>=number ) break;

if(size!=oldsize){

hAdmin.split(hTable.getTableName());

oldsize = size;

} elseif(System.currentTimeMillis()-t>timeout){

break;

}

Thread.sleep(1000*10);

}

}

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)??戳诉@個(gè),就不用

工作中我自己總結(jié)的hbase文檔,供初學(xué)者學(xué)習(xí)。看了這個(gè),就不用:HBase配置和使用文檔 HBase配置和使用文檔...................................................................................................... 1 一、 HBase原理和結(jié)構(gòu)說(shuō)明............................
推薦度:
標(biāo)簽: 文件 文檔 學(xué)習(xí)
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top