HBase配置和使用文檔 HBase配置和使用文檔...................................................................................................... 1 一、 HBase原理和結(jié)構(gòu)說(shuō)明.......................................................................
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是一個(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以表的形式存儲(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)求者。
這些名詞的具體含義如下:
與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í)的行為。
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ù))。
HBase中通過(guò)row和columns確定的為一個(gè)存貯單元稱(chēng)為cell。由{row key, column( =
每個(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è)置。
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
首先安裝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添加到這里面.
創(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
$tarzxvfhadoop-0.18.2.tar.gz
這樣做會(huì)在/home/hadoop目錄下解壓hadoop發(fā)行包并創(chuàng)建到/home/hadoop/hadoop。
/bin/start-hbase.sh
/bin/stop-hbase.sh
必須配置的參數(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ī)名的配置。
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è)文件夾,例如:
同樣你也可以指定你的分布式文件系統(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提供了一個(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列族。
代碼如下:
hbase(main):001:0>create ‘scores','grade', ‘course'
可以使用list命令來(lái)查看當(dāng)前HBase里有哪些表。使用describe命令來(lái)查看表結(jié)構(gòu)。(記得所有的表明、列名都需要加上引號(hào))
代碼如下:
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í)間戳,一般都省略掉了。
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']
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)。
代碼如下:
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)的。
代碼如下:
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'}
代碼如下:
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)。
很多操作需要先暫停表的可用性,比如上邊說(shuō)的alter操作,刪除表也需要這個(gè)操作。disable_all和enable_all能夠操作更多的表。
先停止表的可使用性,然后執(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
既然是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
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);
創(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);
刪除表也是通過(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);
}
查詢(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()));
}
}
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();
}
}
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)
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