HBase核心知識點總結

来源:http://www.cnblogs.com/caiyisen/archive/2017/09/01/7424177.html
-Advertisement-
Play Games

一、HBase介紹 1、基本概念 HBase是一種Hadoop資料庫,經常被描述為一種稀疏的,分散式的,持久化的,多維有序映射,它基於行鍵、列鍵和時間戳建立索引,是一個可以隨機訪問的存儲和檢索數據的平臺。HBase不限制存儲的數據的種類,允許動態的、靈活的數據模型,不用SQL語言,也不強調數據之間的 ...


一、HBase介紹

1、基本概念

HBase是一種Hadoop資料庫,經常被描述為一種稀疏的,分散式的,持久化的,多維有序映射,它基於行鍵、列鍵和時間戳建立索引,是一個可以隨機訪問的存儲和檢索數據的平臺。HBase不限制存儲的數據的種類,允許動態的、靈活的數據模型,不用SQL語言,也不強調數據之間的關係。HBase被設計成在一個伺服器集群上運行,可以相應地橫向擴展。

2、HBase使用場景和成功案例

  • 互聯網搜索問題:爬蟲收集網頁,存儲到BigTable里,MapReduce計算作業掃描全表生成搜索索引,從BigTable中查詢搜索結果,展示給用戶。
  • 抓取增量數據:例如,抓取監控指標,抓取用戶交互數據,遙測技術,定向投放廣告等
  • 內容服務
  • 信息交互

3、HBase Shell命令行交互:

啟動Shell    $ hbase shell

列出所有的表   hbase >  list

創建名為mytable的表,含有一個列族hb    hbase > create ' mytable' , 'hb'

 在‘mytable’表的'first'行中的‘hb:data’列對應的數據單元中插入位元組數組‘hello HBase’

  hbase > put  'mytable' , 'first' , 'hb:data' , 'hello HBase' 

讀取mytable表 ‘first’行的內容   hbase > get 'mytable' , 'first' 

讀取mytable表所有的內容      hbase > scan ‘mytable' 

 

二、入門

1、API

和數據操作有關的HBase API有5個,分別是 Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)

2、操作表

首先要創建一個configuration對象

   Configuration conf = HBaseConfiguration.create();

使用eclipse時的話還必須將配置文件添加進來。
   conf.addResource(new Path("E:\\share\\hbase-site.xml"));

     conf.addResource(new Path("E:\\share\\core-site.xml"));

    conf.addResource(new Path("E:\\share\\hdfs-site.xml"));

   使用連接池創建一張表。

   HTablePool pool = new HTablePool(conf,1);
   HTableInterface usersTable = pool.getTable("users");

3、寫操作

  用來存儲數據的命令是put,往表裡存儲數據,需要創建Put實例。並制定要加入的行

  Put put = new Put(byte[]  row) ;

  Put的add方法用來添加數據,分別設定列族,限定符以及單元格的指

  put.add(byte[] family , byte[] qualifier , byte[] value) ; 

  最後提交命令給表

  usersTable.put(put);

  usersTable.close();

  修改數據,只需重新提交一次最新的數據即可。

HBase寫操作的工作機制:

   

 

 

  HBase每次執行寫操作都會寫入兩個地方:預寫式日誌(write-ahead log,也稱HLog)和MemStore(寫入緩衝區),以保證數據持久化,只有當這兩個地方的變化信息都寫入並確認後,才認為寫動作完成。MemStore是記憶體里的寫入緩衝區,HBase中數據在永久寫入硬碟之前在這裡累積,當MemStore填滿後,其中的數據會刷寫到硬碟,生成一個HFile。

4、讀操作

 創建一個Get命令實例,包含要查詢的行

Get get = new Get(byte[]  row) ;

執行addColumn()或addFamily()可以設置限制條件。

將get實例提交到表會返回一個包含數據的Result實例,實例中包含行中所有列族的所有列。

Result  r = usersTable.get(get) ;

可以對result實例檢索特定的值

byte[] b = r.getValue(byte[] family , byte[] qualifier) ;

工作機制:

 

 

BlockCache用來保存從HFile中讀入記憶體的頻繁訪問的數據,避免硬碟讀,每個列族都有自己的BlockCache。從HBase中讀出一行,首先會檢查MemStore等待修改的隊列,然後檢查BlockCache看包含該行的Block是否最近被訪問過,最後訪問硬碟上的對應HFile。

5、刪除操作

創建一個Delete實例,指定要刪除的行。

Delete delete = new Delete(byte[]  row) ;

可以通過deleteFamily()和deleteColumn()方法指定刪除行的一部分。

6表掃描操作

Scan scan = new Scan() 可以指定起始行和結束行。

setStartRow() , setStopRow() , setFilter()方法可以用來限制返回的數據。

addColumn()和addFamily()方法還可以指定列和列族。

HBase模式的數據模型包括:

表:HBase用表來組織數據。

行:在表裡,數據按行存儲,行由行鍵唯一標識。行鍵沒有數據類型,為位元組數組byte[]。

列族:行里的數據按照列族分組,列族必須事先定義並且不輕易修改。表中每行擁有相同的列族。

列限定符:列族裡的數據通過列限定符或列來定位,列限定符不必事先定義。

單元:存儲在單元里的數據稱為單元值,值是位元組數組。單元由行鍵,列族或列限定符一起確定。

時間版本:單元值有時間版本,是一個long類型。

一個HBase數據坐標的例子:

 

 

HBase可以看做是一個鍵值資料庫。HBase的設計是面向半結構化數據的,數據記錄可能包含不一致的列,不確定大小等。

 

 

三、分散式的HBase、HDFS和MapReduce

1、分散式模式的HBase

HBase將表會切分成小的數據單位叫region,分配到多台伺服器。托管region的伺服器叫做RegionServer。一般情況下,RgionServer和HDFS DataNode併列配置在同一物理硬體上,RegionServer本質上是HDFS客戶端,在上面存儲訪問數據,HMaster分配region給RegionServer,每個RegionServer托管多個region。

 

 

HBase中的兩個特殊的表,-ROOT-和.META.,用來查找各種表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。

一次客戶端查找過程的3層分散式B+樹如下圖:

 

 

HBase頂層結構圖:

 

 

zookeeper負責跟蹤region伺服器,保存root region的地址。

Client負責與zookeeper子集群以及HRegionServer聯繫。

HMaster負責在啟動HBase時,把所有的region分配到每個HRegion Server上,也包括-ROOT-和.META.表。

HRegionServer負責打開region,並創建對應的HRegion實例。HRegion被打開後,它為每個表的HColumnFamily創建一個Store實例。每個Store實例包含一個或多個StoreFile實例,它們是實際數據存儲文件HFile的輕量級封裝。每個Store有其對應的一個MemStore,一個HRegionServer共用一個HLog實例。

一次基本的流程:

a、 客戶端通過zookeeper獲取含有-ROOT-的region伺服器名。

b、 通過含有-ROOT-的region伺服器查詢含有.META.表中對應的region伺服器名。

c、  查詢.META.伺服器獲取客戶端查詢的行鍵數據所在的region伺服器名。

d、 通過行鍵數據所在的region伺服器獲取數據。

 

HFile結構圖:

 

 

Trailer有指向其他塊的指針,Index塊記錄Data和Meta塊的偏移量,Data和Meta塊存儲數據。預設大小是64KB。每個塊包含一個Magic頭部和一定數量的序列化的KeyValue實例。

 

KeyValue格式:

 

 

該結構以兩個分別表示鍵長度和值長度的定長數字開始,鍵包含了行鍵,列族名和列限定符,時間戳等。

 

預寫日誌WAL:

每次更新都會寫入日誌,只有寫入成功才會通知客戶端操作成功,然後伺服器可以按需自由地批量處理或聚合記憶體中的數據。

編輯流在memstore和WAL之間分流的過程:

 

 

處理過程:客戶端通過RPC調用將KeyValue對象實例發送到含有匹配region的HRegionServer。接著這些實例被髮送到管理相應行的HRegion實例,數據被寫入到WAL,然後被放入到實際擁有記錄的存儲文件的MemStore中。當memstore中的數據達到一定的大小以後,數據會非同步地連續寫入到文件系統中,WAL能保證這一過程的數據不會丟失。

 

2、HBase和MapReduce

從MapReduce應用訪問HBase有3種方式:

作業開始時可以用HBase作為數據源,作業結束時可以用HBase接收數據,任務過程中用HBase共用資源。

  • 使用HBase作為數據源

階段map

protected void map(ImmutableBytesWritable rowkey,Result result,Context context){

};

從HBase表中讀取的作業以[rowkey:scan result]格式接收[k1,v1]鍵值對,對應的類型是ImmutableBytesWritable和Result。

創建實例掃描表中所有的行

Scan scan = new Scan();

scan.addColumn(…);

接下來在MapReduce中使用Scan實例。

TableMapReduceUtil.initTableMapperJob(tablename,scan,map.class,

輸出鍵的類型.class,輸出值的類型.class,job);

  • 使用HBase接收數據

reduce階段

protected void reduce(

ImmutableBytesWritable rowkey,Iterable<put>values,Context context){

};

把reducer填入到作業配置中,

TableMapReduceUtil.initTableReducerJob(tablename,reduce.class,job);

 

3、HBase實現可靠性和可用性

HDFS作為底層存儲,為集群里的所有RegionServer提供單一命名空間,一個RegionServer讀寫數據可以為其它所有RegionServer讀寫。如果一個RegionServer出現故障,任何其他RegionServer都可以從底層文件系統讀取數據,基於保存在HDFS里的HFile開始提供服務。接管這個RegionServerz服務的region。

 

四、優化HBase

1、隨機讀密集型

優化方向:高效利用緩存和更好的索引

  •  增加緩存使用的堆的百分比,通過參數 hfile.block.cache.size 配置。
  • 減少MemStore占用的百分比,通過hbase.regionserver.global.memstore.lowerLimit和hbase.regionserver.global.memstore.upperLimit來調節。
  • 使用更小的數據塊,使索引的粒度更細。
  • 打開布隆過濾器,以減少為查找指定行的Key Value對象而讀取的HFile的數量。
  • 設置激進緩存,可以提升隨機讀性能。
  • 關閉沒有被用到隨機讀的列族,提升緩存命中率。

2、順序讀密集型

優化方向:減少使用緩存。

  • 增大數據塊的大小,使每次硬碟尋道時間取出的數據更多。
  • 設置較高的掃描器緩存值,以便在執行大規模順序讀時每次RPC請求掃描器可以取回更多行。 參數 hbase.client.scanner.caching 定義了在掃描器上調用next方法時取回的行的數量。
  • 關閉數據塊的緩存,避免翻騰緩存的次數太多。通過Scan.setCacheBlocks(false)設置。
  • 關閉表的緩存,以便在每次掃描時不再翻騰緩存。
  • 3、寫密集型

優化方向:不要太頻繁刷寫,合併或者拆分。

  • 調高底層存儲文件(HStoreFile)的最大大小,region越大意味著在寫的時候拆分越少。通過參數 hbase.hregion.max.filesize設置。
  • 增大MemStore的大小,通過參數hbase.hregion.memstore.flush.size調節。刷寫到HDFS的數據越多,生產的HFile越大,會在寫的時候減少生成文件的數量,從而減少合併的次數。
  • 在每台RegionServer上增加分配給MemStore的堆比例。把upperLimit設為能夠容納每個region的MemStore乘以每個RegionServer上預期region的數量。
  • 垃圾回收優化,在hbase-env.sh文件里設置,可以設置初始值為:-Xmx8g  -Xms8g  -Xmn128m  -XX:+UseParNewGC  -XX:+UseConcMarkSweepGC

   -XX:CMSInitiatingOccupancyFraction=70

  • 打開MemStore-Local Allocation Buffer這個特性,有助於防止堆的碎片化。 通過參數hbase.hregion.memstore.mslab.enabled設置

4、混合型

優化方向:需要反覆嘗試各種組合,然後運行測試,得到最佳結果。

 

影響性能的因素還包括:

  • 壓縮:可以減少集群上的IO壓力
  • 好的行鍵設計
  • 在預期集群負載最小的時候手工處理大合併
  • 優化RegionServer處理程式計數

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • cordova-plugin-IFlyspeech 科大訊飛的語音聽說讀寫的cordova插件 Supported Platforms iOS android Installation 插件安裝命令:cordova plugin add https://github.com/Edc-zhang/co ...
  • 引言:交互的概念是很難用語言描述的,怎樣才能讓一個抽象的想法得到充分溝通和測試呢?一個原型工具就能回答這個問題。 原型是一個想法成為App或者網頁的旅途上的伴侶。一個建築師不會從一開始就去挖地下室,他會在繪製完草圖後,一步一步地設計電腦上的和真實的模型,並且反覆地測試和修訂。同樣平面設計師也會在UI ...
  • 最近在做一個Toolbar,setNavigationIcon()這個方法一直無效,說什麼的都有,什麼getSupportActionBar().setNavigationIcon()的,說設置style的,說放到setSupportActionBar()之後的。 其實沒有說全,還應該放到Drawe ...
  • 1. RNN迴圈神經網路 1.1 結構 迴圈神經網路(recurrent neural network,RNN)源自於1982年由Saratha Sathasivam 提出的霍普菲爾德網路。RNN的主要用途是處理和預測序列數據。全連接的前饋神經網路和捲積神經網路模型中,網路結構都是從輸入層到隱藏層再 ...
  • 1. Iris data set Iris數據集是常用的分類實驗數據集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉數據集,是一類多重變數分析的數據集。數據集包含150個數據集,分為3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花 ...
  • 摘要: http://www.cloudera.com/content/cloudera-content/cloudera-docs/Impala/latest/Installing-and-Using-Impala/ciiu_langref_sql.html Impala SQL 語言元素(Ele ...
  • 記錄自己在開發中只用一次,但是容易忘記的問題,PL/SQL-ORACLE配置遠程資料庫訪問: 1,下載PL/SQL連接工具,鏈接: https://pan.baidu.com/s/1kVeeLNp 密碼: u2hi 2,解壓壓縮包,配置instantclient_11_2里的tnsnames.ora ...
  • Greenplum(GP)採用了MPP架構,基於開源的資料庫 PostgreSQL(PG)。 1.首先什麼是MPP架構? GreenPlum的架構採用了MPP(大規模並行處理)。在 MPP 系統中,每個 Segment 節點也可以運行自己的操作系統、資料庫等。換言之,每個節點內的 CPU 不能訪問另 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...