日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

hbase 查询固定条数_HBase原理深入

發布時間:2023/12/13 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hbase 查询固定条数_HBase原理深入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HBase讀數據流程

HBase讀數據流程.pngHBase元數據信息.png
HBase讀操作
  • 首先從zk中找到meta表的region信息,然后meta表中的數據,meta表中存儲了用戶的region信息

  • 根據要查詢的namespace、表名和rowkey信息,找到對應的真正存儲要查詢的數據的region信息

  • 找到這個region對應的regionServer,然后發送請求

  • 查找對應的region

  • 先從metastore查找數據,如果沒有,再從BlockCache讀取。

    • HBase上的RegionServer的內存分為兩個部分

      • 一部分作為Memstore,主要用來寫

      • 另一部分作為BlockCache,主要用來讀數據

  • 如果BlockCache中也沒有找到,再到StoreFile上進行讀取

  • 從storeFile中讀取到數據之后,不是直接把結果數據返回給客戶端, 而是把數據先寫?入到BlockCache中,目的是為了加快后續的查詢;然后在返回結果給客戶端。

    HBase寫數據流程

    HBase寫數據流程.png
    HBase寫操作
  • 首先從zk找到meta表的region位置,然后讀取meta表中的數據,meta表中存儲了用戶表的region信息

  • 根據要查詢的namespace、表名和rowkey信息,找到對應的真正存儲要查詢的數據的region信息

  • 找到這個region對應的regionServer,然后發送請求

  • 把數據寫到HLog(write ahead log。WAL:預寫入日志)和memstore各一份(寫到Region里列族對應的Store的內存)

  • Memstore 達到閾值后把數據刷到磁盤,生產storeFile

  • 刪除HLog中的歷史數據

  • HBase的flush(刷寫)及compact(合并)機制

    Flush機制
    • 當memstore的大小超過這個值的時候會flush到磁盤,默認是128M

      <property>
      <name>hbase.hregion.memstore.flush.sizename>
      <value>134217728value>
      property>
    • 當memstore中的數據時間超過1小時,會flush到磁盤

      <property>
      <name>hbase.regionserver.optionalcacheflushintervalname
      <value>3600000value>
      property>
    • Hregion的所有的memstore的大小(一個RegionServer會有多個Region,一個Region會有多個store,也就有多個memstore),所有的memstore的大小超過堆大小的一定比例會觸發flush到磁盤的操作,默認是堆大小的40%

      <property>
      <name>hbase.regionserver.global.memstore.sizename>
      <value>0.4value>
      property>
    • 手動flush

      flush?tableName
    阻塞機制

    以上介紹的是Store中memstore數據刷寫磁盤的標準,但是Hbase中是周期性(定時,默認是10S)的檢查是否滿足以上標準,滿?則進?刷寫,但是如果在下次檢查到來之前,數據瘋狂寫入Memstore中,會出現什什么問題呢?

    會觸發阻塞機制,此時無法寫?數據到Memstore,數據無法寫入Hbase集群。

    • memstore中數據達到512MB

    • 計算公式:hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier

    • hbase.hregion.memstore.flush.size刷寫的閥值,默認是 134217728,即128MB

    • hbase.hregion.memstore.block.multiplier是一個倍數,默認是4。

    • RegionServer全部memstore達到規定值

    • hbase.regionserver.global.memstore.size.lower.limit是0.95

    • hbase.regionserver.global.memstore.size是0.4,

    • 堆內存總共是 16G,

    • 觸發刷寫的閾值是:(0.95 * 0.4 * 16) = 6.08GB

    • 觸發阻塞的閾值是:(0.4 * 16) = 6.4GB

    當發生阻塞的時候,無法寫入HBase,那么如何解決?

    • 調大memstore的hbase.hregion.memstore.flush.size內存大小設置

    • 讓RegionServer占有JVM堆大小更多一些

    Compact合并機制

    合并的原因:減少文件的數量,提高查詢的時候掃描的性能

    在HBase中主要存在兩種類型的Compact合并

    • minor compact ?合并

    • 會將Store中多個HFile(StoreFile)合并成一個大的HFile(默認最少3個,最多10個)

      這個過程中,刪除和更新的數據僅只是做了標記,并沒有物理移除,這種合并的觸發頻率很高。

    • minor compact?件選擇標準由以下?個參數共同決定:


      <property>
      ????<name>hbase.hstore.compaction.minname>
      ????<value>3value>
      property>

      <property>
      ????<name>hbase.hstore.compaction.maxname>
      ????<value>10value>
      property>

      <property>
      ????<name>hbase.hstore.compaction.min.sizename>
      ????<value>134217728value>
      property>

      <property>
      ????<name>hbase.hstore.compaction.max.sizename>
      ????<value>9223372036854775807value>
      property>
    • 觸發條件

      • memstore flush

        在進行memstore flush前后都會進行判斷是否觸發compact

      • 定期檢查線程

        周期性檢查是否需要進行compaction操作,由參數:hbase.server.thread.wakefrequency決定,默認值是10000 millseconds

    • major compact 大合并

    • 合并Store中所有的HFile為一個HFile

      這個過程有刪除標記的數據會被真正移除,同時超過單元格maxVersion的版本記錄也會被刪除。合并頻率?較低,默認7天執??次,并且性能消耗非常大,建議?產關閉(設置為0),在應用空閑時間手動觸發。?般可以是手動控制進行合并,防?出現在業務高峰期。

    • major compaction觸發時間條件


      <property>
      ????<name>hbase.hregion.majorcompactionname>
      ????<value>604800000value>
      property>
    • 手動觸發

      ##使?major_compact命令
      major_compact?tableName

    Region拆分機制

    Region中存儲的是?量的rowkey數據 ,當Region中的數據條數過多的時候,直接影響查詢效率.當Region過大的時候.HBase會拆分Region , 這也是Hbase的?個優點

    Region拆分機制.png
    拆分策略

    Hbase拆分策略一共有以下幾種:

  • ConstantSizeRegionSplitPolicy(0.9版本以前默認的切分策略。)

    當region?小?于某個閾值(hbase.hregion.max.filesize=10G)之后就會觸發切分,一個region等分為2個region。

    但是在生產線上這種切分策略卻有相當大的弊端:切分策略對于大表和小表沒有明顯的區分。閾值(hbase.hregion.max.filesize)設置較大對大表?比較友好,但是小表就有可能不會觸發分裂,極端情況下可能就1個,這對業務來說并不是什么好事。如果設置較小則對?表友好,但一個大表就會在整個集群產?大量的region,這對于集群的管理、資源使用、failover來說都不是一件好事。

  • IncreasingToUpperBoundRegionSplitPolicy(0.94版本~2.0版本默認切分策略)

    切分策略稍微有點復雜,總體看和ConstantSizeRegionSplitPolicy思路相同,一個region?小?于設置閾值就會觸發切分。但是這個閾值并不像 ConstantSizeRegionSplitPolicy是一個固定的值,而是會在一定條件下不斷調整,調整規則和region所屬表在當前regionserver上的region個數有關系.

    region split的計算公式是:
    regioncount^3 * 128M * 2,當region達到該size的時候進?split 例如:
    第一次split:1^3 * 256 = 256MB
    第二次split:2^3 * 256 = 2048MB
    第三次split:3^3 * 256 = 6912MB
    第四次split:4^3 * 256 = 16384MB > 10GB,因此取較?的值10GB 后面每次split的size都是10GB了

  • SteppingSplitPolicy(2.0版本默認切分策略略)

    這種切分策略的切分閾值?發生了變化,相比 IncreasingToUpperBoundRegionSplitPolicy 簡單了一些,依然和待分裂region所屬表在當前 regionserver上的region個數有關系,如果region個數等于1,切分閾值為flush size(默認128M) * 2,否則為MaxRegionFileSize(10G)。這種切分策略對于?集群中的大表、小表會?比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,?表不不會再產??量的?region,?是適可?止。

  • KeyPrefixRegionSplitPolicy

    根據rowKey的前綴對數據進行分組,這里是指定rowKey的前多少位作為前綴,?如rowKey都是16位的,指定前5位是前綴,那么前5位相同的rowKey在進?region split的時候會分到相同的region中。

  • DelimitedKeyPrefixRegionSplitPolicy

    保證相同前綴的數據在同一個region中,例如rowKey的格式為:userid_eventtype_eventid,指定的delimiter為 _ ,則split的的時候會確保userid 相同的數據在同一個region中。

  • DisabledRegionSplitPolicy

    不啟用?動拆分, 需要指定?動拆分

  • RegionSplitPolicy的應?

    Region拆分策略可以全局統一配置,也可以為單獨的表指定拆分策略。

  • 通過hbase-site.xml全局統一配置(對hbase所有表生效)

    <property>
    <name>hbase.regionserver.region.split.policyname>
    <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicyvalue>
    property>
  • 通過Java API為單獨的表指定Region拆分策略

    HTableDescriptor?tableDesc?=?new?HTableDescriptor("test1");?tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,?IncreasingToUpperBoundRegionSplitPolicy.class.getName());?tableDesc.addFamily(new?HColumnDescriptor(Bytes.toBytes("cf1")));
    admin.createTable(tableDesc);
  • 通過HBase Shell為單個表指定Region拆分策略

    create?'test2',?{METADATA?=>?{'SPLIT_POLICY'?=>
    'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME?=>?'cf1'}
  • HBase表的預分區

    為什么要預分區

    當?個table剛被創建的時候,Hbase默認的分配?個region給table。也就是說這個時候,所有的讀寫請求都會訪問到同一個regionServer的同一個region中,這個時候就達不到負載均衡的效果了,集群中的其他regionServer就可能會處于比較空閑的狀態。解決這個問題可以用pre-splitting,在創建table的時候就配置好,生成多個 region。

    • 增加數據讀寫效率

    • 負載均衡,防?數據傾斜

    • ?便集群容災調度region

      每?個region維護著startRow與endRowKey,如果加入的數據符合某個region維護的rowKey范圍,則該數據交給這個region維護

    手動指定預分區
    create?'person','info1','info2',SPLITS?=>?['1000','2000','3000']

    也可以把分區規則創建于文件中

    ?vim?split.txt

    文件內容

    ?aaa
    ?bbb
    ?ccc
    ?ddd

    執?

    ?create?'student','info',SPLITS_FILE?=>?'/root/hbase/split.txt'

    Region合并

    Region合并說明

    Region的合并不是為了性能,而是為了出于維護的目的

    如何進行Region的合并
  • 通過Merge類冷合并Region

    • 需要先關閉集群

    • 需求:需要把Student表中的2個Region數據進行合并

      這?通過org.apache.hadoop.hbase.util.Merge類來實現,不需要進入hbase shell,直接執?(需要先關閉hbase集群):

      hbase?org.apache.hadoop.hbase.util.Merge?student?\?student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59.?\?student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
  • 通過online_merge熱合并Region

    • 不需要關閉集群

      與冷合并不同的是,online_merge的傳參是Region的hash值,而Region的hash值就是Region名稱的最后那段在兩個.之間的字符串部分。
      需求:需要把lagou_s表中的2個region數據進行合并:?student,,1587392159085.9ca8689901008946793b8d5fa5898e06.?\?student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
      需要進?入hbase?shell:
      merge_region?'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'

    成功后在觀察頁面

    總結

    以上是生活随笔為你收集整理的hbase 查询固定条数_HBase原理深入的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。