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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)

發(fā)布時間:2025/3/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本概念:

HBase是列簇式Key-Value存儲系統(tǒng),構(gòu)建在HDFS之上的、支持隨機插入和刪除。

總結(jié)Hbase的架構(gòu)核心,就兩個字“有序” 。

磁盤的讀寫,隨機與順序,相差3個數(shù)量級(也就是300倍左右)【注意這里與存儲介質(zhì)無關(guān)】

邏輯上:

  • rowkey(行鍵):唯一標(biāo)識一行數(shù)據(jù)。 (等同于RDMS中主鍵)
  • column family(列簇):包含多個列,組成一個簇。
  • column qualifier(列標(biāo)識):表的每列數(shù)據(jù)可通過family:qualifier唯一標(biāo)識
  • timestamp(數(shù)據(jù)版本):cell內(nèi)部數(shù)據(jù)是多版本的,時間戳作為版本號。(默認(rèn)最大保留三個版本,如果讀取數(shù)據(jù)時未指定版本號,只會返回最新版本的值)
  • 可以將[rowkey, column family, coluomn qualifier, timestamp]看做key,cell的值為value。
  • 物理上:

    Hbase 是由三種類型的 server 組成的的主從式(master-slave)架構(gòu):
  • Region Server 負(fù)責(zé)處理數(shù)據(jù)的讀寫請求,客戶端請求數(shù)據(jù)時直接和 Region Server 交互。(每個 Region Server 可以管理約 1000 個 regions(它們可能來自一張表或者多張表))
  • HBase Master 負(fù)責(zé) Region 的分配,DDL(創(chuàng)建,刪除 table)等操作。
  • Zookeeper,作為 HDFS 的一部分,負(fù)責(zé)維護集群狀態(tài)。

  • 存儲結(jié)構(gòu):

    rowkey

  • 按照rowkey的范圍[startKey, endKey],將數(shù)據(jù)劃分成多個region(類似于分區(qū)),每個 region 的默認(rèn)大小為 1GB。
  • HBase 表中的數(shù)據(jù)是按照rowkey數(shù)據(jù)字典順序升序排列。
  • rowkey既要方便查找和定位,又要保證數(shù)據(jù)均衡分布在RegionServer上(分區(qū)均勻),避免數(shù)據(jù)熱點、數(shù)據(jù)傾斜。
  • column family

  • 相同的列簇的數(shù)據(jù)會分開存儲在不同的目錄下。
  • Region Server的內(nèi)存主要分為兩部分

  • Memstore,主要用作寫緩存;(每個 Region 的每個 Column Family 都會有一個 MemStore)
  • BlockCache,主要用作讀緩存;(Block是HBase中最小的數(shù)據(jù)存儲單元,默認(rèn)為64K,HBase會將一次文件查找的Block塊緩存到Cache中,以便后續(xù)同一請求或者鄰近數(shù)據(jù)查找請求)
  • 默認(rèn)情況下,BlockCache和Memstore的配置各占40%。

  • 為何如此快

    順序?qū)懭?#xff0c;與順序讀取,是最重要的。

    推數(shù)快(write):

    • WAL:(Write Ahead Log) 是分布式文件系統(tǒng)上的一個文件,用于存儲新的還未被持久化存儲的數(shù)據(jù),它被用來做故障恢復(fù)。
    • MemStore:(寫緩存),在內(nèi)存中存儲了新的還未被持久化到硬盤的數(shù)據(jù)。當(dāng)被寫入硬盤時,數(shù)據(jù)會首先被排序,注意每個 Region 的每個 Column Family 都會有一個 MemStore。
    • 視覺層面的快,內(nèi)部并未持久化:
  • 新數(shù)據(jù)會被追加到 WAL 文件尾部;
  • 然后加入Memstore,停駐內(nèi)存中;(Region Server會給每個region提供一個Memstore)
  • 觸發(fā)持久化兩種情況:
  • 溢出:當(dāng)Memstore滿128M(hbase.hregion.memstore.flush.size)以后,會啟動flush刷新到磁盤。
  • 當(dāng)Memstore的總大小超過限制時(heapsizehbase.regionserver.global.memstore.upperLimit0.9),會強行啟動flush進程,從最大的Memstore開始逐個flush。
  • 取數(shù)快(read):

      • Meta table(它其實是一張?zhí)厥獾?HBase 表),包含了集群中所有 regions 的位置信息。Zookeeper 保存了這個 Meta table 的位置
      • 因為使用了LSM樹型結(jié)構(gòu)。
      • 客戶端讀寫數(shù)據(jù),實際上分了兩步(強一致性保證)
        • 定位:從 Meta table 獲取 rowkey 屬于哪個 Region Server 管理。
        • 取數(shù):去相應(yīng)的 Region Server 讀寫數(shù)據(jù)。
  • 從 Block Cache 讀取 cells。(最近讀取的 KeyValue 都被緩存在這里,這是 一個 LRU 緩存)
  • 若取不到,則讀MemStore,即寫緩存。(包含了最近更新的數(shù)據(jù))
  • 沒有在 Block Cache 和 Mem Store 都沒找到對應(yīng)的 cells,則 HBase 會使用 Block Cache 中的索引和布隆過濾器來加載對應(yīng)的 HFile 到內(nèi)存,查找到請求的 row cells。

  • 內(nèi)部優(yōu)化:

  • 內(nèi)存孔洞問題,MemStore刷寫數(shù)據(jù)到磁盤,產(chǎn)生的問題:
    RegionServer內(nèi)存碎片增多,當(dāng)生存時間較長的數(shù)據(jù)從堆的老年代空間刷寫到磁盤,內(nèi)存碎片增多,連續(xù)存儲空間減少,就會產(chǎn)生內(nèi)存孔洞。
  • 解決方案: 啟用本地memstore分配緩存區(qū)(Memstore-Local Allocation Buffers,MSLAB),也就是允許從堆中分配相同大小的對象,一旦這些對象分配并且最終被回收,就會在堆中留下固定大小的孔洞,這些孔洞可被重復(fù)利用,GC就無需使應(yīng)用程序進程停頓來回收內(nèi)存空間

    2. 讀放大(read amplification),每個 MemStore 可能會有多個 HFile:

    解決方案:minor compaction,HBase 會自動合并一些小的 HFile,重寫成少量更大的 HFiles,它使用歸并排序算法,將小文件合并成大文件,有效減少 HFile 的數(shù)量。

    3.寫放大(Write Amplification),major compaction 會重寫所有的 HFile,會產(chǎn)生大量的硬盤 I/O 和網(wǎng)絡(luò)開銷,它會將那些遠(yuǎn)方的數(shù)據(jù)重新移回到離 region server 節(jié)點附近的地方。

    4. region分裂(split)

    一開始每個 table 默認(rèn)只有一個 region。當(dāng)一個 region 逐漸變得很大時,它會分裂(split)成兩個子 region,每個子 region 都包含了原來 region 一半的數(shù)據(jù)。

    這兩個子 region 并行地在原來這個 region server 上創(chuàng)建,這個分裂動作會被報告給 HMaster。處于負(fù)載均衡的目的,HMaster 可能會將新的 region 遷移給其它 region server。

    5. 字段占用空間,盡量小:

    每行數(shù)據(jù)中不同版本的cell value會重復(fù)保存【rowkey,column family,column qualifier】,數(shù)據(jù)在進行持久化到HFile文件時、讀緩存(BlockCache)、寫緩存(MemStore)都會用這幾個字段,為了節(jié)省存儲空間、內(nèi)存空間和網(wǎng)絡(luò)傳輸數(shù)據(jù)量,這幾個字段值應(yīng)盡可能短。

    rowkey的設(shè)計就要在讀寫性能、數(shù)據(jù)熱點、范圍掃描之間進行取舍的藝術(shù)。


    3種Block Cache方案:

    1. LRUBlockCache是最初的實現(xiàn)方案,也是默認(rèn)的實現(xiàn)方案。

    a. 將所有數(shù)據(jù)都放入JVM Heap中,交給JVM進行管理。

    b. 將內(nèi)存從邏輯上分為了三塊:single-access區(qū)、mutil-access區(qū)、in-memory區(qū),分別占到整個BlockCache大小的25%、50%、25%。

    c. 一次隨機讀中,一個Block塊從HDFS中加載出來之后首先放入signle區(qū)。

    d. 后續(xù)如果有多次請求訪問到這塊數(shù)據(jù)的話,就會將這塊數(shù)據(jù)移到mutil-access區(qū)。

    e. 而in-memory區(qū)表示數(shù)據(jù)可以常駐內(nèi)存,一般用來存放訪問頻繁、數(shù)據(jù)量小的數(shù)據(jù),比如元數(shù)據(jù),用戶也可以在建表的時候通過設(shè)置列族屬性IN-MEMORY= true將此列族放入in-memory區(qū)。

    2. SlabCache,HBase 0.92版本實現(xiàn)了第二種方案。(已廢棄)

    a. SlabCache BucketCache 這兩種采用了不同機制將部分?jǐn)?shù)據(jù)存儲在堆外,交給HBase自己管理

    3. BucketCache, HBase 0.96之后官方提供了另一種可選方案。(阿里提供的方案)

    a. 這種演變過程是因為LRUBlockCache方案中JVM垃圾回收機制經(jīng)常會導(dǎo)致程序長時間暫停,而采用堆外內(nèi)存對數(shù)據(jù)進行管理可以有效避免這種情況發(fā)生。

    b. 在初始化的時候就申請了一片固定大小的內(nèi)存作為緩存,緩存淘汰不再由 JVM管理,數(shù)據(jù)Block的緩存操作只是對這片空間的訪問和覆蓋,因而大大減少了內(nèi)存碎片的出現(xiàn),降低了Full GC發(fā)生的頻率。

    總結(jié)

    以上是生活随笔為你收集整理的hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。