Base配置和使用文檔...................................................................................................... 1html
1、 HBase原理和結構說明............................................................................................. 2java
2、 HBase的表結構....................................................................................................... 2node
1) Row Key............................................................................................................... 3linux
2) 列族 column family.............................................................................................. 4web
3) 單元 Cell............................................................................................................. 4算法
4) 時間戳 timestamp................................................................................................. 4sql
3、 HBASe單機配置...................................................................................................... 5shell
2) 使用root身份登陸目標服務器系統(Suse10Linux).................................................. 5數據庫
3) 建立hadoop用戶,$useraddhadoop能夠用$passwdhadoop修改hadoop用戶的登陸密碼. 5apache
4) 解壓hadoop:......................................................................................................... 6
5) 配置hbase-site.xml文件........................................................................................ 6
6) 啓動和關閉.......................................................................................................... 7
7) 說明..................................................................................................................... 7
4、 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
5、 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
6、 JAVA操做HBASE方面......................................................................................... 28
1) 鏈接原理和配置.................................................................................................. 28
2) 建立表................................................................................................................ 30
3) 刪除表................................................................................................................ 31
4) 查詢數據............................................................................................................ 31
5) 插入數據............................................................................................................ 33
6) 刪除數據............................................................................................................ 34
7) 切分表................................................................................................................ 35
HBase是一個分佈式的、面向列的開源數據庫,源於google的一篇論文《bigtable:一個結構化數據的分佈式存儲系統》
HBase是Google Bigtable的開源實現,它利用Hadoop HDFS做爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper做爲協同服務。
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會返回最新時間的值給請求者。
這些名詞的具體含義以下:
與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做左填充。
行的一次讀寫是原子操做 (不論一次讀寫多少列)。這個設計決策可以使用戶很容易的理解程序在對同一個行進行併發更新操做時的行爲。
hbase表中的每一個列,都歸屬與某個列族。列族是表的chema的一部分(而列不是),必須在使用表以前定義。列名都以列族做爲前綴。例如courses:history , courses:math 都屬於courses 這個列族。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。實際應用中,列族上的控制權限能幫助咱們管理不一樣類型的應用:咱們容許一些應用能夠添加新的基本數據、一些應用能夠讀取基本數據並建立繼承的列族、一些應用則只容許瀏覽數據(甚至可能由於隱私的緣由不能瀏覽全部數據)。
HBase中經過row和columns肯定的爲一個存貯單元稱爲cell。由{row key, column( =<family> + <label>), version} 惟一肯定的單元。cell中的數據是沒有類型的,所有是字節碼形式存貯。
每一個cell都保存着同一份數據的多個版本。版本經過時間戳來索引。時間戳的類型是 64位整型。時間戳能夠由hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也能夠由客戶顯式賦值。若是應用程序要避免數據版本衝突,就必須本身生成具備惟一性的時間戳。每一個cell中,不一樣版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了不數據存在過多版本形成的的管理 (包括存貯和索引)負擔,hbase提供了兩種數據版本回收方式。一是保存數據的最後n個版本,二是保存最近一段時間內的版本(好比最近七天)。用戶能夠針對每一個列族進行設置。
1) 下載
在Apache/Hadoop項目的網站(hadoop.apache.org/)下載hadoophbase發行包,此處兩個發行包的大版本號必定要一致,譬如都是0.18版本:hadoop-0.18.2.tar.gzhbase-0.18.1.tar.gz
首先安裝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添加到這裏面.
建立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
$tarzxvfhadoop-0.18.2.tar.gz
這樣作會在/home/hadoop目錄下解壓hadoop發行包並建立到/home/hadoop/hadoop。
<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>
/bin/start-hbase.sh
/bin/stop-hbase.sh
必須配置的參數:
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與主機名的配置。
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進入命令界面。經過執行 help能夠看到命令的幫助信息。
以網上的一個學生成績表的例子來演示hbase的用法。
namegrad course
mathart
Tom 597 87
Jim 489 80
這裏grad對於表來講是一個只有它本身的列族,course對於表來講是一個有兩個列的列族,這個列族由兩個列組成math和art,固然咱們能夠根據咱們的須要在course中創建更多的列族,如computer,physics等相應的列添加入course列族。
複製代碼 代碼以下:
hbase(main):001:0>create ‘scores','grade', ‘course'
可使用list命令來查看當前HBase裏有哪些表。使用describe命令來查看錶結構。(記得全部的代表、列名都須要加上引號)
複製代碼 代碼以下:
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指時間戳,通常都省略掉了。
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']
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)。
複製代碼 代碼以下:
delete‘scores','Jim','grade'
delete‘scores','Jim'
刪除數據命令也沒太多變化,只有一個:
hbase>delete ‘t1′, ‘r1′, ‘c1′, ts1
另外有一個deleteall命令,能夠進行整行的範圍的刪除操做,慎用!
若是須要進行全表刪除操做,就使用truncate命令,其實沒有直接的全表刪除命令,這個命令也是disable,drop,create三個命令組合出來的。
複製代碼 代碼以下:
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'}
複製代碼 代碼以下:
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)。
不少操做須要先暫停表的可用性,好比上邊說的alter操做,刪除表也須要這個操做。disable_all和enable_all可以操做更多的表。
先中止表的可以使用性,而後執行刪除命令。
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
既然是shell命令,固然也能夠把全部的hbase shell命令寫入到一個文件內,想linux shell腳本程序那樣去順序的執行全部命令。如同寫linux shell,把全部hbase shell命令書寫在一個文件內,而後執行以下命令便可:
複製代碼 代碼以下:
$hbase shell test.hbaseshell
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);
建立表是經過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);
刪除表也是經過HBaseAdmin來操做,刪除表以前首先要disable表。這是一個很是耗時的操做,因此不建議頻繁刪除表。
disableTable和deleteTable分別用來disable和delete表。
Example:
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
if (hAdmin.tableExists(tableName)) {
hAdmin.disableTable(tableName);
hAdmin.deleteTable(tableName);
}
查詢分爲單條隨機查詢和批量查詢。
單條查詢是經過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()));
}
}
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();
}
}
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)
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);
}
}