HBase分布式數據庫_第1頁
HBase分布式數據庫_第2頁
HBase分布式數據庫_第3頁
HBase分布式數據庫_第4頁
HBase分布式數據庫_第5頁
已閱讀5頁,還剩123頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

?數據庫系統已無法適應大型分布式數據存儲的需要導致系統難于安裝與維護?關系模型對數據的操作使數據的存貯變得復雜?HBASE從設計理念上就為可擴展做好了充分準備?空間的擴展只需要加入存儲結點件系統上的表HBase是一個分布式的、面向列的開源NoSQL數據庫,能夠對大型數據提供隨機、實時的讀寫訪問,是基于Google的BigTable的開源實現[36]。Google的BigTable利用GFS作為其文件存儲系統,HBase利用Hadoop的HDFS作為其文件存儲系統;Google通過MapReduce來處理BigTable中的海量數據,HBase同樣利用Hadoop中的MapReduce來處理HBase中的海量數據;GoogleBigTable利用Chubby作為協同服務,HBase則利用Zookeeper作為協同服務。HBase在Hadoop之上提供了類似于BigTable的能力,主要用于存儲并處理大規模的數據,與傳統關系型數據庫的不同之處在于,它是一個適合于結構化、半結構化和非結構化數據存儲的數據庫;不是基于行的存儲模式,而是基于列的存儲模式。間事件2006年11月Google公司Chang等人發表的BigTable論文。2007年4月基于BigTable的HBase源碼基本可用。2007年10月HBase第一個發布版本(Hadoop0.15.0)。2008年1月Hadoop成為Apache的頂級項目,HBase成為Hadoop的子項目。2008年10月HBase0.18.1發布。2009年1月HBase0.19.0發布。2009年9月HBase0.20.0發布。2010年5月HBase成為Apache的頂級項目。2010年6月HBase0.89.20100621,第一個開發版本。2011年1月HBase0.90.0發布,穩定性和持久性有所提升。2012年1月HBase0.92.0發布,支持協處理器和安全控制。2012年5月HBase0.94.0發布,包含很多性能的提升和BUG修復及新特性。2013年4月HBase0.95.0發布,性能提升、BUG修復及新特性。2013年10月HBase0.96.0發布,提高了穩定性、平均恢復時間(MTTR)等。2014年2月HBase0.98.0發布,提高了性能和安全特性。2014年11月HBase0.99.0發布,提高了性能和安全特性。2015年2月HBase1.0.0發布,簡化和提升RegionAssignment的可靠性等。2015年4月HBase2.0.0-SNAPSHOT發布,更好支持Cell級別的ACL控制等。HBase的主版本與Hadoop的主版本號是相互匹配的,如HBase0.19.X就表示它是工作在Hadoop0.19.X之上的。HBase092xHBase094xHBase096xHBase098xHBase10xHadoop0.20.x支持并測試不支持不支持不支持不支持Hadoop0.22.x支持并測試不支持不支持不支持不支持Hadoop1.0.0-1.0.2不支持不支持不支持不支持不支持Hadoop1.0.3+支持并測試支持并測試支持并測試不支持不支持Hadoop1.1.x支持未測試支持并測試支持并測試不支持不支持Hadoop0.23.x不支持支持并測試支持未測試不支持不支持Hadoop2.0.x不支持支持未測試不支持不支持不支持Hadoop2.1.0不支持支持未測試支持并測試不支持不支持Hadoop2.2.0不支持支持未測試支持并測試支持并測試支持未測試Hadoop2.3.x不支持支持未測試支持并測試支持并測試支持未測試Hadoop2.4.x不支持支持未測試支持并測試支持并測試支持并測試Hadoop2.5.x不支持支持未測試支持并測試支持并測試支持并測試Hadoop2.6.x不支持支持未測試支持并測試支持并測試支持并測試一致性的。其中,CAP是Consistency(一致性)、Availability(可用性)和Partition-tolerance(分區容錯)的縮寫。Consistency(一致性)是指在分布式系統中的所有數據備份,在同一時刻是否同樣的值;Availability(可用性)是指在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求;Partition-tolerance(分區容錯)是指集群中的某些節點在無法聯系后,集群整體是否還能繼續進行服務。HBase的強一致性主要體現在每個HRegion同時只有一臺HRegionServerHRegion,都由這臺HRegionServer來響應。HBase提供行級的事務,并且同一行的列的寫入是原子操作。在HBase0.94版本之前,HBase支持的事務是很有限的,每次行事務只能執行一個寫操作,比如連續地執行一系列Put或Delete操作,這些操作是單獨一個個的事務,其整體并不是原子性執行的。在HBase0.94版本之后,HBase具備更完整的事務支持,可以實現eorgjirabrowseHBASEHBase通過行鎖和MVCC(多版本并發控制技術,MultiversionConcurrencyControl)保證了高效的并發讀寫。建議讀者使用HBase系統自身提供的性能測試工具 工具測試的結果看,HBase的實時讀寫性能不算差。面向列HBaseColumnOrientedRDBMSRowOriented制不同,在面向列的存儲機制下對于Null值的存儲是不占用任何空間的,如在HBase中某個表有10列,但在存儲時只有一列有數據,那么無數據的9列就不用點存儲空間,而對于RDBMS的面向行存儲時,則10列全部占用存儲空seer數據基于hdfs存放,副本機制可以保證數據可靠3.分布式regionserver-region模型,在橫向擴展的基礎上可以支撐4.讀寫相應速度快5.分布式設計策略允許硬件故障hbase很簡單插入,查詢,刪除,修改,清空等操2.hbase基于列式存儲,每個列族都有幾個文件保存,不同列族的3.hbase修改和刪除數據是實現上插入帶有特殊標記的新記錄,而4.Hbase分布式,關系型數據庫只能用其他方式實現5.Hbase支持并發量比關系型數據庫大的多,相應時間也比較快HDFSvsHBase?數據以文件方式直接存儲?連續訪問效率高?隨機訪問效率低?數據以索引格式特殊存儲?連續訪問效率低?隨機訪問效率高活選擇!3.數據要求比較高HBase的體系架構也是一個典型的Master/Slave架構,主要包括HBaseClient、Zookeeper、HMaster、HRegionServer和ogeHBaseClientHBase著一些Cache來加快對HBase的訪問,如Client通過RPC通信機制與HMaster通信進行管理類操作;Client通過RPC機制與egionServerZookeeper為HBase提供了穩定服務和failover機制,通過Zookeeper的MasterElection機制解決HMaster的單節點故(HBase中有兩張特殊的Table表,-ROOT-METAMETAHRegoin的Region信息;-ROOT-表只允許有一個HRegion,記錄了.META.表的HRegion信息。),而且也存儲了HMastererHMasterHMaster主要負責Table表和HRegion的管理工作,如管理HRegions遷移等。HMaster還負責監控每個HRegionServer,如果某個HRegionServer不可用,HMaster將會由其他HRegionServer來代替該HRegionServer來為其提HRegionServerHRegionServer負責響應用戶的I/O請求,并向HDFS文件系統中讀寫數據,HBase核心的模塊。HRegionServer還負責與HMaster之間進行通信,獲取自己所需要向HMaster反饋自己的運行狀況。StoreHBaseStoreMemStoreStoreFiles成。其中,MemStore是StoredMemoryBuffer,用戶寫入的數據首先會放入MemStore中,當MemStore滿后,會Flush成一個StoreFile(底層實現為HFile)。當StoreFile文件數量增長到一定閾值時,就會通過Compact合并操作,將多個StoreFiles通過版本合并和數據刪除等操e達到一個閥值(默認為64M)時,MemStore會被HBase進行flush操作,從而生成一個快照。leMemStore內存中的數據寫到文件后就是StoreFile,StoreFile的底層實現是以HFile的格式保DFSnHRegion是實際存儲數據的區域,是分布式存儲和負載均衡的最小單元(不是存儲的最小單元,存儲的最小單元為HFile),它包含了一個或多個Store。最小單元就表示不同的LogHLog主要用于保存用戶操作HBase的日志信息,其存儲格式為WAL(WriteAheadLog),,理上是Hadoop的SequenceFile文件。用戶的所有操作都會先記錄到HLog中,然后再保存HRegion中。由于MemStore駐留在內存中,保存數據時先會存儲到MemStore中,然后再根據用戶設定的顯式或隱式的刷寫模式將數據再保存到HFile中。當出現數據已保存到MemStore,而還沒有刷寫到HFile時出現異常時,HLog就會將用戶操作的指令保存起來,這些指令,完成數據的存儲。HFile主要負責實際數據的存儲,是Hadoop的二進制格式文件,也是HBase中存儲的最小單元。用戶可根據業務需求對HFile進行重新拆分,讓數據更加分散,從而提高數據讀取效率。7.4.1準備工作HadoopHadoop,即要對軟硬件環境、網絡環境、各節點HadoopHBase群規劃。器名稱硬件參數作系統ondaryNameNode8.1.100CentOS7HadoopZookeeper8.1.101CentOS7HadoopZookeeper8.1.102CentOS7Hadoop8.1.103CentOS77.4.2安裝HBaseHBase的安裝方式主要有兩種,一種是源碼編譯型的安裝方式,另一種是二進制發布包的安裝方式。源碼編譯型的方裝方式需要安裝Maven以及完整的Java開發工具包(JavaDevelopmentKit,JDK)來準備HBase的編譯和運行環境,再對HBase源碼進行編譯和打包,從而完成HBase的安裝。本實例將采用第二種HBase的安裝方式,即采用二進制發布包的安裝方式。#tar–zxvfhbase-1.0.0--解壓HBase二進制文件#mvhbase-1.0.0/opt/--移動hbase-1.0.0到“/opt/”目錄下opthbase-1.0.0”讀權限分配給hadoop用戶chownRhadoophadoop/opt/hbase-1.0.0#vi/etc/profile--把HBase安裝路徑添加到配置文件profile中exportHBASEHOMEopthbase0.0exportPATH=$PATH:$HBASE_HOME/binsuhadoop--切換為hadoop用戶bin目錄中包含了HBase提供的所有腳本,如start-hbase.sh(啟動HBase集群)、hbase-daemon.sh(啟動或停止單個HMaster/HRegionServer/Zookeeper)、stop-hbase.sh(停HRegionServer機器列表、JAVA_HOME目錄等)、hbase-env.sh(配置JVM、GC參數、conf目錄中包含了定義HBase的配置文件,如hbase-site.xml(增加HBase的特定配置)、hbase-env.sh(配置HBase的環境變量)、regionservers(配置所有HRegion服務器的主機名)、perties(配置HBase的日志級別)等。docs目錄包含了HBase工程網頁的副本、工具、API和項目自身的文檔信息。讀者可以用瀏覽器打開docs/index.html文件或docs/book.html文件查看有關HBase的更詳細信息。hbase-webappshbase-webapps目錄中包含了Java實現的Web接口,用戶在部署HBase到生產環境中或使用HBase時,一般很少會接觸到該目錄中的文件。5)lib7.4.3配置HBaseHBase安裝完成后,就要對其進行配置,根據HBase運行模式不同,其配置內容有所區別。HBase的運行模式有單機模式(默認模式)、偽分布模式(所有守護進程都運行在單個節點上)和全分布模式(進程運行在物理服務器集群中)三種。1)配置hbase-env.shvim/opt/hbase-1.0.0/conf/hbase-env.shexportJAVA_HOME=/usr/java/jdk1.7.0_71/#Java安裝路徑exportHBASE_LOG_DIR=${HBASE_HOME}/logs#HBase日志路徑exportHBASE_MANAGES_ZK=true#由HBase負責啟動和關閉Zookeeper2)配置hbase-site.xmligurationropertynamehbaserootdir</name><value>hdfs://master1.hadoop:9000/hbase</value>property>ropertynamehbaseclusterdistributedname<value>true</value>property>ropertyname>hbase.zookeeper.quorum</name>valueSlave.Hadoop,Slave2.Hadoop,Slave3.Hadoop</value>property>ropertyname>perty.dataDir</name>valueopt/hbase-1.0.0/zookeeper</value>property>iguration3)配置regionserversvim/opt/hbase-1.0.0/conf/regionserversaveHadoopaveHadoopaveHadoop4)各主機間復制HBasescpr/opt/hbase-1.0.0Slave1.Hadoop:/optscpr/opt/hbase-1.0.0Slave2.Hadoop:/optscpr/opt/hbase-1.0.0Slave3.Hadoop:/opt7.4.4啟停HBaseHBase安裝配置完成之后,下一步來啟動并測試HBase。HBase的正常啟動順序應該為:Hadoop->Zookeeper->HBase,HBaseZookeeper>Hadoop。rstarthbaseshvehadoopstartingzookeeperloggingtoopthbasebinlogshbasehadoopzookeeperavehadoopoutvehadoopstartingzookeeperloggingtoopthbasebinlogshbasehadoopzookeepervehadoopoutvehadoopstartingzookeeperloggingtoopthbasebinlogshbasehadoopzookeeperSlaveHadoopoutggingtoopthbaselogshbasehadoopmastermasterhadoopoutadoopstartingregionserverloggingtoopthbasebinlogshbasehadoopgionserverSlaveHadoopoutadoopstartingregionserverloggingtoopthbasebinlogshbasehadooprslavehadoopoutadoopstartingregionserverloggingtoopthbasebinlogshbasehadoopslavehadoopout閉HBase集群,可使用如下命令:rstophbaseshstoppinghbase...s49JpsameNodeResourceManagerSecondaryNameNodeHBase不是一個關系型數據庫,因此需要用不同的方法來定義數據模型。HBase是以表的形式存儲數據的,表由行和列組成,列又被劃分為若干個列族/列簇(ColumnFamily)組成,列簇支持動態擴展,不需要預定義數量及類型。7.5.1邏輯視圖mestampmestampFamilyColumnColumn12Family123thadooptfsoktmapsdftivedfkdtdatatweefdetfsdft類型,可以使用任何字符串(最大長度是64KB)作為行鍵。對于表中的行,可以根據行的鍵值進RowKey通過RowKey的排序訪問或全表掃描的訪問方式。milyHBase表中的每列都歸屬于某個列簇,列簇必須作為表模式(Schema)定義的一部分預先給出,多個列成員,如ColumnFamily1:Column1,ColumnFamily2:Column1;新加入的列簇成員可以隨后按需、動態加入;同一列簇的數據存儲在同一目錄下,由幾個文件保存。HBase對表的權限控制、儲和調優都是在列簇層面進行的,即同一列簇成員有相同的訪問模式和大小特征。CellQualifier修飾符列修飾符可以理解為實際的列名,可通過“列簇:列修飾符”描述具體的某個列,也可通過Client列簇中。4)Cell單元格HBaseRowKeyColumnFamilyColumn儲單元為Cell單元格,其表示形碼形式存儲的。tampHBase表中的Cell單元格中保存著同一份數據的多個版本,版本號默認情況下是單元格插入時的時間戳(精確到毫秒的當前系統時間)。HBase可根據唯一的時間戳來區分每個版本之間的差異。賦值,此時要注意生成的值要具有唯一性,從而避免數據版本沖突。HBase不是一個關系型數據庫,因此需要用不同的方法來定義數據模型。HBase是以表的形式存儲數據的,表由行和列組成,列又被劃分為若干個列族/列簇(ColumnFamily)組成,列簇支持動態擴展,不需要預定義數量及類型。7.5.2物理視圖ybleHregionregionregion就會有越來越多的Hregion4.HRegion是Hbase中分布式存儲和負載均衡的最小單元。最小單元就表示不同的Hregion可以分布在不同的HRegionserverHregion是不會拆分到多個server上的HFile格式保存在HDFS上HFile的格式HFile的格式Hbase物理存儲gWALLogg每個RegionServer維護一個Hlog,目的是不磁盤尋址次數,提高?HLog文件是一個普通的HadoopSequenceFileHLogKey入數據的歸屬信息 和timestamp)。HLogSequeceFile的ValueHBaseKeyValue象,即對應HFile中eyValueaseHadoopHDFS供了高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統。TimeStampRegionInfoServerServerstartcoderess①Client端首先連接到Zookeeper管理的集群,并查詢Zookeeper中-ROOT-表,Zookeeper告訴Client端-ROOT-表中HRegion在哪個HRegionServer上,這里假定-ROOT-表中的HRegion在RegionServerR上;②Client獲得HRegionServer的Name之后,再向RegionServerR發起查詢某行的.META的HA的HRegion可在某HRegionServer上找到,并將查詢結果將緩存③Client端再向某HRegionServer上的.META查詢某行的數據在哪個HRegion上,并查詢哪個HRegionServer可以提供服務,并將查詢結果緩存到Client端,從而完成了HRegion定位。①HRegionServer決定本地的HRegion是否需要分裂,如果需要分裂,則準備分裂工作:在④HRegionServer關閉RootHRegion,并強制刷新緩存內的數據,并在本地數據結構中將標識為下線狀態,如果此時Client正好發送對RootHRegion的請求,將會拋出NotServingRegionException異常,ClientHRegion請求;⑤HRegionServer在.split目錄下為子HRegionA和HRegionB創建目錄和相關的數據結構,然后HRegionServer分割Store文件(為RootHRegion的每個Store文件創建兩個Reference文件,這些的信息,此時表中并單獨存儲沒有子HRegion信息的條目。Client掃描.META.表時查看RootHRegion為分裂狀態,但直到子HRegion信息出現在表中,Client才知道他們的存在。如果Put請求成功,那么RootHRegion將被有效地分割;如果在這條RPC成功之前HRegionServer異常,那么HMaster和打開HRegion的下一個HRegionServer會清理關于該HRegion分裂的狀態,并在.META.表更新之后,HRegionHMaster;⑨HRegionServer將子HRegionA和HRegionB的相關信息寫入.META.表之后,Client便可以掃描到新ntransitionregionnameSPLIT以便HMaster可以監測到,如果子HRegion被選中,Balancer可以自由地將子HRegion分派到其他HRegion后,元數據和HDFS中依然包含著指向RootHRegion的Reference文件,這些ReferenceHRegion作重寫數據文件時被刪除掉,HMaster的垃圾回收工會周指向RootHRegion的Reference,如果沒有,將刪除RootHRegion。onServerHRegionServer③HRegionServer收到KeyValue實例后,KeyValue會被分配到對應的HRegion實例,并④當MemStore達到一定大小或經歷某個特定時間時,數據會異步連續寫入到HFile中。為了防止在數據寫入過程中,存儲在內存中的數據沒來得及保存到磁盤而造成的數據丟失情況,HBase使用WAL格式的日志HLog存儲在HDFS上。當前HRegionServer出現異常時,其他HRegionServer也可以讀取日志文件并回放修改,從而恢復數據,并能。當用戶使用HBase讀取數據時,如果所要讀取的數據所在的HRegionServer地址在HRegionServer的某個HRegion上查找到匹配的數據。否則HBase的讀數據流程需要經rase客戶端使用主要方式:口HBaseShellHBase管理使用??贘avaAPIHBase客戶端程序通過底層RPC接I其余接口:REST(RepresentationalStateTransfer)表述性狀態轉口Thrift接口Thrift是一個基于靜態代碼生成的跨語言的RPC協議棧實C++,Java,Python,Ruby,PHP等主roPINativeJavaAPI是比較常用的與HBase進行交互的一種方式之一,這種方式需要在集群中創建Java項目,并調用HBase的API來操作HBase,主要涉及對HBase的創建表格、刪除表格、插入數據、刪除數據、查詢數據等操作。Java類HBase數據模型HBaseAdminDataBase(數據庫)HBaseConfigurationTable(表)criptorColumnFamily(列簇)ColumnQualifier(列修飾符)ScanPI返回值方法描述voidaddResource(Pathfile)通過給定路徑所指的文件添加資源clear()清空所有已設置的屬性set(Stringname,Stringvalue)通過屬性名來設置值setBoolean(Stringname,booleanvalue)設置boolean類型的屬性值StringgetBoolean(Stringname,booleandefaultValue)獲取為boolean類型的屬性值,如果其屬性值類型部位boolean,則返回默認屬性值get(Stringname)獲取屬性名對應的值figurationionconfignewHBaseConfiguration//可以自定義配置,也可以從自定義配置文件中讀取configsethbasezookeeperpropertyclientPort,"2181");gsethbasezookeeperquorumSlaveHadoopSlaveHadoopSlaveHadoopconfigsethbasemasterMaster.Hadoop\\:600000");*/PI返回值方法描述voi返回值方法描述voidaddColumn(StringtableName,HColumnDescriptorcolumn)對已經存在的表添加列checkHBaseAvailable(HBaseConfigurationconf)查看HBase是否處于運行狀態createTable(HTableDescriptordesc)創建一個表,同步操作deleteTable(byte[]tableName)刪除一個已經存在enableTable(byte[]tableName)使表處于有效狀態disableTable(byte[]tableName)使表處于無效狀態modifyTable(byte[]tableName,HTableDescriptorhtd)修改表模式,異步操作,可能需要花費一定的時間HTableDescriptorlistTables()列出所有用戶控件表項booleantableExists(StringtableName)檢查表是否存在dminnewHBaseAdminconfig//創建表iptorhtdnewHTableDescriptortableNameynewHColumnDescriptorcfynewHColumnDescriptorcfncreateTablehtd//修改表信息sableTabletableNamemodifyingexistingColumnFamilyifyColumntableNamenewHColumnDescriptornamenenableTabletableName//刪除表sableTableBytestoBytestableNamendeleteTableBytestoBytestableNamePIr返回值方法描述tegetName()獲取列族的名字getValue(byte[]key)獲取對應的屬性的值voidsetValue(Stringkey,Stringvalue)設置對應屬性的值entnametorcontentPIidePutput自動的檢查row/family/qualifier是否與給釋放所有的資源或掛起內部中的更新檢查Get實例所指定的值是否存在于HTable的列中et獲取指定行某些單元格所對獲取當前一打開的表每個區結束鍵值rbytefamily獲取當前給定列族的scanner獲取當前表的HTableDescriptor實例byte[]getTableName()isTableEnabled(HBaseConfigurationconf,StringtableName)檢查表是否有效idTablehtableinstantiateHTableScantoBytescfBytestoBytesattrscan.setStartRow(Bytes.toBytes("row"));//startkeyisinclusivexclusivetry{forResultrrsnextrnullr=rs.next()){//processresult...finallyrs.close();//alwaysclosetheResultScanner!}將指定的列和對應的值添加到Put實例中ue將指定的列和對應的值及tStamplongStampPut時間戳byte[]getRow()獲取Put實例的行RowLockgetRowLock()獲取Put實例的行鎖longgetTimeStamp()獲取Put實例的時間戳familyMap空PIleputputr獲取指定列簇和列修飾列y通過指定列簇獲取其對所有列setTimeRange(longminStamp,longmaxStamp)列的版本號ilter當執行Get操作時設置服端的過濾器取tablename表中row行的對應數據rowPIan獲取tablename表中row行的對應數據列簇中查詢所有列umn定列簇的某列大的版本個數imeRange指定最大的時間戳和最小的時間戳setTimeStamp()戳setFilter()指定Filter來過濾掉不需要的信息setStartRow()始的行setStopRow()束的行(不含此行)多返回的Cell數目//指定最多返回Cell數目,防止一行中有過多的數據,導致OutofMemory錯誤atchscansetTimeStampNumberUtilstoLong"1234567890"));scansetTimeRangeNumberUtilstoLong"1234567890"),NumberUtilstoLong3"));artRowtopRowesfamilyestoBytescolumn/查詢family列簇,列column值為1的記錄//方法一(單個查詢)ernewSingleColumnValueFilterreOpEQUALBytestoBytesscan.setFilter(filter);HBaseShellRubyShellHBaseShell問本地或遠程服務[hadoop@Master1~]$hbaseshellHBaseShellHBaseShellenterhelpRETURNforlistofsupportedcommands.Typeexit<RETURN>"toleavetheHBaseShellVersion1.0.0,r6c98bff7b719efdb16f71606f3b7d8229445eb81,SatFeb1419:49:22PST2015hbasemain0>asemainhelpHBaseShell,version1.0.0,r6c98bff7b719efdb16f71606f3b7d8229445eb81,SatFeb1419:49:22PST2015Type'help"COMMAND"',(e.g.'help"get"'--thequotesarenecessary)forhelponaspecificcommand.的詳細信息的數量改列簇模式除指定表/行/列對應的值除指定行的所有元素無效試表是否存在eShell獲取行或單元(Cell)的值HBase在的所有表元添加值HBase持的工具通過對表的掃描來獲取對應的值回HBase集群的狀態信息HBase新創建指定表回HBase版本信息ibeeTheHBaseTheHBaseshellisthe(J)RubyIRBwiththeaboveHBase-specificcommandsadded.eShellseehttphbaseapacheorgbookhtmlhbasemain0>address,具體的Shell命令如下:hbasemaincreateperson,'name','address'0row(s)in3.0080secondsHbase:Table-personhbasemainputpersonrowname,'tom'0row(s)in0.3700secondsolswnncateionhbasemainputpersonrowaddresshomexianstreet0row(s)in0.0640secondsasemainputpersonrowaddressworkshanghaistreet0row(s)in0.0260secondshbasemaingetpersonrow1',{COLUMN=>'address:home'}COLUMNCELLaddress:hometimestamp=1431503150371,value=xianstreetrowsin0secondshbasemaingetperson','row1'COLUMNCELLaddress:hometimestamp=1431503150371,value=xianstreetaddress:worktimestamp=1431503185691,value=shanghaistreetnametimestamp=1431502932220,value=tomrows)in0.0420secondshbasemainputpersonrow'name','jack'0row(s)in0.0370secondshbasemain0>get'person','row1',{COLUMN=>'name',TIMESTAMP=>1431502932220}timestamp=1431502932220,value=tomrowsin0secondslist息;通過describe命令返回person表的詳細信息,包括列簇的列表;//通過list命令查詢已創建的表信息asemainlistTABLErowsin0secondserson//通過describe命令返回person表的詳細信息hbasemaindescribepersonTablepersonisENABLEDILIESDESCRIPTIONNAMEaddressDATABLOCKENCODING=>'NONE',BLOOMFILTER=>'ROW',REPLICATIONSCOPEVERSIONSCOMPRESSIONNONEMIN_VERSIONS=>'0',TTL=>ERKEEPDELETEDCELLSFALSEBLOCKSIZEINMEMORY'false',BLOCKCACHE=>'true'}NAMEnameDATA_BLOCK_ENCODING=>'NONE',BLOOMFILTER=>'ROW',REPLICATION_SCOPEVERSIONSCOMPRESSION=>'NONE',MIN_VERSIONS=>'0',TTL=>'FOREVER',KEEPDELETEDCELLS'FALSE',BLOCKSIZE36',IN_MEMORY=>'false',BLOCKCACHE=>'true'}rowsin0.2190seconds//查詢person表中所有數據basemainscanpersonROWCOLUMN+CELLrowcolumnaddresshometimestamp31503150371,value=xianstreetrowcolumnaddressworktimestamp185691,value=shanghaistreetrow1column=name:,timestamp=1431504003274,value=jackrowsin0seconds//查看person表中address列簇的所有數據hbasemainscanpersonCOLUMNS'address'}ROWCOLUMN+CELLrowcolumnaddresshometimestamp1431503150371,value=xianstreetrowcolumnaddressworktimestamp3185691,value=shanghaistreetrowsin0seconds//查詢person表是否存在asemainexistspersonablepersondoesexist0row(s)in0.0330seconds//查詢服務器狀態basemainstatusservers,0dead,1.0000averageload//查詢HBase版本hbasemainversion1.0.0,r6c98bff7b719efdb16f71606f3b7d8229445eb81,SatFeb1419:49:22PST2015//查詢person表是否enablehbasemainisenabled'person'ue0row(s)in0.0710seconds//查詢person表是否disablehbasemainisdisabledpersonse0row(s)in0.0730seconds//刪除person表中的一整行hbasemaindeleteallperson','jack'0row(s)in0.0230seconds//清空person表asemaintruncatepersonTruncatingpersontableitmaytakeawhile-Disablingtable...-Truncatingtable...0row(s)in2.2380seconds//設置person表不可用basemaindisableperson0row(s)in1.4280seconds//刪除person表hbasemaindropperson'0row(s)in0.3700secondsasemainlistTABLE0row(s)in0.0230seconds=>[]//關閉Shellhbasemain:0>exit用用法://安全登錄,在進入hbaseshell客戶端之前,需要進行安裝客戶端和用戶登錄的準備工作,具體需要參考CPI文檔中《安裝與使用客戶端》章節//進入HBaseshell客戶端#.bin/hbaseshellcommands.Type"exit<RETURN>"toleavetheHBaseShell ingfxtingme 示例: VERSIONS=>4}VERSIONS=>4}用法:用法:hbase>scan'.META.'hbase>scan'.META.',{COLUMNS=>'info:regioninfo'}IMITSTARTROWxyzNScTIMERANGEANDQualifierFilterhbase>scan't1',{FILTER=>hadoophbasefilterColumnPaginationFilternewfalse}hbase>scan't1',{RAW=>true,VERSIONS=>10}COMMANDGROUPS:Groupname:generalCommands:status,version,whoamiGroupname:ddlCommands:alter,alter_async,alter_status,create,describe,disable,disable_all,drop,drop_all,enable,enable_all,exists,is_disabled,is_enabled,list,show_filtersGroupname:dmlCommands:count,delete,deleteall,get,get_counter,incr,put,scan,truncateGroupname:toolsCommands:assign,balance_switch,balancer,close_region,compact,flush,hlog_roll,major_compact,move,split,unassign,zk_dumpGroupname:replicationCommands:add_peer,disable_peer,enable_peer,list_peers,remove_peer,start_replication,stop_replicationGroupname:securityCommands:grant,revoke,user_permissionHBase快照(HBaseSnapshots)是對一個表進行快照,快照不是表的復制,而是一個文件名稱列表,因而1)生成快照本操作可嘗試對指定表生成快照,如果集群在執行數據均衡、分隔或合并等操作時,可能會對生成快照操作造成影響。當要執行生成快照命令時,首先需要檢查HBase的ropertyehbasesnapshotenabledname<value>true</value>property>llsnapshothbasemainsnapshotpersonsnapshotperson0150514'0row(s)in1.2420secondsasemainlistsnapshotsSNAPSHOTTABLE+CREATIONTIMEsnapshot_person_20150514person(ThuMay1413:44:51+08002015)rowsin90seconds["snapshot_person_20150514"]2)克隆快照快照相同的結構數據構建一張新表,會生成一張有完整功能的表,對該表的任意修改都不會對原表或快照產生影響。克隆快照使用clone_snapshot命令從復制。體命令如下:hbasemainclonesnapshotsnapshotpersoncolensnapshot_person'0row(s)in0.8520seconds3)還原快照restoresnapshot照,具體命令如下:hbasemainrestoresnapshotsnapshot_person_20150514'0row(s)in0.8310seconds4)導出快照體命令如下:pachehadoophbasesnapshotExportSnapshotsnapshotsnapshotperson-copy-tohdfs://master1.hadoop:8082/hbase5)刪除快照hbasemaindeletesnapshotsnapshot_person_20150514'0row(s)in0.0220secondsregionregion種可以加快批量寫入速度的方法是通過預先創建一些空的regionsHBaseregion集群內做數據的負載均衡的性能columnfamily:每個columnfamily其實給一個新表沒太大區別所以要盡量減少columnfamily的個數InMemory:創DescriptorsetInMemorytrueRegionServerxVersionsintmaxVersionsTimeToLive:可以使用這個特性自動過期刪除沒有用處的數據?zookeeper.session.timeout(df:180000ms)?hbase.regionserver.handler.count(df:10)?hbase.hregion.max.filesize(df:256M)?hbase.regionserver.global.memstore.upperLimit/lowerLimit(0.4/0.35)?hfile.block.cache.size(df:0.2)?hbase.hstore.blockingStoreFiles(df:7)?hbase.hregion.memstore.block.multiplier(df:2)?寫速度關鍵因素oreupperLimit?hbase.hregion.memstore.block.multiplier?hbase.hstore.blockingStoreFiles?hbase.hregion.max.filesize?讀速度關鍵因素?bloomfilter;?in-memoryflag;?hfile.block.cache.size;HBase優化——客戶端優化(nativejava)?客戶端寫–多HTable并發寫–批量寫–多線程并發寫?客戶端讀–多HTable并發讀–批量讀–多線程并發讀?在可能的情況下,適當調整業務規則,順應HBase的特征,以便充分利用HBase的優勢?合理設計RowKey?少ColumnFamily(低于3個為宜)?InMemoryaxVersion?啟用LZO壓縮?JVM設置避免CMSconcurrentmodefailure在開始使用在開始使用HBaseJavaAPI之前,需要做幾項準備工作:要求JDK版本1.7及以上版本。HBasejarZooKeeperHDFSMapReduce需要和sehtml戶端安裝包//初始化配置信息Configurationconf=HBaseConfiguration.create();//創建表HBaseAdminadmin=newHBaseAdmin(conf);admin.createTable(htd);//插入一行數據HTabletable=newHTable(conf,tableName);Putput=newPut(Bytes.toBytes("012005000201"));編譯運行put.add(FAMILIES,Bytes.toBytes("name"),Bytes.toBytes("張三"));put.add(FAMILIES,Bytes.toBytes("gender"),Bytes.toBytes("男"編譯運行put.add(FAMILIES,Bytes.toBytes("address"),Bytes.toBytes("廣東省深圳市"));table.put(put);步驟1:創建一個Configuration對象各種配置信息步驟2:構建一個HTable句柄tion步驟3:執行相應的操作步驟4:關閉HTable句柄將內存數據刷新到磁盤上資源步驟1:創建一個Configuration對象Configurationconf=HbaseConfiguration.create(步驟3:執行相應的tableclose;JavaAPI示例程序通過調用HBaseConfiguration的create()方法來實例化。否則,將無法正確加載HBase中的相關配置項///安全版本Configurationconf=HBaseConfiguration.create();conf.addResource("user-hbase.xml");if(User.isHBaseSecurityEnabled(conf)){conf.set(HBASE_KEYTAB_FILE,+File.separator+conf.get(HBASE_KEYTAB_FILE));Stringkrbfilepath=System.getProperty("user.dir")+File.separator+"conf"+File.separator+"krb5.conf";SystemsetPropertyjavasecuritykrbconf",krbfilepath);try{ZKUtil.loginClient(conf,HBASE_KEYTAB_FILE,HBASE_KERBEROS_PRINCIPAL,InetAddress.getLocalHost().getCanonicalHostName());User.login(conf,HBASE_KEYTAB_FILE,HBASE_KERBEROS_PRINCIPAL,InetAddress.getLocalHost().getCanonicalHostName());}catch(IOExceptione){e.printStackTrace();}}常用Java接口–創建表通過HBaseAdmin的createTable方法來創//表名和列族名稱建一張表,指定表名、列族名稱。創建表分為快速建表和預分Region建表,前者表示創建表后整張表只有一個Region,隨著數據量的增加會自動分裂成多個Region;后者表示,創建表時預先分配多個Region,此種方法建表可以提高寫入大量數據初期的數據寫入速度StringtableName="myTable";String[]families={"f1"};//通過已有的Configuration對象實例化一個HBaseAdmin對象HBaseAdminadmin=newHBaseAdmin(config);//表的描述信息,指定表名、列族名稱HTableDescriptortableDesc=neweDescriptortableNametableDesc.addFamily(newHColumnDescriptor(families[i]));//不預分Region建表TabletableDesc//預分Region建表的兩種方式://①指定起止RowKey和Region個數;此時的起始RowKey為第一個Region的endKey,結束key為最后一個Region的startKey。ytestestoBytes//②指定RowKey數組,不包括第一個Region的startKey和最后一個Region的endKey,因此Region個數等于數組長度+1//例如以下語句創建的表包括4個Region,各Region的起止key分別為[,a),[a,k),[k,z),[z,),可以看成左閉右開區間,a屬于[a,k)這個Region,k屬于[k,z)這個Region,z屬于[z,)這個Region。skadmin.createTable(tableDesc,keys);常用Java接口–開啟壓縮方式開啟壓縮功能有利于減少HBase中數據存儲示例:的冗余數據,HBase中有兩類壓縮機制,columnDesc=newHColumnDescriptor(families[i]);HFile文件級別的壓縮Compress和//設置前綴壓縮,HBase提供了PREFIX、DIF、FAST_DIFF三種前綴壓ockEncodeHBase縮方法存儲格式是HFile,文件級別的壓縮既是針對columnDesc.setDataBlockEncoding(DataBlockEncoding.FASTHFile的壓縮,前綴壓縮式針對HFile中數據_DIFF);主要部分DataBlock進行壓縮。使用HBase//設置文件壓縮,文件壓縮通常需要安裝壓縮算法共享庫,這里建議先先壓縮功能的方法是在創建表時,針對列族在通過HColumnDescriptor類中通過接口設置//org.apache.hadoop.hbase.util.CompressionTest檢查一下壓縮算法可用性columnDesc.setCompressionType(Algorithm.SNAPPY);tableDesc.addFamily(columnDesc);HBase是一個面向列的數據庫,一行數據HBase是一個面向列的數據庫,一行數據,可能對應多個列族,而一個列族又可以對應多個列。通常,寫入數據的時候,我們需要指定要寫入的列(含列族名稱和列名稱)。如果要往HBase表中寫入一行數據,需要首先構建一個Put實例。Put中包含了數據的RowKey值和指定列(含列族名稱和列名稱)的Value值,一個RowKey的Value值可以有多個(即包含多個列)//表的名稱為personprivatestaticfinalbyte[]TABLENAME=Bytes.toBytes("person");//列族名稱的名稱為privateInfoprivatestaticfinalbyte[]FAMILIES=stoBytesprivateInfo//列族privateInfo中有兩個列name和addressprivatestaticfinalbyte[][]qualifiers={Byt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論