《Hadoop技術(shù)原理》課件-13.Hadoop核心數(shù)據(jù)庫_第1頁
《Hadoop技術(shù)原理》課件-13.Hadoop核心數(shù)據(jù)庫_第2頁
《Hadoop技術(shù)原理》課件-13.Hadoop核心數(shù)據(jù)庫_第3頁
《Hadoop技術(shù)原理》課件-13.Hadoop核心數(shù)據(jù)庫_第4頁
《Hadoop技術(shù)原理》課件-13.Hadoop核心數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Hadoop技術(shù)原理1.Hbase表設計Hbase表設計01HBase表設計01RowKey的設計建表預分區(qū)列簇設計(包括列簇屬性設計)HBase表設計02設計表需要解決的問題1.行鍵結(jié)構(gòu)應該是什么,應該包含什么?2.該表應有多少列族?3.哪些數(shù)據(jù)進入哪個列族?4.每個列族中有多少列?5.列名應該是什么?盡管在創(chuàng)建表時不需要定義列名,但是在寫入或讀取數(shù)據(jù)時需要知道它們。6.什么信息應該進入單元?7.每個單元應存儲多少個版本?RowKey的設計03熱點現(xiàn)象:某個小的時段內(nèi),對HBase的讀寫請求集中到極少數(shù)的Region上,導致這些Region所在的RegionServer處理請求量驟增,負載量明顯偏大,而其他的RegionServer明顯空閑。熱點現(xiàn)象出現(xiàn)的原因,往往就是因為HBase表設計時,RowKey設計不合理造成的熱點現(xiàn)象解決辦法:RowKey的隨機散列+創(chuàng)表預分區(qū)RowKey的設計04RowKey設計原則總的原則:避免熱點現(xiàn)象,提高讀寫性能長度原則:最大長度64KB,開發(fā)通常10~100個字節(jié),建議不超過16字節(jié)(hbase每個單元格以keyvalue進行存儲的,因此都會存儲rowkey)散列原則:將時間上連續(xù)產(chǎn)生的rowkey散列化,以避免集中到極少數(shù)Region上唯一原則:必須在設計上保證rowkey的唯一性RowKey設計結(jié)合業(yè)務在滿足rowkey設計原則的基礎上,往往需要將經(jīng)常用于查詢的字段整合到rowkey上,以提高檢索查詢效率列簇屬性05目的創(chuàng)建HBase時,就預先根據(jù)可能的RowKey劃分出多個Region而不是默認的一個,從而可以將后續(xù)的讀寫操作負載均衡到不同的Region上,避免熱點現(xiàn)象原則:HBase表的預分區(qū)需要緊密結(jié)合業(yè)務場景來選擇分區(qū)的key值,每個region都有一個startKey和一個endKey來表示該region存儲的rowKey范圍。列簇屬性06方式(四種):create'ns1:t1','f1',SPLITS=>['10','20','30','40']create't1','f1',SPLITS_FILE=>'splits.txt',OWNER=>'johndoe'其中splits.txt文件內(nèi)容是每行一個rowkey值create't1','f1',{NUMREGIONS=>15,SPLITALGO=>'HexStringSplit'}JavaAPI列簇屬性07列簇屬性08可配置的數(shù)據(jù)塊大小BLOCKSIZE數(shù)據(jù)塊緩存BLOCKCACHEIN_MEMORY緩存布隆過濾器BLOOMFILTERTTL單元格存活時間多版本VERSIONScreate'ns1:t1',{NAME=>'f1',VERSIONS=>5}壓縮SNAPPY壓縮配置COMPRESSION多列簇09create't1',{NAME=>'f1'},{NAME=>'f2'},{NAME=>'f3'}可對每個列簇單獨設置各種屬性值create't1','f1','f2','f3'啟用SNAPPY壓縮10給hadoop集群正確安裝snappy壓縮拷貝hadoop/lib下的native下的所有so文件和hadoop-snappy-0.0.1-SNAPSHOT.jar到hbase/lib下面如果有多臺機器,每臺機器都要拷貝分發(fā)拷貝完成后,重啟hbase集群執(zhí)行命令驗證snappy是否驗證成功,如果打印succes,即安裝成功啟用SNAPPY壓縮11$bin/hbaseorg.apache.hadoop.hbase.util.CompressionTest/home/ibeifeng/zookeeper.outsnappy啟用SNAPPY壓縮12$exportHBASE_HOME=/opt/modules/hbase-0.98.6-cdh5.3.6$exportHADOOP_SNAPPY_HOME=/opt/modules/hadoop-snappy-0.0.1-SNAPSHOT$exportHADOOP_HOME=/opt/modules/hadoop-2.5.0-cdh5.3.6$

cp$HADOOP_SNAPPY_HOME/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar$HBASE_HOME/lib$

mkdir-plib/native/Linux-amd64-64$

ln-s$HADOOP_HOME/lib/native/*

$HBASE_HOME/lib/native/Linux-amd64-64RestartHBaseCluster啟用SNAPPY壓縮13啟用SNAPPY壓縮14Hadoop技術(shù)原理2.Hbase優(yōu)化Hbase優(yōu)化01垃圾回收參數(shù)配置01堆內(nèi)存:新生代、老生代,新生代空間大小一般為128~512M,老生代可達幾GB,數(shù)據(jù)在新生代停留時間過長,就會轉(zhuǎn)移到老生代中主要需要調(diào)節(jié)的是RegionServer節(jié)點的的JVM垃圾回收參數(shù)垃圾回收策略:ParrallelNewCollector垃圾回收策略、并行標記回收器(ConcurrentMark-SweepCollector),避免GC停頓exportHBASE_REGIONSERVER_OPTS=”-Xmx8g-Xms8G-Xmn128m-XX:UseParNewGC-XX:UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=70-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log”垃圾回收參數(shù)配置02Memstore&BlockCacheHBase上Regionserver的內(nèi)存分為兩個部分,一部分作為Memstore,主要用來寫;另外一部分作為BlockCache,主要用于讀。寫請求會先寫入Memstore,Regionserver會給每個region提供一個Memstore,當Memstore滿128MB(hbase.hregion.memstore.flush.size)以后,會啟動flush刷新到磁盤。當Memstore的總大小超過限制時(heapsize*hbase.regionserver.global.memstore.upperLimit*0.9),會強行啟動flush進程,從最大的Memstore開始flush直到低于限制。讀請求先到Memstore中查數(shù)據(jù),查不到就到BlockCache中查,再查不到就會到磁盤上讀,并把讀的結(jié)果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache達到上限(heapsize*hfile.block.cache.size*0.85)后,會啟動淘汰機制,淘汰掉最老的一批數(shù)據(jù)。在注重讀響應時間的應用場景下,可以將BlockCache設置大些,Memstore設置小些,以加大緩存的命中率。HBase內(nèi)存管理03Memstore&BlockCacheHBase內(nèi)存管理04BlockCache將Cache分級思想的好處在于:首先,通過inMemory類型Cache,可以有選擇地將in-memory的columnfamilies放到RegionServer內(nèi)存中,例如Meta元數(shù)據(jù)信息;通過區(qū)分Single和Multi類型Cache,可以防止由于Scan操作帶來的Cache頻繁顛簸,將最少使用的Block加入到淘汰算法中。HBase內(nèi)存管理05BlockCache默認配置下,對于整個BlockCache的內(nèi)存,又按照以下百分比分配給Single、Multi、InMemory使用:0.25、0.50和0.25。其中InMemory隊列用于保存HBaseMeta表元數(shù)據(jù)信息,因此如果將數(shù)據(jù)量很大的用戶表設置為InMemory的話,可能會導致Meta表緩存失效,進而對整個集群的性能產(chǎn)生影響。HBase內(nèi)存管理06本地MemStore緩存MemStore刷寫數(shù)據(jù)到磁盤,造成RegionServer內(nèi)存碎片增多,當生存時間較長的數(shù)據(jù)從堆的老生代空間刷寫到磁盤,就會產(chǎn)生內(nèi)存孔洞。由于碎片過多導致沒有足夠大的連續(xù)內(nèi)存空間,JVM就會暫停工作進程,進行垃圾回收,導致HBase的RegionServer對外服務停頓本地MemStore緩存機制:啟用本地memstore分配緩存區(qū)(Memstore-LocalAllocationBuffers,MSLAB),也就是允許從堆中分配相同大小的對象,一旦這些對象分配并且最終被回收,就會在堆中留下固定大小的孔洞,這些孔洞可被重復利用,GC就無需使應用程序進程停頓來進行回收內(nèi)存空間,配置參數(shù)hbase.hregion.memstore.mslab.enabled,默認為true啟用SNAPPY壓縮07Compact和SplitHRegoinServer上的storefile文件是被后臺線程監(jiān)控的,以確保這些文件保持在可控狀態(tài)。磁盤上的storefile的數(shù)量會隨著越來越多的memstore被刷新而變等于越來越多——每次刷新都會生成一個storefile文件。當storefile數(shù)量滿足一定條件時(可以通過配置參數(shù)類調(diào)整),會觸發(fā)文件合并操作——minorcompaction,將多個比較小的storefile合并成一個大的storefile文件,直到合并的文件大到超過單個文件配置允許的最大值時會觸發(fā)一次region的自動分割,即regionsplit操作,將一個region平分成2個。啟用SNAPPY壓縮08Compactionminorcompaction,輕量級將符合條件的最早生成的幾個storefile合并生成一個大的storefile文件,它不會刪除被標記為“刪除”的數(shù)據(jù)和以過期的數(shù)據(jù),并且執(zhí)行過一次minor合并操作后還會有多個storefile文件。majorcompaction,重量級把所有的storefile合并成一個單一的storefile文件,在文件合并期間系統(tǒng)會刪除標記為"刪除"標記的數(shù)據(jù)和過期失效的數(shù)據(jù),同時會block所有客戶端對該操作所屬的region的請求直到合并完畢,最后刪除已合并的storefile文件。預創(chuàng)建Region09HBase二級索引協(xié)處理器:將部分處理邏輯移到服務端進行執(zhí)行,充分利用分布式并發(fā)優(yōu)勢Observer類協(xié)處理器,類似于關(guān)系型數(shù)據(jù)庫的觸發(fā)器Endpoint類協(xié)處理器,類似于關(guān)系型數(shù)據(jù)庫中的存儲過程二級索引概念使用Phoenix實現(xiàn)HBase表的二級索引預創(chuàng)建Region10HBase二級索引介紹HBase提供了檢索數(shù)據(jù)的功能,不過原有系統(tǒng)僅提供了通過rowkey檢索數(shù)據(jù)的功能,過于單一,不靈活,一旦查詢條件改變了往往設計到要全表掃面過濾,極大浪費機器物理資源,又達不到實時的一個效果。HBase二級索引功能解決了原有HBase系統(tǒng)中僅能夠通過rowkey檢索數(shù)據(jù)的問題,使得用戶能夠指定多種條件,在HBase表中進行數(shù)據(jù)的實時檢索與統(tǒng)計。它提供了強大的數(shù)據(jù)檢索功能。HBase只提供了一個基于字典排序的主鍵索引,在查詢中你只能通過行鍵查詢或掃描全表來獲取數(shù)據(jù)HBase基于rowkey的全局索引:Zookeeper的znode節(jié)點/hbase/meta-region-server-->hbase:mata預創(chuàng)建Region11HBase二級索引實現(xiàn)思路預創(chuàng)建Region12HBase二級索引實現(xiàn)的方案一使用HBase的coprocessorCoProcessor相當于HBase的Observer+hook,目前支持MasterObserver、RegionObserver和WALObserver,基本上對于HBaseTable的管理、數(shù)據(jù)的Put、Delete、Get等操作都可以找到對應的pre***和post***。這樣如果需要對于某一項Column建立SecondaryIndexing,就可以在Put、Delete的時候,將其信息更新到另外一張索引表中。對于Indexing里面的value值是否存儲的問題,可以根據(jù)需要進行控制,如果value的空間開銷不大,逆向的檢索又比較頻繁,可以直接存儲在IndexingTable中,反之則避免這種情況。預創(chuàng)建Region13HBase二級索引實現(xiàn)的方案一預創(chuàng)建Region14HBase二級索引實現(xiàn)的方案二由客戶端發(fā)起對于主表和索引表的Put、Delete操作的雙重操作它具體的做法總結(jié)起來有:設置主表的TTL(TimeToLive)比索引表小一點,讓其略早一點消亡。不要在IndexingTable存儲Value值。Put操作時,對于操作的主表的所有列,使用同一的LocalTimeStamp的值,更新到IndexingTable,然后使用該TimeStamp插入主表數(shù)據(jù)。Delete操作時,首先操作主表的數(shù)據(jù),然后再去更新IndexingTable的數(shù)據(jù)。Hadoop技術(shù)原理3.使用HBasePhoenix運行SQL操作HBasePhoenix運行SQL操作01Phoenix簡介01SQLONHBase構(gòu)建在ApacheHBase(列式大數(shù)據(jù)存儲)之上的一個SQL中間層,實現(xiàn)SQL訪問HBase表數(shù)據(jù),實現(xiàn)HBase表多條件查詢不同于HiveonHBase的方式,Phoenix將QueryPlan直接使用HBaseAPI實現(xiàn),目的是規(guī)避MapReduce框架,減少查詢的時間延遲;Phoenix中SQLQueryPlan的執(zhí)行,基本上是通過構(gòu)建一系列的Hbasescan來完成Phoenix安裝部署使用02版本選擇下載Phoenix-4.2.2源碼/dist/phoenix/phoenix-4.2.2/src/上傳源碼包到服務器,解壓,編譯安裝關(guān)聯(lián)HBasePhoenix安裝部署使用03版本選擇官方已編譯好的Phoenix安裝包,其中Phoenix-4.2.2對應hbase-0.98.4,Phoenix-4.3.0對應hbase-0.98.9,而我們使用的hbase版本是0.98.6,則需要基于Phoenix-4.2.2源碼重新編譯。Phoenix安裝部署使用04編譯使用maven編譯前,修改項目的pom.xml文件,指定hadoop、hbase版本,然后執(zhí)行mvncleanpackage-DskipTestsPhoenix安裝部署使用05如果依賴cdh版本的hadoop和hbase,則修改相應的版本為:還需要在pom.xml中添加cdh的源編譯Phoenix安裝部署使用06安裝編譯好后,在解壓編譯目錄下,找到Phoenix-assembly子目錄,找到phoenix的tar包將該tar包解壓到/opt/modules目錄下$tar-zxvfphoenix-4.2.2.tar.gz-C/opt/modules/Phoenix安裝部署使用07關(guān)聯(lián)HBase在安裝目錄下找到phoenix-4.2.2-client.jar和lib/phoenix-core.4.2.2.jar依賴包,拷貝到HBase的每個RegionServer節(jié)點的lib目錄下,然后重啟hbase,注意hbase集群是否能夠正常重啟拷貝HBase中的hbase-site.xml文件里面的內(nèi)容到phoenix安裝目錄的bin目錄下的hbase-site.xml文件中PhoenixShell08Phoenix連接HBase,執(zhí)行bin/sqlline.pybin/sqlline.pyzookeeper_host:2181訪問hbase加載數(shù)據(jù)到HBase表中bin/psql.pybin/psql.py-texample:2181~/example.csvPhoenixShell09Phoenix映射HBase原有的表安裝好phoenix后對于HBase中已經(jīng)存在的數(shù)據(jù)表不會自動進行映射,所以想要再phoenix中操作HBase已有數(shù)據(jù)表就需要手動進行配置HBase數(shù)據(jù)表默認主鍵列名是ROW案例:先在hbase上創(chuàng)建一張表create'phoenix','info'插入幾行記錄:

put'phoenix','row001','info:name','phoenix'put'phoenix','row002','info:name','hbase'createtable"phoenix"(ROWvarcharprimarykey,"info"."name"varchar);這里一定要注意的是表名和列族以及列名需要用雙引號括起來,因為HBase是區(qū)分大小寫的,如果不用雙引號括起來的話Phoenix在創(chuàng)建表的時候會自動將小寫轉(zhuǎn)換為大寫字母,這樣HBase中會創(chuàng)建另外一張表PHOENIXPhoenixShell10PhoenixShell創(chuàng)建表createtabletest.test1(idbigintprimarykey,namevarchar);插入數(shù)據(jù)upsertintotest.test1(id,name)values(1,'aaaa');刪除數(shù)據(jù)deletefromtest.test1;刪除表droptabletest.test1;Phoenix語法:http://forcedotcom.github.io/phoenix/PhoenixShell11PhoenixShell常見問題一警告原因:依賴的hadoop-common-2.2.jar包中core-default.xml沒有配置fs.hdfs.impl的屬性解決辦法PhoenixShell12PhoenixShell常見問題二缺失servletjar包(cdh版本編譯)解決辦法:將javax.servlet依賴包下載到,加到phoenix的lib目錄下PhoenixShell13PhoenixJavaAPI創(chuàng)建maven項目到重新編譯好的Phoenix目錄下,將phoenix-4.2.2-client.jar和phoenix-core-4.2.2.jar添加到項目的classpath中Java以jdbc方式訪問步驟加載驅(qū)動類Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");獲取連接對象使用連接對象,執(zhí)行sql語句處理查詢結(jié)果關(guān)閉連接Hadoop技術(shù)原理4.使用HBasePhoenix運行SQL操作HBasePhoenix運行SQL操作01創(chuàng)建HBase表二級索引01為什么需要HBase二級索引?

HBase里面只有rowkey作為一級索引,如果要對庫里的非rowkey字段進行數(shù)據(jù)檢索和查詢,往往要通過MapReduce/Spark等分布式計算框架進行,硬件資源消耗和時間延遲都會比較高。 為了HBase的數(shù)據(jù)查詢更高效、適應更多的場景,諸如使用非rowkey字段檢索也能做到秒級響應,或者支持各個字段進行模糊查詢和多字段組合查詢等,因此需要在HBase上面構(gòu)建二級索引,以滿足現(xiàn)實中更復雜多樣的業(yè)務需求。使用Phoenix提供的二級索引,可以避免HBase在查詢數(shù)據(jù)時全表掃描,提高查過性能,提升查詢效率創(chuàng)建HBase表二級索引02配置HBase以支持SecondaryIndex在每一個RegionServer的hbase-site.xml中加入如下的屬性:在每一個Master的hbase-site.xml中加入如下的屬性:創(chuàng)建HBase表二級索引03聯(lián)通營業(yè)廳通話詳單查詢項目案例表:call-detail通話詳單表tel-net-flow上網(wǎng)流量表tel-net-detail手機上網(wǎng)記錄call-detail通話詳單表04CREATETABLEcall_detail(telPhoneNovarcharnotnull,

telTimestampvarcharnotnull,

varchar,

user.birthvarchar,

user.sexchar(1), info.addrvarchar,

info.callTypevarchar,

info.othervarchar,

info.durationdouble,

info.telTypevarchar, info.moneydoubleCONSTRAINTPKPRIMARYKEY(telPhoneNo,telTimestamp));詳單表el-net-flow上網(wǎng)流量表05CREATETABLEtel_net_flow(telPhoneNovarchar, telTimestampvarchar, varchar, user.birthvarchar, user.sexvarchar, info.addrvarchar, info.telTypevarchar, info.chargeTypevarchar, info.isDirectvarchar,info.totalFlowAmtdouble, info.telMoneydoubleCONSTRAINTPKPRIMARYKEY(telPhoneNo,telTimestamp));上網(wǎng)流量表el-net-flow上網(wǎng)流量表06CREATETABLEtel_net_detail(telPhoneNovarchar,

telTimestampvarchar,

varchar,

user.birthvarchar,

user.sexvarchar,

info.buziTypevarchar,

info.flowTypevarchar,Addrvarchar,

NamevarchaCONSTRAINTPKPRIMARYKEY(telPhoneNo,telTimestamp));上網(wǎng)記錄創(chuàng)建HBase表二級索引07CoveredIndexes(覆蓋索引)Functionalindexes(函數(shù)索引)Globalindexes(全局索引)Localindexes(本地索引)索引類型創(chuàng)建HBase表二級索引08覆蓋索引:只需要通過索引就能返回所要查詢的數(shù)據(jù),所以索引的列必須包含所需查詢的列(SELECT的列和WHRER的列)實例:call-detail通話詳單表創(chuàng)建基于info.callType的覆蓋索引并綁定info.addr列上的數(shù)據(jù)CREATEINDEXCALLDETAILINDEXONcall_detail(info.callType)INCLUDE(info.addr)創(chuàng)建HBase表二級索引09從Phoeinx4.3以上就支持函數(shù)索引,其索引不局限于列,可以合適任意的表達式來創(chuàng)建索引,當在查詢時用到了這些表達式時就直接返回表達式結(jié)果示例:使用UPPER函數(shù)創(chuàng)建函數(shù)索引使查詢出的USERID和URL里字母都是大寫的創(chuàng)建函數(shù)索引CREATEINDEXUPPERINDEXONCSVTABLES(UPPER(USERID||''||URL))函數(shù)索引創(chuàng)建HBase表二級索引10全局索引適用于多讀少寫的場景,在寫操作上會給性能帶來極大的開銷,因為所有的更新和寫操作(DELETE,UPSERTVALUES和UPSERTSELECT)都會引起索引的更新,在讀數(shù)據(jù)時,Phoenix將通過索引表來達到快速查詢的目的在用使用全局索引之前需要在每個RegionServer上的hbase-site.xml添加如下屬性:全局索引創(chuàng)建HBase表二級索引11創(chuàng)建全局索引:CREATEINDEXcall_detail_globalindexoncall_detail(,telPhoneNo);全局索引創(chuàng)建HBase表二級索引12本地索引適用于寫多讀少,空間有限的場景,和全局索引一樣,Phoneix在查詢時會自動選擇是否使用本地索引,使用本地索引,為避免進行寫操作所帶來的網(wǎng)絡開銷,索引數(shù)據(jù)和表數(shù)據(jù)都存放在相同的服務器中,當查詢的字段不完全是索引字段時本地索引也會被使用,與全局索引不同的是,所有的本地索引都單獨存儲在同一張共享表中,由于無法預先確定region的位置,所以在讀取數(shù)據(jù)時會檢查每個region上的數(shù)據(jù)因而帶來一定性能開銷。在使用本地索引需要在Master的hbase-site.xml添加以下屬性本地索引創(chuàng)建HBase表二級索引13創(chuàng)建本地索引CREATELOCALINDEXcall_detail_localindexONcall_detail();本地索引Hadoop技術(shù)原理5.HBase存儲設計HBase存儲設計01LSM存儲思想01LSM存儲思想LSM是日志合并樹mysql使用的B+樹LSM樹存儲引擎和B+樹存儲引擎一樣,通過批量存儲技術(shù)規(guī)避磁盤隨機寫入問題。LSM樹和B+樹對比,犧牲了部分讀性能,用來大幅提供寫性能LSM樹核心思想就是放棄部分的讀性能,換取寫的最大化能力HBaseRegion解析02什么是region?hbase將數(shù)據(jù)分布在各個節(jié)點的regionserver上,每一個regionserver節(jié)點又將數(shù)據(jù)存儲在各自的region上,從用戶的角度看region就是hbase存儲數(shù)據(jù)的基本單元每一個region都會存儲在一個確定的regionserver上,不會同一個region出現(xiàn)在兩個regionserver上,region的數(shù)據(jù)之間是一種互斥關(guān)系HBaseRegion解析03hbase表在行鍵的方向上分割為多個region,region是hbase分布式存儲和負載均衡的最小單元用戶不斷向hbase表插入數(shù)據(jù),當數(shù)據(jù)到達某個閾值時,hbase表就會進行水平拆分region在regionserver的運行中可能會發(fā)生移動1.master的負載均衡策略2.或者某一個regionserver掛了每一個region都有3個信息標識它自己:TableName,StartRowkey,CreateTimeHBaseRegion解析04region是hbase分布式存儲和負載均衡的最小單元注意:region是負載均衡的最小單元,并不是存儲的最小單元(最小存儲單元是HFile)region的數(shù)量過多,會造成查詢效率降低,因為去尋找某一行數(shù)據(jù)的時候,需要尋找的文件數(shù)量偏多region特點05region的數(shù)量太少,會妨礙可擴展性,降低并行處理能力比如:有3臺服務器,所有的region都存儲在這一臺服務器上,那么這一臺服務器的壓力過大,導致性能下降建議:region的數(shù)量不要低于集群中節(jié)點的數(shù)量region特點06region的拆分操作是自動完成的,對外不可見,region的拆分是由regionserver完成的,并且master不會參與其中regionserver拆分region的步驟是:先將region下線,然后對其拆分將拆分的子region信息寫入meta表再將這些子region加入到regionserver上最后把信息同步到master上,使其知道這件事region的拆分策略07什么是Compaction?Compaction會從一個Region的Store中,選擇一些StoreFile文件進行合并。合并的原理很簡單,先從待合并的數(shù)據(jù)中讀出KeyValue數(shù)據(jù),再按照由小到大排列后寫入一個新的文件里邊,最后這個新生成的文件就會取代之前所有待合并的文件對外提供服務region的拆分策略08為什么要有Compaction操作?隨著系統(tǒng)不停的刷寫,會導致存儲目錄中保存有過多的數(shù)據(jù)文件。文件太多會導致維護困難,而且不利于數(shù)據(jù)查找,會急速的降低數(shù)據(jù)查詢的效率。所以,需要有一個這樣的機制,將文件由多變少HBaseCompaction解析09舉個例子:假如,我們有一堆數(shù)據(jù)文件,假設是10個數(shù)據(jù)文件?,F(xiàn)在我們需要查詢一條數(shù)據(jù)的話,要對這10個文件打開關(guān)閉打開關(guān)閉,每一次對文件進行I/O的時候其實效率是非常低的。特別是在打開文件,獲得文件句柄的時候,效率非常非常低。而且,10個文件在文件命名以及文件管理方面都會成為瓶頸。那假如我們現(xiàn)在有一個合并操作,將10個小文件合并成1個大文件。我們再去查詢數(shù)據(jù)的時候,只需要對這一個大文件進行打開,然后查找,再關(guān)閉。這樣的話,效率會提升很多。因為查找的效率是很高的,而打開和關(guān)閉非常耗時,非常消耗系統(tǒng)資源。而且,我們只有一個文件,管理將會非常方便HBaseCompaction解析10Compaction分類Compaction分為兩類:第一類叫MinorCompaction,也叫作小合并;第二類叫MajorCompaction,叫作大合并MinorCompaction,選取一些小的、相鄰的StoreFile將它們合并成更大的StoreFileMajorCompaction,是指將所有的StoreFile合并成一個大的StoreFile。這個過程會清理三類沒有意義的數(shù)據(jù)HBaseCompaction解析11第一類是被刪除的數(shù)據(jù),就是KeyType類型為Delete、DeleteColumn、DeleteFamily的數(shù)據(jù)第二類TTL過期的數(shù)據(jù),就是,你的列族數(shù)據(jù)如果設置了TTL的話,如果在合并的過程中發(fā)現(xiàn)它過期了,那么也會被隨之刪除第三類,版本號超過了設定版本號的數(shù)據(jù)。比如,你的列族設置的版本號是3,當你對一個列連續(xù)存儲了4次數(shù)據(jù)之后,最先存儲的那個數(shù)據(jù)就會被刪除掉注意:一般來說,Major

Compaction的時間持續(xù)比較長,整個過程會消耗大量的系統(tǒng)資源,對上層業(yè)務有比較大的影響。因此,線上業(yè)務都會將自動觸發(fā)的MajorCompaction任務關(guān)閉掉。改為手動在業(yè)務低峰期的時候觸發(fā),同時,這也是一個非常重要的系統(tǒng)優(yōu)化點HBaseCompaction解析12Compaction觸發(fā)時機,有三種因素:第一種叫MemStoreFlush。應該說compaction的源頭就來自于flush操作。flush指的就是內(nèi)存中的數(shù)據(jù)刷新到硬盤上。MemStoreflush會產(chǎn)生HFile文件,那么文件越來越多就需要compaction。因此,在每次執(zhí)行完flush操作之后,都會對當前Store中的文件進行判斷。一旦,文件的數(shù)量超過閾值,就會觸發(fā)一個compaction;需要說明的是,compaction都是以Store為單位進行的,而在Flush觸發(fā)條件下,整個Region的所有Store都會執(zhí)行compaction,所以會在短時間內(nèi)執(zhí)行多次compaction;HBaseCompaction解析13第二種是后臺線程周期性的檢查。后臺的線程叫作CompactionChecker,它會定期的觸發(fā)檢查,是否需要執(zhí)行compaction。該線程優(yōu)先檢查文件數(shù)是否超過閾值,一旦滿足就會觸發(fā)compaction。如果不滿足,它會接著檢查是否滿足majorcompaction條件。規(guī)則是,如果當前Store中HFile的最早更新時間<mcTime值,就會觸發(fā)majorcompaction。mcTime是一個浮動值,浮動區(qū)間默認為[7-7*0.2,7+7*0.2]。其中,7是hbase.hregion.majorcompaction屬性決定的,0.2是hbase.hregion.majorcompaction.jitter屬性決定的??梢?,默認7天左右就會執(zhí)行一次majorcompaction。用戶如果想禁用majorcompaction,只需要將屬性hbase.hregion.majorcompaction設置為0HBaseCompaction解析第三種是手動觸發(fā)。一般來講,手動觸發(fā)compaction通常是為了執(zhí)行majorcompaction,原因有三個:很多業(yè)務會擔心自動的majorcompaction會影響讀寫性能。因此,會選擇在低峰期手動完成觸發(fā)可能用戶執(zhí)行完了alter修改了數(shù)據(jù)表結(jié)構(gòu)之后,希望立刻生效,執(zhí)行下手動觸發(fā)major

compaction讓數(shù)據(jù)清理和合并一下,讓整個業(yè)務重新生效一次HBase管理員發(fā)現(xiàn)硬盤容量不夠的情況下,會手動觸發(fā)major

compaction。這樣會刪除大量的hbase過期數(shù)據(jù)14Hadoop技術(shù)原理6.HBase與Hive的集成HBase與Hive的集成01如何集成Hbase與Hive011、原因:hbase不支持sql語句的查詢 2、集成步驟修改hive-site.xml文件 <!--配置zookeeper所在的節(jié)點的主機名--> <property> <name>hbase.zookeeper.quorum</name> <value>bd-server1</value> </property>將相關(guān)的hbase的jar包拷貝到hive的lib目錄下(已經(jīng)整理成了hbase2hive.tar.gz) tar-zxvfhbase2hive-jar.tar.gz-C/opt/cdh5/hive-1.1.0-cdh5.14.2/lib/如何集成Hbase與Hive3、hbase到hive的映射表注意:創(chuàng)建表的操作都是在hive中完成的在hiveshell命令行創(chuàng)建stu_info表 createexternaltablestu_info( uidint, namestring, agestring, genderstring, citystring )02如何集成Hbase與HiveSTOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,info:name,info:age,info:gender,contact:city")TBLPROPERTIES(""="school:stu_info");注意事項: hbase映射表如果沒有值,那么在hive端select出來的是NULL hive需要創(chuàng)建外部表 hive建表的時候,不需要把hbase所有列都包含進去,需要哪一列就寫哪一列 在hive中刪除stu_info表,不會對hbase的school:stu_info表造成任何影響03如何集成Hbase與Hive4、hive到hbase的映射表在hiveshell命令行創(chuàng)建hive2hbase_emp表 createtablehive2hbase_emp(

empnoint, enamestring, jobstring, mgrint, hiredatestring, saldouble, commdouble, deptnoint )04如何集成Hbase與HiveSTOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,info:name,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")TBLPROPERTIES(""="emp");05如何集成Hbase與Hive向hive2hbase_emp表加載數(shù)據(jù)insertintohive2hbase_empselect*fromemp;#注意:不能使用loaddata加載數(shù)據(jù)了在hbaseshell命令行查看emp表的數(shù)據(jù)scan'emp'在hiveshell命令行刪除hive2hbase_emp表droptablehive2hbase_emp;在hbaseshell命令行查看emp表,會發(fā)現(xiàn)已經(jīng)被刪除了list06Hbase與Hive集成的原理Hive與HBase利用兩者本身對外的API來實現(xiàn)整合主要是靠HBaseStorageHandler進行通信,利用HBaseStorageHandlerHive可以獲取到Hive表對應的HBase表名,列簇以及列,InputFormat和OutputFormat類,創(chuàng)建和刪除HBase表等Hive訪問HBase中表數(shù)據(jù)實質(zhì)上是通過MapReduce讀取HBase表數(shù)據(jù)其實現(xiàn)是在MR中,使用HiveHBaseTableInputFormat完成對HBase表的切分,獲取RecordReader對象來讀取數(shù)據(jù)。對HBase表的切分原則是一個Region切分成一個Split,即表中有多少個Regions,MR中就有多少個Map。讀取HBase表數(shù)據(jù)都是通過構(gòu)建Scanner,對表進行全表掃描,如果有過濾條件,則轉(zhuǎn)化為Filter。當過濾條件為rowkey時,則轉(zhuǎn)化為對rowkey的過濾,Scanner通過RPC調(diào)用RegionServer的next()來獲取數(shù)據(jù)07Hbase與Hive集成的原理08Hbase與Hive集成的應用場景通過Hive把數(shù)據(jù)加載到HBase中,數(shù)據(jù)源可以是文件也可以是Hive中的表。通過整合,讓HBase支持JOIN、GROUP等SQL查詢語法。通過整合,不僅可完成HBase的數(shù)據(jù)實時查詢,也可以使用Hive查詢HBase中的數(shù)據(jù)完成復雜的數(shù)據(jù)分析。09Hbase與Hive集成的應用場景將ETL操作的數(shù)據(jù)存入Hbase10Hbase與Hive集成的應用場景HBase作為Hive的數(shù)據(jù)源11Hbase與Hive集成的應用場景構(gòu)建低延時的數(shù)據(jù)倉庫12Hadoop技術(shù)原理7.HBase導入工具HBase導入工具01importTSV01運行importtsv工具,查看使用幫助信息可以將文本文件導入到hbase表中,要求文件的分隔符為制表符創(chuàng)建測試文件test.tsv,內(nèi)容如下: row-1001 xiaozhang 24 row-1002 xiaoli 22 row-1003 xiaowang 20 #注意:列使用制表符分隔importTSV把test.tsv文件上傳到hdfs上bin/hdfsdfs-put/opt/datas/test.tsv/使用importtsv工具把test.tsv數(shù)據(jù)導入到hbase的school:stu_test表中bin/yarnjar/opt/cdh5/hbase-1.2.0-cdh5.14.2/lib/hbase-server-1.2.0-cdh5.14.2.jarimporttsv-Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:ageschool:stu_test/test.tsv擴展:importtsv不僅僅可以導制表符分隔的數(shù)據(jù),還可以導入csv格式的文件(指用逗號分隔的文件)02importTSV創(chuàng)建測試文件test2.csv,內(nèi)容如下: row-2001,xiaodu,19 row-2002,xiaozhao,20 row-2003,xiaochen,21把test2.csv上傳到hdfs執(zhí)行命令

bin/yarnjar/opt/cdh5/hbase-1.2.0-cdh5.14.2/lib/hbase-server-1.2.0-cdh5.14.2.jarimporttsv-

Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age-Dimporttsv.separator=,school:stu_test/test2.csv03completebulkload功能:只能將HFile格式的文件導入到hbase表中演示completebulkload導入數(shù)據(jù)首先,使用importtsv工具把tsv文件轉(zhuǎn)換為HFile然后,使用completebulkload把轉(zhuǎn)換后的HFile文件導入hbase表中創(chuàng)建測試文件bulkload_test.tsv,內(nèi)容如下:rowkey-1 zhangsan 18rowkey-2 lisi 20rowkey-3 wangwu 1804completebulkload把bulkload_test.tsv上傳到hdfs根目錄下bin/hdfsdfs-put/opt/datas/bulkload_test.tsv/使用importtsv工具把bulkload_test.tsv文件轉(zhuǎn)換為HFile文件,-Dimporttsv.bulk.outputbin/yarnjar/opt/cdh5/hbase-1.2.0-cdh5.14.2/lib/hbase-server-1.2.0-cdh5.14.2.jarimporttsv-

Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:age-Dimporttsv.bulk.output=/hfile

school:stu_test/bulkload_test.tsv到hdfs的/hfile目錄下查看是否轉(zhuǎn)換為HFile文件使用completebulkload把轉(zhuǎn)換后的HFile文件導入到school:stu_test表中bin/yarnjar/opt/cdh5/hbase-1.2.0-cdh5.14.2/lib/hbase-server-1.2.0-cdh5.14.2.jar

completebulkload/hfileschool:stu_test05CopyTableCopyTable是Hbase提供的一個數(shù)據(jù)同步工具

溫馨提示

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

評論

0/150

提交評論