尚硅谷大數(shù)據(jù)技術之hbase_第1頁
尚硅谷大數(shù)據(jù)技術之hbase_第2頁
尚硅谷大數(shù)據(jù)技術之hbase_第3頁
尚硅谷大數(shù)據(jù)技術之hbase_第4頁
尚硅谷大數(shù)據(jù)技術之hbase_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、尚硅谷大數(shù)據(jù)技術之 HBase 基礎(作者:盡際)官網(wǎng):http一、HBase 的HBase 的原型是的 BigTable,受到了該思想的啟發(fā),目前作為 Hadoop 的子項目來開發(fā)維護,用于支持結構化的數(shù)據(jù):。* 2006 年BigTable 白皮書* 2006 年開始開發(fā) HBase* 2008 年北京成功開奧運會,程序員默默地將 HBase 弄成了 Hadoop 的子項目* 2010 年 HBase 成為 Apache 頂級項目* 現(xiàn)在很多公司二次開發(fā)出了很多版本,你也開始使用了二、基于Hadoop的HBase架構HBase 內置有 zookeeper,但一般我們會有其他的 Zookee

2、per 集群來監(jiān)管 master 和regionserver,Zookeeper 通過,保證任何時候,集群中只有一個活躍的 HMaster,HMaster 與 HRegionServer 啟動時會向ZooKeeper所有 HRegion 的尋址,實時HRegionserver 的上線和下線信息。并實時通知給 HMaster,HBase 的schema 和 table 元數(shù)據(jù),默認情況下,HBase 管理 ZooKeeper 實例,Zookeeper 的引入使得 HMaster 不再是單點故障。一般情況下會啟動兩個 HMaster,非 Active 的 HMaster 會定期的和 Active

3、HMaster 通信以獲取其最新狀態(tài),從而保證它是實時更新的,因而如果啟動了多個 HMaster 反而增加了 Active HMaster 的負擔。一個RegionServer 可以包含多個 HRegion,每個 RegionServer 維護一個 HLog,和多個 HFiles以及其對應的 MemStore。RegionServer 運行于 DataNode 上,數(shù)量可以與 DatNode 數(shù)量一致,請參考如下架構圖:三、RDBMS 與 HBase 的對比3.1、關系型數(shù)據(jù)庫結構:* 數(shù)據(jù)庫以表的形式存在* 支持 FAFS、EXT、文件系統(tǒng)* 使用 Commit log日志* 參考系統(tǒng)是坐標

4、系統(tǒng)* 使用主鍵(PK)* 支持分區(qū)* 使用行、列、單元格功能:支持向上擴展使用 SQL面向行,即每一行都是數(shù)據(jù)總量依賴于服務器配置具有 ACID 支持適合結構化數(shù)據(jù)*續(xù)單元傳統(tǒng)關系型數(shù)據(jù)庫一般都是中心化的* 支持事務* 支持 Join3.2、HBase結構:*數(shù)據(jù)庫以 region 的形式存在支持 HDFS 文件系統(tǒng)使用 WAL(Write-Ahead Logs) 參考系統(tǒng)是 Zookeeper使用行鍵(row key) 支持分片使用行、列、列族和單元格日志功能:*支持向外擴展使用 API 和 MapReduce 來面向列,即每一列都是數(shù)據(jù)總量不依賴具體某臺HBase 表數(shù)據(jù)續(xù)的單元,而取決

5、于數(shù)量* HBase 不支持 ACID(Atomicity、Consistency、Isolation、Durability)* 適合結構化數(shù)據(jù)和非結構化數(shù)據(jù)* 一般都是分布式的* HBase 不支持事務* 不支持 Join四、HBase 特征簡要4.1、自動故障處理和負載均衡HBase 運行在 HDFS 上,所以 HBase 中的數(shù)據(jù)以多副本形式存放,數(shù)據(jù)也服從分布式存放,數(shù)據(jù)的恢復也可以得到保障。另外,HMaster 和 RegionServer 也是多副本的。4.2、自動分區(qū)HBase 表是由分布在多個 RegionServer 中的 region 組成的,這些 RegionServer

6、 又分布在不同的 DataNode 上,如果一個 region 增長到了一個閾值,為了負載均衡和減少 IO,HBase可以自動或手動干預的將 region 切分為更小的 region,也稱之為 subregion。4.3、集成 Hadoop/HDFS雖然 HBase 也可以運行在其他的分布式文件系統(tǒng)之上,但是與 HDFS 結合非常之方便,而且HDFS 也非常之流行。4.4、實時隨機大數(shù)據(jù)HBase 采用 log-structured merge-tree 作為內部數(shù)據(jù)架構,這種架構會周期性地將小文。件合并成大文件以減少磁盤同時減少 NameNode4.5、MapReduceHBase 內建支持

7、 MapReduce 框架,更加方便快速,并行的處理數(shù)據(jù)。4.6、Java APIHBase 提供原聲的 Java API 支持,方便開發(fā)。4.7、橫向擴展HBase 支持橫向擴展,這就意味著如果現(xiàn)有服務器硬件性能出現(xiàn)瓶頸,不需要停掉現(xiàn)有集群提升硬件配置,而只需要在現(xiàn)有的正在運行的集群中添加新的RegionServer 一旦建立完畢,集群會開始重新調整。節(jié)點即可,而且新的4.8、列HBase 是面向列的,每個列都單獨,所以在 HBase 中列是連續(xù)的,而行不是。4.9、HBase ShellHBase 提供了交互式命令行工具可以進行創(chuàng)建表、添加數(shù)據(jù)、掃描數(shù)據(jù)、刪除數(shù)據(jù)等操作和其他一些管理命令。

8、五、HBase 在集群中的HBase 一種是作為的分布式文件系統(tǒng),另一種是作為數(shù)據(jù)處理模型的 MR 框架。因為日常開發(fā)比較熟練的是結構化的數(shù)據(jù)進行處理,但是在 HDFS 直接的文件往往不具有結構化,所以催生出了 HBase 在 HDFS 上的操作。如果需要數(shù)據(jù),只需要通過鍵值便可以成功。六、HBase 內部架構HBase 是由 row key,column family,column 和 cell 組成,row key 確定唯一的一行,columnfamily 由若干 column 組成,column 是表的字段,cell了實際的值或數(shù)據(jù)。七、HBase 與 Hadoop7.1、HDFS* 為

9、分布式提供文件系統(tǒng)* 針對大的文件進行優(yōu)化,不需要對 HDFS 上的文件進行隨機讀寫* 直接使用文件* 數(shù)據(jù)模型不靈活* 使用文件系統(tǒng)和處理框架* 優(yōu)化一次寫入,多次的方式7.2、HBase*提供表狀的面向列的數(shù)據(jù)針對表狀數(shù)據(jù)的隨機讀寫進行優(yōu)化使用 key-value 操作數(shù)據(jù)提供靈活的數(shù)據(jù)模型使用表狀,支持 MapReduce,依賴 HDFS優(yōu)化了多次讀,以及多次寫八、HBase的優(yōu)缺點8.1、優(yōu)點*方便高效的壓縮數(shù)據(jù)支持快速數(shù)據(jù)檢索管理和配置簡單,支持橫向擴展,所以非常容易擴展聚合性能非常高可高效地進行分區(qū),提供自動分區(qū)機制把大的 region 切分成小的 subregion8.2、缺點*

10、 對 JOIN 以及多表合并數(shù)據(jù)的性能不好* 更新過程中有大量的寫入和刪除操作,需要頻繁合并和,降低效率* 對關系模型支持不好,分區(qū)和索引模式設計比較。九、HBase的環(huán)境9.1、HMaster9.1.1、功能描述*RegionServer處理 RegionServer 故障轉移處理元數(shù)據(jù)的變更處理 region 的分配或移除在空閑時間進行數(shù)據(jù)的負載均衡通過 Zookeeper 發(fā)布自己的位置給客戶端9.2、RegionServer9.2.1、功能描述*負責HBase 的實際數(shù)據(jù)處理分配給它的 Region刷新緩存到 HDFS維護 HLog執(zhí)行壓縮負責處理 Region 分片9.2.2、內含組

11、件* Write-Ahead logsHBase 的修改,當對 HBase 讀寫數(shù)據(jù)的時候,數(shù)據(jù)不是直接寫進磁盤,它會在內存中保留一段時間(時間以及數(shù)據(jù)量閾值可以設定)。如果突然原地,把數(shù)據(jù)保存在內存中會引起數(shù)據(jù)丟失,為了解決這個問題,數(shù)據(jù)會先寫在一個叫做 Write-Ahead logfile 的文件中,然后再寫入內存中。所以在系統(tǒng)出現(xiàn)故障的時候,數(shù)據(jù)可以通過這個日志文件重建。* HFile這是在磁盤上保存原始數(shù)據(jù)的實際的物理文件,是實際的* Store文件。HFile在 Store 中,一個 Store 對應 HBase 表中的一個列族* MemStore顧名思義,就是內存,位于內存中,用

12、來保存當前的數(shù)據(jù)操作,所以當數(shù)據(jù)保存在 WAL中之后,RegsionServer 會在內存中* Region鍵值對。Hbase 表的分片,HBase 表會根據(jù) RowKey 值被切分成不同的 region中,在一個 RegionServer 中可以有多個不同的 region在 RegionServer9.3、ZookeeperHMaster 與 HRegionServer 啟動時會向ZooKeeper所有 HRegion 的尋址,實時HRegionserver 的上線和下線信息。并實時通知給 HMaster,HBase 的schema 和 table 元數(shù)據(jù),默認情況下,HBase 管理 Zo

13、oKeeper 實例,Zookeeper 的引入使得 HMaster 不再是單點故障。一般情況下會啟動兩個 HMaster,非 Active 的 HMaster 會定期的和 Active HMaster 通信以獲取其最新狀態(tài),從而保證它是實時更新的,因而如果啟動了多個 HMaster 反而增加了 Active HMaster 的負擔。十、使用場景的探討10.1、何時使用*如果數(shù)據(jù)有很多列,且包含很多空字段數(shù)據(jù)包含了不定數(shù)量的列需要維護數(shù)據(jù)的版本 需要很高的橫向擴展性需要大量的壓縮數(shù)據(jù)需要大量的 I/O一般而言數(shù)百萬行的數(shù)據(jù)和頻率不高的讀寫操作,是不需要 HBase 的,如果有幾十億列數(shù)據(jù),同時

14、在時間內有數(shù)以千、萬記的讀寫操作,可以考慮 HBase。10.2、何時不使用* 數(shù)據(jù)總量不大時(比如就幾個 G)* 當需要 JOIN 以及關系型數(shù)據(jù)庫的一些特性時* 如果關系型數(shù)據(jù)庫可以滿足需求十一、HBase 的安裝與部署10.1、Zookeeper 集群的正常部署并啟動$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start10.2、Hadoop 集群的正常部署并啟動$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/sbin/start-dfs.sh$ /opt/modules/cdh

15、/hadoop-2.5.0-cdh5.3.6/sbin/start-yarn.sh10.3、解壓 HBase$ tar -zxf /opt/softwares/hbase-0.98.6-cdh5.3.6.tar.gz -C /opt/modules/cdh/10.4、修改 HBase 配置文件10,.4.1、hbase-env.sh10.4.2、hbase-site.xml10.4.3、regionservers10.5、替換 HBase 根目錄下的 lib 目錄下的 jar 包,以解決兼容問題* 刪除原有 Jar 包$ rm -rf /opt/modules/cdh/hbase-0.98.6

16、-cdh5.3.6/lib/hadoop-*$ rm -rf lib/zookeeper-3.4.6.jar(尖叫提示:如果 lib 目錄下的 zookeeper 包不匹配也需要替換)* 拷貝新的 Jar 包這里涉及到的 jar 包大概是:hadoop-annotations-2.5.0.jarhadoop-auth-2.5.0-cdh5.3.6.jar hadoop-client-2.5.0-cdh5.3.6.jarmon-2.5.0-cdh5.3.6.jar hadoop-hdfs-2.5.0-cdh5.3.6.jarhadoop-mapreduce-client-app-2.5.0-cd

17、h5.3.6.jarhadoop-mamon-2.5.0-cdh5.3.6.jarhadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jarhadoop-mapreduce-client-hs-2.5.0-cdh5.3.6.jar hadoop-mapreduce-client-hs-plugins-2.5.0-cdh5.3.6.jar hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.6.jarhadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.6-tests.jar h

18、adoop-mapreduce-client-shuffle-2.5.0-cdh5.3.6.jar hadoop-yarn-api-2.5.0-cdh5.3.6.jarhadoop-yarn-applications-distributedshell-2.5.0-cdh5.3.6.jarhadoop-yarn-applications-unmanaged-am-launcher-2.5.0-cdh5.3.6.jar hadoop-yarn-client-2.5.0-cdh5.3.6.jarmon-2.5.0-cdh5.3.6.jarhadoop-yarn-server-applicationh

19、istoryservice-2.5.0-cdh5.3.6.jarhadomon-2.5.0-cdh5.3.6.jarhadoop-yarn-server-nodemanager-2.5.0-cdh5.3.6.jarhadoop-yarn-server-resourcemanager-2.5.0-cdh5.3.6.jar hadoop-yarn-server-tests-2.5.0-cdh5.3.6.jarhadoop-yarn-server-web-proxy-2.5.0-cdh5.3.6.jar zookeeper-3.4.5-cdh5.3.6.jar我們可以通過 find 命令快速進行,例

20、如我們可以執(zhí)行:$ find /opt/modules/ -name hadoop-hdfs-2.5.0-cdh5.3.6.jar然后將查找出來的 Jar 包根據(jù)指置到一個文件夾中了,請依次執(zhí)行:到 HBase 的 lib 目錄下,在這里我給大家整合好$ tar -zxf /opt/softwares/CDH_HadoopJar.tar.gz -C /opt/softwares/$ cp -a /opt/softwares/HadoopJar/* /opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/10.6、將整理好的 HBase 安裝目錄 scp 到其他節(jié)點

21、$ scp -r /opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ hadoop-se:/opt/modules/cdh/$ scp -r /opt/modules/cdh/hbase-0.98.6-cdh5.3.6/ hadoop-se:/opt/modules/cdh/10.7、將 Hadoop 配置文件軟連接到 HBase 的 conf 目錄下* core-site.xml$ ln -s /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/etc/hadoop/core-site.xml/opt/modules/cdh/hbase-

22、0.98.6-cdh5.3.6/conf/core-site.xml* hdfs-site.xml$ ln -s /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/etc/hadoop/hdfs-site.xml/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/conf/hdfs-site.xml(尖叫提示:不要忘記其他幾臺也要做此操作)10.8、啟動服務$ bin/hbase-daemon.sh start master$ bin/hbase-daemon.sh start regionserver或者:$ bin/start-hbas

23、e.sh對應的停止命令:$ bin/stop-hbase.sh10.9、查看頁面啟動成功后,可以通過主機名:60010 地址來HBase 的管理頁面例如,:60010十二、HBase常用操作12.1、進入 HBase 客戶端命令操作界面$ bin/hbase shell12.2、查看幫助命令hbase(main):001:0> help12.3、查看當前數(shù)據(jù)庫中有哪些表hbase(main):002:0> list12.4、創(chuàng)建一張表hbase(main):003:0>create 'student','info'12.5、向表中一些數(shù)據(jù)hba

24、se(main):004:0> put 'student','1001','info:name','Thomas'hbase(main):005:0> put 'student','1001','info:sex','male'hbase(main):006:0> put 'student','1001','info:age','18'12.6、掃描查看的數(shù)據(jù)hbase(main):00

25、7:0> scan 'student'或:查看某個 rowkey 范圍內的數(shù)據(jù)hbase(main):014:0> scan 'student',STARTROW => '1001',STOPROW => '1007'12.7、查看表結構hbase(main):009:0> describe student12.8、更新指定字段的數(shù)據(jù)hbase(main):009:0> put 'student','1001','info:name','N

26、ick'hbase(main):010:0> put 'student','1001','info:age','100'查看更新后的數(shù)據(jù):12.9、查看指定行的數(shù)據(jù)hbase(main):012:0> get 'student','1001'或:查看指定行指定列或列族的數(shù)據(jù)hbase(main):013:0> get 'student','1001','info:name'12.10、刪除數(shù)據(jù)12.10.1、刪除某一個 row

27、Key 全部的數(shù)據(jù)hbase(main):015:0> deleteall 'student','1001'12.10.2、刪除掉某個 rowKey 中某一列的數(shù)據(jù)hbase(main):016:0> delete 'student','1001','info:sex'12.11、清空表數(shù)據(jù)hbase(main):017:0> truncate 'student'12.12、刪除表首先需要先讓該表為 disable 狀態(tài),使用命令:hbase(main):018:0> dis

28、able 'student'然后才能 drop 這個表,使用命令:hbase(main):019:0> drop 'student'(尖叫提示:如果直接 drop 表,會報錯:Drop the named table. Table must first be disabled)12.13、統(tǒng)計一張表有多少行數(shù)據(jù)hbase(main):020:0> count 'student'十三、HMaster的高可用13.1、確保 HBase 集群已正常停止$ bin/stop-hbase.sh13.2、在 conf 目錄下創(chuàng)建 backup-m

29、asters 文件$ touch conf/backup-masters13.3、在 backup-masters 文件中配置高可用 HMaster 節(jié)點$ echo hadoop-se> conf/backup-masters13.4、將整個 conf 目錄 scp 到其他節(jié)點$ scp -r conf/ hadoop-se$ scp -r conf/ hadoop-se:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/:/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/13.5、打開頁面測試 :60010最后,可以嘗試關閉第一

30、臺的 HMaster:$ bin/hbase-daemon.sh stop master然后查看第二臺的 HMaster 是否會直接啟用十四、HBase 和 Hadoop 的集群類型14.1、單機模式主要用于開發(fā)工作,一臺用于評估和測試。上運行所有的守護進程,或者一臺運行多個虛擬機。一般14.2、小型集群20 臺以內的集群,不同的運行不同的守護進程,適用于數(shù)據(jù)量和處理請求較少的小型生產環(huán)境。14.3、中型集群20 到 1000 臺集群,3 到 5 個 zookeeper 節(jié)點,適用于成生產環(huán)境。14.4、大型集群1000 臺以上的集群,屬于超大規(guī)模集群了,適用于大規(guī)模生產環(huán)境。十五、集群配置舉

31、例15.1、NameNode/HMaster 常見配置內存:16128GCPU:2*(824)核處理器硬盤:1TB-SATA 硬盤+1 個元數(shù)據(jù)備份盤(轉速 7200R/MIN+)能使用固態(tài)更好。網(wǎng)卡:2*1GB 網(wǎng)卡為了有更好的性能,所有的元數(shù)據(jù)都緩存在內存中,因此內存需要擁有較快的速度和較好的質量。大內存意為著可以的文件,從而支持 NameNode 更大名空間。同時加載到內存NameNode 不需要很大的磁盤,小容量的磁盤就可以滿足需求,元數(shù)據(jù)要中,數(shù)據(jù)副本以及修改日志在磁盤上。15.2、ResourceManager可以運行在NameNode上,也可以運行在單獨的上。硬件配置和NameN

32、ode 一直,因為只是用于作業(yè)分發(fā),因此不需要較大的磁盤和較強的運算能力。15.3、DataNode、RegionServer實際的數(shù)據(jù)于這些節(jié)點,因此這些節(jié)點需要較大的和較強的運算能力。較小的集群可以使用一般的磁盤,內存和 CPU,如果集群規(guī)模較大,可以考慮:內存:16128G CPU:2*(824)核處理器硬盤:2TB,轉速 7200網(wǎng)卡:2*1GB十六、CDH配置備選:內存:64512GB硬盤:1TB4TBCPU:2*(824)核 CPU,主頻 22.5GHZ網(wǎng)卡:千、萬兆以太網(wǎng)16.1、CPU工作負載,推薦 DataNode 配置為雙 CPU 插槽,配置中等主頻的 CPU,高端 CPU

33、 太燒錢,所以我們可以增加數(shù)量。16.2、電源耐熱性,穩(wěn)定。16.3、內存需要足量的內存以保證不需要等待數(shù)據(jù)頻繁的裝載到內存中,因此 848G 內存比較合適,HBase 會使用大量的內存,將文件存放在內存中(如果開啟了內存表的話),對于 HBase 集群,我們需要比單獨的 Hadoop 集群更大的內存。如果 HBase 開啟緩存,Hbase 會嘗試將整張表緩存在內存中。16.4、磁盤不建議在某臺上配置很大容量的磁盤,這樣當這臺出現(xiàn)問題,不容易將數(shù)據(jù)分散到其他節(jié)點中。必須不能低于 SATA 7200 轉16.5、網(wǎng)絡Hadoop 或者 HBase 在執(zhí)行任務,數(shù)據(jù)和寫入數(shù)據(jù)時,會在節(jié)點之間傳輸數(shù)

34、據(jù)塊,因此建議配置高速的網(wǎng)絡和交換機。對于中小集群,1GB/s 的網(wǎng)絡足矣。對于排序和 shuffle 這類操作,需要節(jié)點間傳輸大量數(shù)據(jù),如果帶寬不足,會導致一些節(jié)點連接超時,比如RegionServer、Zookeeper。十七、容量規(guī)劃運算公式:T = (S* R)* 1.25尖叫提示:S 表示數(shù)據(jù)量R 表示副本數(shù)T 表示整個集群需要的空間十八、HBase 讀寫流程18.1、HBase 讀數(shù)據(jù)流程HRegionServer 保存著meta 表以及表數(shù)據(jù),要表數(shù)據(jù),首先Client 先去zookeeper,從zookeeper 里面獲取meta 表所在的位置信息,即找到這個meta 表在哪個

35、HRegionServer上保存著。接著Client 通過剛才獲取到的HRegionServer 的IP 來從而到 Meta,進而獲取到 Meta 表中存放的元數(shù)據(jù)。Meta 表所在的HRegionServer,Client 通過元數(shù)據(jù)中的信息,對應的 HRegionServer,然后掃描所在HRegionServer 的 Memstore 和 Storefile 來數(shù)據(jù)。最后 HRegionServer 把到的數(shù)據(jù)響應給 Client。18.2、HBase 寫數(shù)據(jù)流程Client 也是先zookeeper,找到 Meta 表,并獲取 Meta 表元數(shù)據(jù)。確定當前將要寫入的數(shù)據(jù)所對應的 HRe

36、gion 和 HRegionServer 服務器。Client 向該 HRegionServer 服務器發(fā)起寫入數(shù)據(jù)請求,然后 HRegionServer 收到請求并響應。Client 先把數(shù)據(jù)寫入到 HLog,以防止數(shù)據(jù)丟失。然后將數(shù)據(jù)寫入到 Memstore。如果 HLog 和 Memstore 均寫入成功,則這條數(shù)據(jù)寫入成功如果 Memstore 達到閾值,會把 Memstore 中的數(shù)據(jù) flush 到 Storefile 中。當 Storefile 越來越多,會觸發(fā) Compact 合并操作,把過多的 Storefile 合并成一個大的Storefile。當 Storefile 越來

37、越大,Region 也會越來越大,達到閾值后,會觸發(fā) Split 操作,將 Region一分為二。十九、HBase中的3個重要機制19.1、flush 機制當 MemStore 達到閾值,將 Memstore 中的數(shù)據(jù) Flush 進 Storefile涉及屬性: hbase.hregion.memstore.flush.size:134217728 即:128M 就是 Memstore 的默認閾值hbase.regionserver.global.memstore.upperLimit:0.4即:這個參數(shù)的作用是當單個 HRegion 內所有的 Memstore 大小總和超過指定值時,flu

38、sh 該 HRegion 的所有 memstore。RegionServer 的 flush 是通過將請求添加一個隊列,模擬生產消費模式來異步處理的。那這里就有一個問題,當隊列來不及消費,產生大量積壓請求時,可能會導致內存陡增,最壞的情況是觸發(fā) OOM。hbase.regionserver.global.memstore.lowerLimit:0.38即:當 MemStore 使用內存總量達到 hbase.regionserver.global.memstore.upperLimit 指定值時,將會有多個 MemStores flush 到文件中,MemStore flush 順序是按照大小降

39、序執(zhí)行的,直到刷新到 MemStore 使用內存略小于 lowerLimit19.2、compact 機制把小的 Memstore 文件合并成大的 Storefile 文件。19.3、split 機制當 Region 達到閾值,會把過大的 Region 一分為二。二十、HBaseAPI 的使用20.1、解壓 Maven 離線倉庫到指定目錄$ tar -zxf /opt/softwares/hbase+hadoop_repository.tar.gz -C /.m2/20.2、新建 Eclipse 的 Maven Project,添加 pom.xml 的 dependency 如下:20.3、編

40、寫 HBaseAPI 代碼詳見項目代碼二十一、文件格式的說明21.1、tsv 格式的文件:字段之間以制表符t 分割21.2、csv 格式的文件:字段之間以逗號,分割二十二、HBase的MapReduce的調用22.1、查看 HBase 執(zhí)行 MapReduce 所依賴的 Jar 包執(zhí)行命令:$ bin/hbase mapredcp出現(xiàn)如下內容:22.2、執(zhí)行環(huán)境變量導入$ export HBASE_HOME=/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/$ export HADOOP_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5

41、.3.6$ export HADOOP_CLASSPATH=$HBASE_HOME/bin/hbase mapredcp22.3、運行的 MapReduce 任務22.3.1、案例一:統(tǒng)計 student 表中有多少行數(shù)據(jù)* 執(zhí)行代碼$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jarlib/hbase-server-0.98.6-cdh5.3.6.jar rowcounter student22.3.2、案例二:使用 MapReduce 任務將數(shù)據(jù)從文件中導入到 HBaseStep1、創(chuàng)建一個 tsv 格式的文件$ vi fruit.ts

42、v,內容如下:Step2、創(chuàng)建 HBase 表$ bin/hbase shellhbase(main):001:0> create 'fruit','info'Step3、在 HDFS 中創(chuàng)建 input_fruit 文件夾并上傳 fruit.tsv 文件$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -mkdir /input_fruit/$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put fruit.tsv /input_fru

43、it/Step4、執(zhí)行 MapReduce 到 HBase 的 fruit 表中$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jarlib/hbase-server-0.98.6-cdh5.3.6.jarimporttsv -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit hdfs:/hadoop-se:8020/input_fruitStep5、使用 scan 命令查看導入后的數(shù)據(jù)即可二十三、BulkLoad加載文件到HBase表23.1、功能將本地數(shù)據(jù)導入到 HBa

44、se 中23.2、原理BulkLoad 會將 tsv/csv 格式的文件編程 hfile 文件,然后再進行數(shù)據(jù)的導入,這樣可以避免大量數(shù)據(jù)導入時造成的集群寫入過大。23.3、作用* 減小 HBase 集群數(shù)據(jù)的* 提高了 Job 運行的速度,降低了 Job 執(zhí)行時間23.4、案例Step1、配置臨時環(huán)境變量$ export HBASE_HOME=/opt/modules/cdh/hbase-0.98.6-cdh5.3.6/$ export HADOOP_HOME=/opt/modules/cdh/hadoop-2.5.0-cdh5.3.6$ export HADOOP_CLASSPATH=$H

45、BASE_HOME/bin/hbase mapredcpStep2、創(chuàng)建一個新的 HBase 表$ bin/hbase shellhbase(main):001:0> create 'fruit_bulkload','info'Step3、將 tsv/csv 文件轉化為 HFile (別忘了要確保你的 fruit 格式的文件 fruit.tsv 在 input 目錄下)$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar /opt/modules/cdh/hbase-0.98.6-cdh5.3.6/li

46、b/hbase-server-0.98.6-cdh5.3.6.jar importtsv -Dimporttsv.bulk.output=/output_file -Dimporttsv.columns=HBASE_ROW_KEY,info:name,info:color fruit hdfs:/hadoop-se:8020/input_fruitStep4、把 HFile 導入到 HBase 表 fruit_bulkload上一步完成之后,你會發(fā)現(xiàn)在 HDFS 的根目錄下出現(xiàn)了一個 output_file 文件夾,里面存放的就是 HFile 文件,緊接著:把 HFile 導入到 HBase

47、表 fruit_bulkload$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar /opt/modules/cdh/hbase-0.98.6-cdh5.3.6/lib/hbase-server-0.98.6-cdh5.3.6.jar completebulkload /output_file fruit_bulkloadStep5、查看使用 bulkLoad 方式導入的數(shù)據(jù)hbase(main):001:0> scan fruit_bulkload二十四、HBase自定義MapReduce案例 1、HBase 表數(shù)據(jù)的轉移在 Ha

48、doop 階段,我們編寫的 MR 任務分別進程了 Mapper 和 Reducer 兩個類,而在 HBase中我們需要繼承的是 TableMapper 和 TableReducer 兩個類。目標:將 fruit 表中的一部分數(shù)據(jù),通過 MR 遷入到 fruit_mr 表中Step1、構建 ReadFruitMapper 類,用于fruit 表中的數(shù)據(jù)package com.z.hbase_mr;import java.io.IOException;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUti

49、l; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.hbase.util.Bytes;public class ReadFruitMapper extends TableMapper<Imm

50、utableBytesWritable, Put> Overrideprotected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException /將 fruit 的 name 和 color 提取出來,相當于將每一行數(shù)據(jù)出來放入到 Put 對象中。Put put = new Put(key.get();/遍歷添加 column 行for(Cell cell: value.rawCells()/添加/克隆列族:info if(&q

51、uot;info".equals(Bytes.toString(CellUtil.cloneFamily(cell)/添加/克隆列:name if("name".equals(Bytes.toString(CellUtil.cloneQualifier(cell)/將該列 cell 加入到 put 對象中put.add(cell);/添加/克隆列:colorelse if("color".equals(Bytes.toString(CellUtil.cloneQualifier(cell)/向該列 cell 加入到 put 對象中put.add

52、(cell);/將從 fruit到的每行數(shù)據(jù)寫入到 context 中作為 map 的輸出context.write(key, put);Step2、構建 WriteFruitMRReducer 類,用于將到的 fruit 表中的數(shù)據(jù)寫入到 fruit_mr 表中package com.z.hbase_mr;import java.io.IOException;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.

53、hadoop.hbase.mapreduce.TableReducer; import org.apache.hadoop.io.NullWritable;public class WriteFruitMRReducer extends TableReducer<ImmutableBytesWritable, Put,NullWritable> Overrideprotected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context)throws IOException

54、, InterruptedException /讀出來的每一行數(shù)據(jù)寫入到 fruit_mr 表中for(Put put: values) context.write(NullWritable.get(), put);Step3、構建 Fruit2FruitMRJob extends Configured implements Tool,用于組裝運行 Job 任務/組裝 Jobpublic int run(String args) throws Exception /得到 ConfigurationConfiguration conf = this.getConf();/創(chuàng)建 Job 任務Job

55、 job = Job.getInstance(conf, this.getClass().getSimpleName(); job.setJarByClass(Fruit2FruitMRJob.class);/配置 JobScan scan = new Scan(); scan.setCacheBlocks(false); scan.setCaching(500);/設置 Mapper,注意導入的是 mapreduce 包下的,不是 mapred 包下的,后者是老版本TableMapReduceUtil.initTableMapperJob("fruit", /數(shù)據(jù)源的表名

56、scan, /scan 掃描控制器ReadFruitMapper.class,/設置 Mapper 類ImmutableBytesWritable.class,/設置 Mapper 輸出 key 類型Put.class,/設置 Mapper 輸出 value 值類型job/設置給哪個 JOB);/設置 ReducerTableMapReduceUtil.initTableReducerJob("fruit_mr",WriteFruitMRReducer.class,job);/設置 Reduce 數(shù)量,最少 1 個job.setNumReduceTasks(1);boolean isSuccess =if(!isSuccess)pletion(true);throw new IOException("Job running with error

溫馨提示

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

評論

0/150

提交評論