Base配置和使用文檔...................................................................................................... 1
一、 HBase原理和結構說明............................................................................................. 2
二、 HBase的表結構....................................................................................................... 2
1) Row Key............................................................................................................... 3
2) 列族 column family.............................................................................................. 4
3) 單元 Cell............................................................................................................. 4
4) 時間戳 timestamp................................................................................................. 4
三、 HBASe單機配置...................................................................................................... 5
2) 使用root身份登錄目標服務器系統(Suse10Linux).................................................. 5
3) 創建hadoop用戶,$useraddhadoop可以用$passwdhadoop修改hadoop用戶的登錄密碼. 5
4) 解壓hadoop:......................................................................................................... 6
5) 配置hbase-site.xml文件........................................................................................ 6
6) 啟動和關閉.......................................................................................................... 7
7) 說明..................................................................................................................... 7
四、 Hbase配置解釋........................................................................................................ 8
1) 修改linux 系統參數 Linux系統最大可打開文件數一般默認的參數值是1024,如果你不進行修改並發量上來的時候會出現“TooMany Open Files”的錯誤,導致整個HBase不可運行,你可以用ulimit-n 命令進行修改,或者修改/etc/security/limits.conf 和/proc/sys/fs/file-max 的參數,具體如何修改可以去Google 關鍵字 “linux limits.conf ”........................................................................................................ 8
2) JVM 配置 修改hbase-env.sh 文件中的配置參數,根據你的機器硬件和當前操作系統的JVM(32/64位)配置適當的參數 HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小 HBASE_OPTS "‐server ‐XX:+UseConcMarkSweepGC"JVMGC 選項 HBASE_MANAGES_ZKfalse 是否使用Zookeeper進行分布式管理 8
3) 配置HBase運行參數 hbase.rootdir.................................................................. 9
五、 HBase shell的基本用法........................................................................................... 23
1) 建立一個表和列族.............................................................................................. 23
2) 按設計的表結構插入值:.................................................................................... 24
3) 根據鍵值查詢數據.............................................................................................. 24
4) 掃描所有數據..................................................................................................... 25
5) 刪除指定數據..................................................................................................... 25
6) 修改表結構......................................................................................................... 26
7) 統計行數:......................................................................................................... 27
8) disable 和 enable 操作........................................................................................ 27
9) 表的刪除............................................................................................................ 27
10) hbase shell腳本.................................................................................................. 28
六、 JAVA操作HBASE方面......................................................................................... 28
1) 連接原理和配置.................................................................................................. 28
2) 創建表................................................................................................................ 30
3) 刪除表................................................................................................................ 31
4) 查詢數據............................................................................................................ 31
5) 插入數據............................................................................................................ 33
6) 刪除數據............................................................................................................ 34
7) 切分表................................................................................................................ 35
一、HBase原理和結構說明
HBase是一個分布式的、面向列的開源數據庫,源於google的一篇論文《bigtable:一個結構化數據的分布式存儲系統》
HBase是Google Bigtable的開源實現,它利用Hadoop HDFS作為其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作為協同服務。
二、HBase的表結構
HBase以表的形式存儲數據。表有行和列組成。列划分為若干個列族/列簇(column family)。
實際情況為:
如上圖所示,key1,key2,key3是三條記錄的唯一的row key值,column-family1,column-family2,column-family3是三個列族,每個列族下又包括幾列。比如column-family1這個列族下包括兩列,名字是column1和column2,t1:abc,t2:gdxdf是由rowkey1和column-family1-column1唯一確定的一個單元cell。這個cell中有兩個數據,abc和gdxdf。兩個值的時間戳不一樣,分別是t1,t2, hbase會返回最新時間的值給請求者。
這些名詞的具體含義如下:
1) Row Key
與nosql數據庫們一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式:
(1.1) 通過單個row key訪問
(1.2) 通過row key的range
(1.3) 全表掃描
Rowkey行鍵 (Row key)可以是任意字符串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),在hbase內部,row key保存為字節數組。
存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)
注意:
字典序對int排序的結果是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作左填充。
行的一次讀寫是原子操作 (不論一次讀寫多少列)。這個設計決策能夠使用戶很容易的理解程序在對同一個行進行並發更新操作時的行為。
2) 列族 column family
hbase表中的每個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如courses:history , courses:math 都屬於courses 這個列族。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。實際應用中,列族上的控制權限能幫助我們管理不同類型的應用:我們允許一些應用可以添加新的基本數據、一些應用可以讀取基本數據並創建繼承的列族、一些應用則只允許瀏覽數據(甚至可能因為隱私的原因不能瀏覽所有數據)。
3) 單元 Cell
HBase中通過row和columns確定的為一個存貯單元稱為cell。由{row key, column( =<family> + <label>), version} 唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存貯。
4) 時間戳 timestamp
每個cell都保存着同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,hbase提供了兩種數據版本回收方式。一是保存數據的最后n個版本,二是保存最近一段時間內的版本(比如最近七天)。用戶可以針對每個列族進行設置。
三、HBASe單機配置
1) 下載
在Apache/Hadoop項目的網站(hadoop.apache.org/)下載hadoophbase發行包,此處兩個發行包的大版本號一定要一致,譬如都是0.18版本:hadoop-0.18.2.tar.gzhbase-0.18.1.tar.gz
2) 使用root身份登錄目標服務器系統(Suse10Linux)
首先安裝java虛擬機,這個比較簡單,隨便找個綠色的解壓就可以了,在這個例子里面我使用IBMWAS6.1附帶的jdk,它的home目錄是/opt/IBM/WebSphere/AppServer/java,我們只需要配置系統的環境變量就可以了.
編輯全局環境變量文件/etc/profile,在文件后面添加
exportJAVA_HOME=/opt/IBM/WebSphere/AppServer/java
exportPATH=$JAVA_HOME:$PATH
保存profile文件后使用$source/etc/profile命令重新加載profile,然后隨便在一個目錄下面運行$java-version查看javahome環境變量和path變量是否被正確加載.
另外到/etc/hosts文件中查看主機映射是否存在,例如127.0.0.1localhost或者什么其他的名字,在這里默認配置本機為localhost,如果需要做分布式的話,本機要做namenode,所以要把所有的datanode的host添加到這里面.
3) 創建hadoop用戶,$useraddhadoop可以用$passwdhadoop修改hadoop用戶的登錄密碼.
創建hadoop用戶的home目錄,如果打算在別處安裝hadoop/hbase的話可以不這樣做,這里我們默認將hadoophbase安裝在/home/${username}目錄下.
$cd/home
$mkdirhadoop
將目錄用戶指派給hadoop
$chownhadoophadoop
改變目錄權限,這里我們配大一些,其實只要644就足夠了:
$chmod755hadoop
使用hadoop用戶登錄系統,將下載的兩個發行包文件傳到/home/hadoop目錄下面,然后給它們加上執行權限:
$chmoda+xhadoop-0.18.2.tar.gz
$chmoda+xhbase-0.18.1.tar.gz
4) 解壓hadoop:
$tarzxvfhadoop-0.18.2.tar.gz
這樣做會在/home/hadoop目錄下解壓hadoop發行包並創建到/home/hadoop/hadoop。
5) 配置hbase-site.xml文件
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///home/data/hbase</value>
</property>
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>com.avos.uluru.hbase.AggrEndPoint</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>10.5.31.10</value>
</property>
<property>
<name>zookeeper.session.timeout</name>
<value>60000</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.regionserver.dns.nameserver</name>
<value>test.hbase.com</value>
</property>
<property>
<name>hbase.master.dns.interface</name>
<value>em3</value>
</property>
</configuration>
6) 啟動和關閉
/bin/start-hbase.sh
/bin/stop-hbase.sh
7) 說明
必須配置的參數:
Hbase.zookeeper.quorum 本機的IP地址,不能為localhost或127.0.0.1,否則不能遠程鏈接。
Hbase.master.dns.interface 為master綁定的網卡,多網卡的服務器必須配置,否則默認綁定到虛擬的輪回網卡,不配置不能遠程鏈接。
ZooKeeper服務不認Ip,只認主機名,因此需要在/etc/hosts文件里增加一個ZooKeeper服務的IP地址與本機主機名的配置。如:10.5.31.10 amber-mts
如果不配置,Zookerper會綁定到locahost的主機名,遠程就不能鏈接。
遠程調用客戶端也需要配置本機的DNS,在c:\windows\system32\driver\etc\host文件里增加Zookerper的Ip與主機名的配置。
四、Hbase配置解釋
1) 修改linux 系統參數
Linux系統最大可打開文件數一般默認的參數值是1024,如果你不進行修改並發量上來的時候會出現“Too Many Open Files”的錯誤,導致整個HBase不可運行,你可以用ulimit -n 命令進行修改,或者修改/etc/security/limits.conf和/proc/sys/fs/file-max 的參數,具體如何修改可以去Google 關鍵字“linux limits.conf ”
2) JVM 配置
修改 hbase-env.sh 文件中的配置參數,根據你的機器硬件和當前操作系統的JVM(32/64位)配置適當的參數
HBASE_HEAPSIZE 4000 HBase使用的 JVM 堆的大小
HBASE_OPTS "‐server‐XX:+UseConcMarkSweepGC"JVMGC 選項
HBASE_MANAGES_ZKfalse 是否使用Zookeeper進行分布式管理
HBase持久化
重啟操作系統后HBase中數據全無,你可以不做任何修改的情況下,創建一張表,寫一條數據進行,然后將機器重啟,重啟后你再進入HBase的shell中使用 list 命令查看當前所存在的表,一個都沒有了。是不是很杯具?沒有關系你可以在hbase/conf/hbase-default.xml中設置hbase.rootdir的值,來設置文件的保存位置指定一個文件夾,例如:<value>file:///you/hbase-data/path</value>,你建立的HBase中的表和數據就直接寫到了你的磁盤上,如圖所示:
同樣你也可以指定你的分布式文件系統HDFS的路徑例如:hdfs://NAMENODE_SERVER:PORT/HBASE_ROOTDIR,這樣就寫到了你的分布式文件系統上了。
3) 配置HBase運行參數
hbase.rootdir
這個目錄是region server的共享目錄,用來持久化Hbase。URL需要是'完全正確'的,還要包含文件系統的scheme。例如,要表示hdfs中的'/hbase'目錄,namenode 運行在namenode.example.org的9090端口。則需要設置為hdfs://namenode.example.org:9000 /hbase。默認情況下Hbase是寫到/tmp的。不改這個配置,數據會在重啟的時候丟失。
默認:file:///tmp/hbase-${user.name}/hbase
hbase.master.port
Hbase的Master的端口.
默認: 60000
hbase.cluster.distributed
Hbase的運行模式。false是單機模式,true是分布式模式。若為false,Hbase和Zookeeper會運行在同一個JVM里面。
默認: false
hbase.tmp.dir
本地文件系統的臨時文件夾。可以修改到一個更為持久的目錄上。(/tmp會在重啟時清楚)
默認:/tmp/hbase-${user.name}
hbase.master.info.port
HBase Master web界面端口. 設置為-1 意味着你不想讓他運行。
默認: 60010
hbase.master.info.bindAddress
HBase Master web界面綁定的端口
默認:0.0.0.0
hbase.client.write.buffer
HTable 客戶端的寫緩沖的默認大小。這個值越大,需要消耗的內存越大。因為緩沖在客戶端和服務端都有實例,所以需要消耗客戶端和服務端兩個地方的內存。得到的好處是,可以減少RPC的次數。可以這樣估算服務器端被占用的內存:hbase.client.write.buffer * hbase.regionserver.handler.count
默認:2097152
hbase.regionserver.port
HBaseRegionServer綁定的端口
默認: 60020
hbase.regionserver.info.port
HBaseRegionServer web 界面綁定的端口 設置為 -1 意味這你不想與運行RegionServer 界面.
默認: 60030
hbase.regionserver.info.port.auto
Master或RegionServer是否要動態搜一個可以用的端口來綁定界面。當hbase.regionserver.info.port已經被占用的時候,可以搜一個空閑的端口綁定。這個功能在測試的時候很有用。默認關閉。
默認: false
hbase.regionserver.info.bindAddress
HBaseRegionServer web 界面的IP地址
默認:0.0.0.0
hbase.regionserver.class
RegionServer 使用的接口。客戶端打開代理來連接region server的時候會使用到。
默認:org.apache.hadoop.hbase.ipc.HRegionInterface
hbase.client.pause
通常的客戶端暫停時間。最多的用法是客戶端在重試前的等待時間。比如失敗的get操作和region查詢操作等都很可能用到。
默認: 1000
hbase.client.retries.number
最大重試次數。例如region查詢,Get操作,Update操作等等都可能發生錯誤,需要重試。這是最大重試錯誤的值。
默認: 10
hbase.client.scanner.caching
當 調用Scanner的next方法,而值又不在緩存里的時候,從服務端一次獲取的行數。越大的值意味着Scanner會快一些,但是會占用更多的內存。當緩沖被占滿的時候,next方法調用會越來越慢。慢到一定程度,可能會導致超時。例如超過了 hbase.regionserver.lease.period。
默認: 1
hbase.client.keyvalue.maxsize
一 個KeyValue實例的最大size.這個是用來設置存儲文件中的單個entry的大小上界。因為一個KeyValue是不能分割的,所以可以避免因為 數據過大導致region不可分割。明智的做法是把它設為可以被最大region size整除的數。如果設置為0或者更小,就會禁用這個檢查。默認10MB。
默認:10485760
hbase.regionserver.lease.period
客戶端租用HRegionserver 期限,即超時閥值。單位是毫秒。默認情況下,客戶端必須在這個時間內發一條信息,否則視為死掉。
默認: 60000
hbase.regionserver.handler.count
RegionServers受理的RPCServer實例數量。對於Master來說,這個屬性是Master受理的handler數量
默認: 10
hbase.regionserver.msginterval
RegionServer 發消息給Master 時間間隔,單位是毫秒
默認: 3000
hbase.regionserver.optionallogflushinterval
將Hlog同步到HDFS的間隔。如果Hlog沒有積累到一定的數量,到了時間,也會觸發同步。默認是1秒,單位毫秒。
默認: 1000
hbase.regionserver.regionSplitLimit
region的數量到了這個值后就不會在分裂了。這不是一個region數量的硬性限制。但是起到了一定指導性的作用,到了這個值就該停止分裂了。默認是MAX_INT.就是說不阻止分裂。
默認:2147483647
hbase.regionserver.logroll.period
提交commitlog的間隔,不管有沒有寫足夠的值。
默認:3600000
hbase.regionserver.hlog.reader.impl
HLog file reader的實現.
默認:org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogReader
hbase.regionserver.hlog.writer.impl
HLog file writer的實現.
默認:org.apache.hadoop.hbase.regionserver.wal.SequenceFileLogWriter
hbase.regionserver.thread.splitcompactcheckfrequency
region server 多久執行一次split/compaction檢查.
默認: 20000
hbase.regionserver.nbreservationblocks
儲備的內存block的數量(譯者注:就像石油儲備一樣)。當發生out of memory 異常的時候,我們可以用這些內存在RegionServer停止之前做清理操作。
默認: 4
hbase.zookeeper.dns.interface
當使用DNS的時候,Zookeeper用來上報的IP地址的網絡接口名字。
默認: default
hbase.zookeeper.dns.nameserver
當使用DNS的時候,Zookeepr使用的DNS的域名或者IP地址,Zookeeper用它來確定和master用來進行通訊的域名.
默認:default
hbase.regionserver.dns.interface
當使用DNS的時候,RegionServer用來上報的IP地址的網絡接口名字。
默認:default
hbase.regionserver.dns.nameserver
當使用DNS的時候,RegionServer使用的DNS的域名或者IP 地址,RegionServer用它來確定和master用來進行通訊的域名.
默認:default
hbase.master.dns.interface
當使用DNS的時候,Master用來上報的IP地址的網絡接口名字。
默認:default
hbase.master.dns.nameserver
當使用DNS的時候,RegionServer使用的DNS的域名或者IP 地址,Master用它來確定用來進行通訊的域名.
默認:default
hbase.balancer.period
Master執行regionbalancer的間隔。
默認: 300000
hbase.regions.slop
當任一regionserver有average + (average * slop)個region是會執行Rebalance
默認: 0
hbase.master.logcleaner.ttl
Hlog存在於.oldlogdir文件夾的最長時間, 超過了就會被 Master 的線程清理掉.
默認: 600000
hbase.master.logcleaner.plugins
LogsCleaner 服務會執行的一組LogCleanerDelegat。值用逗號間隔的文本表示。這些WAL/HLog cleaners會按順序調用。可以把先調用的放在前面。你可以實現自己的LogCleanerDelegat,加到Classpath下,然后在這里寫下類的全稱。一般都是加在默認值的前面。
默認:org.apache.hadoop.hbase.master.TimeToLiveLogCleaner
hbase.regionserver.global.memstore.upperLimit
單個regionserver的全部memtores的最大值。超過這個值,一個新的update操作會被掛起,強制執行flush操作。
默認: 0.4
hbase.regionserver.global.memstore.lowerLimit
當強制執行flush操作的時候,當低於這個值的時候,flush會停止。默認是堆大小的 35% . 如果這個值和hbase.regionserver.global.memstore.upperLimit 相同就意味着當update操作因為內存限制被掛起時,會盡量少的執行flush(譯者注:一旦執行flush,值就會比下限要低,不再執行)
默認: 0.35
hbase.server.thread.wakefrequency
service工作的sleep間隔,單位毫秒。可以作為service線程的sleep間隔,比如log roller.
默認: 10000
hbase.hregion.memstore.flush.size
當memstore的大小超過這個值的時候,會flush到磁盤。這個值被一個線程每隔hbase.server.thread.wakefrequency檢查一下。
默認:67108864
hbase.hregion.preclose.flush.size
當一個region中的memstore的大小大於這個值的時候,我們又觸發了close.會先運行“pre-flush”操作,清理這個需要關閉的 memstore,然后將這個region下線。當一個region下線了,我們無法再進行任何寫操作。如果一個memstore很大的時候,flush 操作會消耗很多時間。"pre-flush"操作意味着在region下線之前,會先把memstore清空。這樣在最終執行close操作的時 候,flush操作會很快。
默認:5242880
hbase.hregion.memstore.block.multiplier
如果memstore有hbase.hregion.memstore.block.multiplier倍數的hbase.hregion.flush.size的大小,就會阻塞update操作。這是為了預防在update高峰期會導致的失控。如果不設上 界,flush的時候會花很長的時間來合並或者分割,最壞的情況就是引發out of memory異常。(譯者注:內存操作的速度和磁盤不匹配,需要等一等。原文似乎有誤)
默認: 2
hbase.hregion.memstore.mslab.enabled
體驗特性:啟用memStore分配本地緩沖區。這個特性是為了防止在大量寫負載的時候堆的碎片過多。這可以減少GC操作的頻率。(GC有可能會Stopthe world)(譯者注:實現的原理相當於預分配內存,而不是每一個值都要從堆里分配)
默認: false
hbase.hregion.max.filesize
最大HStoreFile大小。若某個Column families的HStoreFile增長達到這個值,這個Hegion會被切割成兩個。 Default: 256M.
默認:268435456
hbase.hstore.compactionThreshold
當一個HStore含有多於這個值的HStoreFiles(每一個memstore flush產生一個HStoreFile)的時候,會執行一個合並操作,把這HStoreFiles寫成一個。這個值越大,需要合並的時間就越長。
默認: 3
hbase.hstore.blockingStoreFiles
當一個HStore含有多於這個值的HStoreFiles(每一個memstore flush產生一個HStoreFile)的時候,會執行一個合並操作,update會阻塞直到合並完成,直到超過了hbase.hstore.blockingWaitTime的值
默認: 7
hbase.hstore.blockingWaitTime
hbase.hstore.blockingStoreFiles所限制的StoreFile數量會導致update阻塞,這個時間是來限制阻塞時間的。當超過了這個時間,HRegion會停止阻塞update操作,不過合並還有沒有完成。默認為90s.
默認: 90000
hbase.hstore.compaction.max
每個“小”合並的HStoreFiles最大數量。
默認: 10
hbase.hregion.majorcompaction
一個Region中的所有HStoreFile的major compactions的時間間隔。默認是1天。 設置為0就是禁用這個功能。
默認:86400000
hbase.mapreduce.hfileoutputformat.blocksize
MapReduce 中HFileOutputFormat可以寫 storefiles/hfiles. 這個值是hfile的blocksize的最小值。通常在Hbase寫Hfile的時候,bloocksize是由table schema(HColumnDescriptor)決定的,但是在mapreduce寫的時候,我們無法獲取schema中blocksize。這個值 越小,你的索引就越大,你隨機訪問需要獲取的數據就越小。如果你的cell都很小,而且你需要更快的隨機訪問,可以把這個值調低。
默認: 65536
hfile.block.cache.size
分配給HFile/StoreFile的block cache占最大堆(-Xmx setting)的比例。默認是20%,設置為0就是不分配。
默認: 0.2
hbase.hash.type
哈希函數使用的哈希算法。可以選擇兩個值:: murmur (MurmurHash) 和 jenkins(JenkinsHash). 這個哈希是給 bloom filters用的.
默認: murmur
hbase.master.keytab.file
HMaster server驗證登錄使用的kerberoskeytab 文件路徑。(譯者注:Hbase使用Kerberos實現安全)
默認:
hbase.master.kerberos.principal
例如."hbase/_HOST@EXAMPLE.COM". HMaster運行需要使用 kerberos principal name. principal name 可以在:user/hostname@DOMAIN 中獲取. 如果"_HOST" 被用做hostname portion,需要使用實際運行的hostname來替代它。
默認:
hbase.regionserver.keytab.file
HRegionServer驗證登錄使用的kerberoskeytab 文件路徑。
默認:
hbase.regionserver.kerberos.principal
例如."hbase/_HOST@EXAMPLE.COM". HRegionServer運行需要使用 kerberos principalname. principal name 可以在: user/hostname@DOMAIN 中獲取. 如果 "_HOST" 被用做hostname portion,需要使用實際運行的hostname來替代它。在這個文件中必須要有一個entry來描述 hbase.regionserver.keytab.file
默認:
zookeeper.session.timeout
ZooKeeper 會話超時.Hbase把這個值傳遞改zk集群,向他推薦一個會話的最大超時時間。詳見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. "。 單位是毫秒
默認: 180000
zookeeper.znode.parent
ZooKeeper中的Hbase的根ZNode。所有的Hbase的ZooKeeper會用這個目錄配置相對路徑。默認情況下,所有的Hbase的ZooKeeper文件路徑是用相對路徑,所以他們會都去這個目錄下面。
默認: /hbase
zookeeper.znode.rootserver
ZNode 保存的 根region的路徑. 這個值是由Master來寫,client和regionserver 來讀的。如果設為一個相對地址,父目錄就是 ${zookeeper.znode.parent}.默認情形下,意味着根region的路徑存儲在/hbase/root-region- server.
默認:root-region-server
hbase.zookeeper.quorum
Zookeeper 集群的地址列表,用逗號分割。例 如:"host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".默認是 localhost,是給偽分布式用的。要修改才能在完全分布式的情況下使用。如果在hbase-env.sh設置了HBASE_MANAGES_ZK, 這些ZooKeeper節點就會和Hbase一起啟動。
默認:localhost
hbase.zookeeper.peerport
ZooKeeper節點使用的端口。詳細參見:http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper
默認: 2888
hbase.zookeeper.leaderport
ZooKeeper用來選擇Leader的端口,詳細參見:http://hadoop.apache.org/zookeeper/docs/r3.1.1/zookeeperStarted.html#sc_RunningReplicatedZooKeeper
默認: 3888
hbase.zookeeper.property.initLimit
ZooKeeper的zoo.conf中的配置。初始化synchronization階段的ticks數量限制
默認: 10
hbase.zookeeper.property.syncLimit
ZooKeeper的zoo.conf中的配置。發送一個請求到獲得承認之間的ticks的數量限制
默認: 5
hbase.zookeeper.property.dataDir
ZooKeeper的zoo.conf中的配置。 快照的存儲位置
默認:${hbase.tmp.dir}/zookeeper
hbase.zookeeper.property.clientPort
ZooKeeper的zoo.conf中的配置。客戶端連接的端口
默認: 2181
hbase.zookeeper.property.maxClientCnxns
ZooKeeper的zoo.conf中的配置。 ZooKeeper集群中的單個節點接受的單個Client(以IP區分)的請求的並發數。這個值可以調高一點,防止在單機和偽分布式模式中出問題。
默認: 2000
hbase.rest.port
HBase RESTserver的端口
默認: 8080
hbase.rest.readonly
定義RESTserver的運行模式。可以設置成如下的值: false: 所有的HTTP請求都是被允許的 - GET/PUT/POST/DELETE. true:只有GET請求是被允許的
默認: false
hbase.client.write.buffer
描述:這個參數可以設置寫入數據緩沖區的大小,當客戶端和服務器端傳輸數據,服務器為了提高系統運行性能開辟一個寫的緩沖區來處理它,這個參數設置如果設置的大了,將會對系統的內存有一定的要求,直接影響系統的性能。
hbasta.thread.rescanfrequency
描述:多長時間 HMaster對系統表 root 和meta掃描一次,這個參數可以設置的長一些,降低系統的能耗。
hbase.regionserveunt
描述:由於HBase/Hadoop的Server是采用Multiplexed, non-blocking I/O方式而設計的,所以它可以透過一個Thread來完成處理,但是由於處理Client端所呼叫的方法是Blocking I/O,所以它的設計會將Client所傳遞過來的物件先放置在Queue,並在啟動Server時就先產生一堆Handler(Thread),該Handler會透過Polling的方式來取得該物件並執行對應的方法,默認為25,根據實際場景可以設置大一些。
hbase.regionserver.thread.splitcompactcheckfrequency
描述:這個參數是表示多久去RegionServer服務器運行一次split/compaction的時間間隔,當然split之前會先進行一個compact操作.這個compact操作可能是minorcompact也可能是major compact.compact后,會從所有的Store下的所有StoreFile文件最大的那個取midkey.這個midkey可能並不處於全部數據的mid中.一個row-key的下面的數據可能會跨不同的HRegion。
hbase.hregion.max.filesize
描述:HRegion中的HStoreFile最大值,任何表中的列族一旦超過這個大小將會被切分,而HStroeFile的默認大小是256M。
hfile.block.cache.size
描述:指定 HFile/StoreFile 緩存在JVM堆中分配的百分比,默認值是0.2,意思就是20%,而如果你設置成0,就表示對該選項屏蔽。
hbase.zookeeper.property.maxClientCnxns
描述:這項配置的選項就是從zookeeper中來的,表示ZooKeeper客戶端同時訪問的並發連接數,ZooKeeper對於HBase來說就是一個入口這個參數的值可以適當放大些。
hbase.regionservemstore.upperLimit
描述:在Region Server中所有memstores占用堆的大小參數配置,默認值是0.4,表示40%,如果設置為0,就是對選項進行屏蔽。
hbasmstore.flush.size
描述:Memstore中緩存的內容超過配置的范圍后將會寫到磁盤上,例如:刪除操作是先寫入MemStore里做個標記,指示那個value, column 或 family等下是要刪除的,HBase會定期對存儲文件做一個major compaction,在那時HBase會把MemStore刷入一個新的HFile存儲文件中。如果在一定時間范圍內沒有做major compaction,而Memstore中超出的范圍就寫入磁盤上了。
4) HBase中log4j的日志
HBase中日志輸出等級默認狀態下是把debug、 info 級別的日志打開的,可以根據自己的需要調整log級別,HBase的log4j日志配置文件在 hbase\conf\log4j.properties 目錄下。
五、HBase shell的基本用法
hbase提供了一個shell的終端給用戶交互。使用命令hbase shell進入命令界面。通過執行 help可以看到命令的幫助信息。
以網上的一個學生成績表的例子來演示hbase的用法。
namegrad course
mathart
Tom 597 87
Jim 489 80
這里grad對於表來說是一個只有它自己的列族,course對於表來說是一個有兩個列的列族,這個列族由兩個列組成math和art,當然我們可以根據我們的需要在course中建立更多的列族,如computer,physics等相應的列添加入course列族。
1) 建立一個表和列族
復制代碼 代碼如下:
hbase(main):001:0>create ‘scores','grade', ‘course'
可以使用list命令來查看當前HBase里有哪些表。使用describe命令來查看表結構。(記得所有的表明、列名都需要加上引號)
2) 按設計的表結構插入值:
復制代碼 代碼如下:
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′
這樣表結構就起來了,其實比較自由,列族里邊可以自由添加子列很方便。如果列族下沒有子列,加不加冒號都是可以的。
put命令比較簡單,只有這一種用法:
hbase>put ‘t1′, ‘r1′, ‘c1′, ‘value', ts1
t1指表名,r1指行鍵名,c1指列名,value指單元格值。ts1指時間戳,一般都省略掉了。
3) 根據鍵值查詢數據
get ‘scores','Jim'
get ‘scores','Jim','grade'
可能你就發現規律了,HBase的shell操作,一個大概順序就是操作關鍵詞后跟表名,行名,列名這樣的一個順序,如果有其他條件再用花括號加上。
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) 掃描所有數據
scan ‘scores'
也可以指定一些修飾詞:TIMERANGE, FILTER, LIMIT,STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。沒任何修飾詞,就是上邊例句,就會顯示所有數據行。
例句如下:
復制代碼 代碼如下:
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)}
過濾器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.
還有一個CACHE_BLOCKS修飾詞,開關scan的緩存的,默認是開啟的(CACHE_BLOCKS=>true),可以選擇關閉(CACHE_BLOCKS=>false)。
5) 刪除指定數據
復制代碼 代碼如下:
delete‘scores','Jim','grade'
delete‘scores','Jim'
刪除數據命令也沒太多變化,只有一個:
hbase>delete ‘t1′, ‘r1′, ‘c1′, ts1
另外有一個deleteall命令,可以進行整行的范圍的刪除操作,慎用!
如果需要進行全表刪除操作,就使用truncate命令,其實沒有直接的全表刪除命令,這個命令也是disable,drop,create三個命令組合出來的。
6) 修改表結構
復制代碼 代碼如下:
disable‘scores'
alter ‘scores',NAME=>'info'
enable‘scores'
alter命令使用如下(如果無法成功的版本,需要先通用表disable):
a、改變或添加一個列族:
hbase>alter ‘t1′, NAME => ‘f1′, VERSIONS => 5
b、刪除一個列族:
復制代碼 代碼如下:
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、可以添加一個表協同處理器
hbase>alter ‘t1′, METHOD => ‘table_att', ‘coprocessor'=> ‘hdfs:///foo.jar|com.foo.FooRegionObserver|1001|arg1=1,arg2=2′
一個表上可以配置多個協同處理器,一個序列會自動增長進行標識。加載協同處理器(可以說是過濾程序)需要符合以下規則:
[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、可以一次執行多個alter命令:
hbase>alter ‘t1′, {NAME => ‘f1′}, {NAME => ‘f2′, METHOD => ‘delete'}
7) 統計行數:
復制代碼 代碼如下:
hbase>count ‘t1′
hbase>count ‘t1′, INTERVAL => 100000
hbase>count ‘t1′, CACHE => 1000
hbase>count ‘t1′, INTERVAL => 10, CACHE => 1000
count一般會比較耗時,使用mapreduce進行統計,統計結果會緩存,默認是10行。統計間隔默認的是1000行(INTERVAL)。
8) disable 和 enable 操作
很多操作需要先暫停表的可用性,比如上邊說的alter操作,刪除表也需要這個操作。disable_all和enable_all能夠操作更多的表。
9) 表的刪除
先停止表的可使用性,然后執行刪除命令。
drop ‘t1′
以上是一些常用命令詳解,具體的所有hbase的shell命令如下,分了幾個命令群,看英文是可以看出大概用處的,詳細的用法使用help “cmd” 進行了解。
復制代碼 代碼如下:
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命令,當然也可以把所有的hbase shell命令寫入到一個文件內,想linux shell腳本程序那樣去順序的執行所有命令。如同寫linux shell,把所有hbase shell命令書寫在一個文件內,然后執行如下命令即可:
復制代碼 代碼如下:
$hbase shell test.hbaseshell
六、JAVA操作HBASE方面
1) 連接原理和配置
HBase Master是服務器負責管理所有的HRegion服務器,HBase Master並不存儲HBase服務器的任何數據,HBase邏輯上的表可能會划分為多個HRegion,然后存儲在HRegion Server群中,HBase Master Server中存儲的是從數據到HRegion Server的映射。
一台機器只能運行一個HRegion服務器,數據的操作會記錄在Hlog中,在讀取數據時候,HRegion會先訪問Hmemcache緩存,如果 緩存中沒有數據才回到Hstore中上找,沒一個列都會有一個Hstore集合,每個Hstore集合包含了很多具體的HstoreFile文件,這些文 件是B樹結構的,方便快速讀取。
再看下HBase數據物理視圖如下:
Row Key |
Timestamp |
Column Family |
|
URI |
Parser |
||
r1 |
t3 |
url=http://www.taobao.com |
title=天天特價 |
t2 |
host=taobao.com |
||
t1 |
|||
r2 |
t5 |
url=http://www.alibaba.com |
content=每天… |
t4 |
host=alibaba.com |
? Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序
? Timestamp: 時間戳,每次數據操作對應的時間戳,可以看作是數據的versionnumber
? Column Family:列簇,Table在水平方向有一個或者多個Column Family組成,一個Column Family中可以由任意多個Column組成,即Column Family支持動態擴展,無需預先定義Column的數量以及類型,所有Column均以二進制格式存儲,用戶需要自行進行類型轉換。
了解了HBase的體系結構和HBase數據視圖夠,現在讓我們一起看看怎樣通過Java來操作HBase數據吧!
先說說具體的API先,如下
HBaseConfiguration是每一個hbase client都會使用到的對象,它代表的是HBase配置信息。它有兩種構造方式:
public HBaseConfiguration()
public HBaseConfiguration(final Configuration c)
默認的構造方式會嘗試從hbase-default.xml和hbase-site.xml中讀取配置。如果classpath沒有這兩個文件,就需要你自己設置配置。
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) 創建表
創建表是通過HBaseAdmin對象來操作的。HBaseAdmin負責表的META信息處理。HBaseAdmin提供了createTable這個方法:
public void createTable(HTableDescriptor desc)
HTableDescriptor 代表的是表的schema, 提供的方法中比較有用的有
setMaxFileSize,指定最大的region size
setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小
增加family通過 addFamily方法
public void addFamily(final HColumnDescriptorfamily)
HColumnDescriptor 代表的是column的schema,提供的方法比較常用的有
setTimeToLive:指定最大的TTL,單位是ms,過期數據會被自動刪除。
setInMemory:指定是否放在內存中,對小表有用,可用於提高效率。默認關閉
setBloomFilter:指定是否使用BloomFilter,可提高隨機查詢效率。默認關閉
setCompressionType:設定數據壓縮類型。默認無壓縮。
setMaxVersions:指定數據最大保存的版本個數。默認為3。
一個簡單的例子,創建了4個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) 刪除表
刪除表也是通過HBaseAdmin來操作,刪除表之前首先要disable表。這是一個非常耗時的操作,所以不建議頻繁刪除表。
disableTable和deleteTable分別用來disable和delete表。
Example:
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
if (hAdmin.tableExists(tableName)) {
hAdmin.disableTable(tableName);
hAdmin.deleteTable(tableName);
}
4) 查詢數據
查詢分為單條隨機查詢和批量查詢。
單條查詢是通過rowkey在table中查詢某一行的數據。HTable提供了get方法來完成單條查詢。
批量查詢是通過制定一段rowkey的范圍來查詢。HTable提供了個getScanner方法來完成批量查詢。
public Result get(final Get get)
public ResultScanner getScanner(final Scan scan)
Get對象包含了一個Get查詢需要的信息。它的構造方法有兩種:
publicGet(byte [] row)
publicGet(byte [] row, RowLock rowLock)
Rowlock是為了保證讀寫的原子性,你可以傳遞一個已經存在Rowlock,否則HBase會自動生成一個新的rowlock。
Scan對象提供了默認構造函數,一般使用默認構造函數。
Get/Scan的常用方法有:
addFamily/addColumn:指定需要的family或者column,如果沒有調用任何addFamily或者Column,會返回所有的columns.
setMaxVersions:指定最大的版本個數。如果不帶任何參數調用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只會取到最新的版本。
setTimeRange:指定最大的時間戳和最小的時間戳,只有在此范圍內的cell才能被獲取。
setTimeStamp:指定時間戳。
setFilter:指定Filter來過濾掉不需要的信息
Scan特有的方法:
setStartRow:指定開始的行。如果不調用,則從表頭開始。
setStopRow:指定結束的行(不含此行)。
setBatch:指定最多返回的Cell數目。用於防止一行中有過多的數據,導致OutofMemory錯誤。
ResultScanner是Result的一個容器,每次調用ResultScanner的next方法,會返回Result.
public Result next() throws IOException;
public Result [] next(int nbRows) throwsIOException;
Result代表是一行的數據。常用方法有:
getRow:返回rowkey
raw:返回所有的key value數組。
getValue:按照column來獲取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) 插入數據
HTable通過put方法來插入數據。
public void put(final Put put) throws IOException
public void put(final List puts) throws IOException
可以傳遞單個批Put對象或者List put對象來分別實現單條插入和批量插入。
Put提供了3種構造方式:
public Put(byte [] row)
public Put(byte [] row, RowLock rowLock)
public Put(Put putToCopy)
Put常用的方法有:
add:增加一個Cell
setTimeStamp:指定所有cell默認的timestamp,如果一個Cell沒有指定timestamp,就會用到這個值。如果沒有調用,HBase會將當前時間作為未指定timestamp的cell的timestamp.
setWriteToWAL: WAL是Write Ahead Log的縮寫,指的是HBase在插入操作前是否寫Log。默認是打開,關掉會提高性能,但是如果系統出現故障(負責插入的Region Server掛掉),數據可能會丟失。
另外HTable也有兩個方法也會影響插入的性能
setAutoFlash: AutoFlush指的是在每次調用HBase的Put操作,是否提交到HBase Server。默認是true,每次會提交。如果此時是單條插入,就會有更多的IO,從而降低性能.
setWriteBufferSize: Write Buffer Size在AutoFlush為false的時候起作用,默認是2MB,也就是當插入數據超過2MB,就會自動提交到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) 刪除數據
HTable 通過delete方法來刪除數據。
public voiddelete(final Delete delete)
Delete構造方法有:
public Delete(byte [] row)
public Delete(byte [] row, long timestamp, RowLockrowLock)
public Delete(final Delete d)
Delete常用方法有
deleteFamily/deleteColumns:指定要刪除的family或者column的數據。如果不調用任何這樣的方法,將會刪除整行。
注意:如果某個Cell的timestamp高於當前時間,這個Cell將不會被刪除,仍然可以查出來。
Example:
HTable table = new HTable(hbaseConfig, “mytest”);
Delete d = new Delete(“row1″.getBytes());
table.delete(d)
7) 切分表
HBaseAdmin提供split方法來將table 進行split.
public void split(final StringtableNameOrRegionName)
如果提供的tableName,那么會將table所有region進行split ;如果提供的regionName,那么只會split這個region.
由於split是一個異步操作,我們並不能確切的控制region的個數。
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);
}
}