海量列式非關系數據庫HBase 原理深入

wangheng1409 2021-09-15 09:58:48
海量 列式 hbase 原理 深入


  • HBase讀數據流程:

 

 

 前置關鍵詞描述:

  • Block Cache :讀緩存,緩存上一次讀的數據,整個ReginServer只有一個
  • MemStore :寫緩存,緩存上一次寫的數據,每個Store有一個
  • WAL: 預寫入日志

讀取數據流程:

  • 1.請求zk 查詢meta錶的地址
  • 2.根據meta錶的地址查詢rowkey屬於哪個reginserver的哪個regin,元數據緩存到MetaCache
  • 3.先去BlockCache 和MemStore查找,找不到才去storeFile找,如果在storeFile 查詢到,就緩存到BlockCache裏

HBase寫數據流程:

 

 

寫數據流程:

  • 1.請求zk 查詢meta錶的地址
  • 2.根據meta錶的地址查詢rowkey屬於哪個reginserver的哪個regin,元數據緩存到MetaCache
  • 3.先寫WAL,再寫MemStore,寫入MemStore就返回了,
  • 如果MemStore內存不够,會flush storeFile文件,然後合並多個storeFile

注: Hbase的寫流程比讀流程效率高,因為寫流程只需要寫入內存,讀流程先讀內存,如果讀不到,還需要讀磁盤文件。

 

HBase的flush(刷寫) 機制:

刷寫條件:

  • 1.MemStore大小達到128M
  • 2.時間超過1小時
  • 3.Reginserver的所有Memstore大小達到reginserver占用的堆內存大小的40%

注: 上述條件默認每10s檢查一次

為防止檢查之前達到刷寫條件,會觸發阻塞機制.

阻塞機制觸發條件:

  • Memstore達到512M
  • Reginserver的所有Memstore大小達到堆內存的0.95*0.4

避免阻塞機制的解决方案:

        如果出現這種情况,可以增大memstore大小,增大reginserver的堆內存大小。

 

Compact合並機制:

minor compact 小合並:

文件被選中條件:

  • 1. 待合並文件數量大於3
  • 2.待合並文件數量 小於10
  • 3.文件大小小於128M的文件一定會加入
  • 4.排除特別大的文件

合並觸發條件:

  • 1.menstore flush
  • 2.定期檢查,默認10s

Major compact:

  • 合並所有的HFile,默認7天執行一次,生產中默認關閉
  • 手動:major_compact 錶名

注意:真正的删除是在這一步進行

 

Region 拆分機制:

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(10GB)。這種切分策略對於大集群中的大錶、小錶會
比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小錶不會再產生大量的小region,而是
適可而止。

 

Hbase 預分區:

為了負載均衡,提高讀寫效率,否則剛開始讀寫都在一個機器上進行。

通常解决負載均衡問題,還有以下解决方案:

  • 給row key 加前綴 
  • 對row key 進行hash
  • 反轉

Region 合並:

Region的合並不是為了性能,而是出於維護的目的。

通過Merge類冷合並Region:

  • 需要先關閉hbase集群
  • 需求:需要把student錶中的2個region數據進行合並:

student,,1593244870695.10c2df60e567e73523a633f20866b4b5.

student,1000,1593244870695.0a4c3ff30a98f79ff6c1e4cc927b3d0d.

這裏通過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:

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

RowKey 設計:

  • RowKey長度原則
    • rowkey是一個二進制碼流,可以是任意字符串,最大長度64kb,實際應用中一般為10-100bytes, 以byte[]形式保存,一般設計成定長。
    • 建議越短越好,不要超過16個字節  設計過長會降低memstore內存的利用率和HFile存儲數據的效率。
  • RowKey散列原則
    • 建議將rowkey的高比特作為散列字段,這樣將提高數據均衡分布在每個RegionServer,以實現負載均 衡的幾率。
  • RowKey唯一原則
    •  必須在設計上保證其唯一性
  •  RowKey排序原則
    • HBase的Rowkey是按照ASCII有序設計的,我們在設計Rowkey時要充分利用這點

scan使用的時候注意:setStartRow,setEndRow 限定範圍, 範圍越小,性能越高。

 

版权声明
本文为[wangheng1409]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915095656851x.html

  1. L'arrivée de marchandises sèches, l'entretien d'emploi Java 12 grandes usines ont réussi à changer d'emploi,
  2. Multiple postures for handling container time in k8s environment
  3. Echarts remove left Gap, Blank
  4. Hotspot Weekly | zoom $100 million, docker fees, $38 billion Data bricks
  5. JsonMappingException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory...
  6. Java. Security. Securerandom source code analysis Java. Security. EGD = file: / dev /. / urandom
  7. When using IntelliJ idea, jump directly and quickly from the mapper interface to mapper.xml
  8. When idea writes SQL in mybatis XML, the solution to the problems of table name, field and red reporting
  9. Spring cloud integrates Nacos
  10. 应届毕业生Java笔试题目,2021大厂Java社招最全面试题,
  11. Liver explosion! Take you to understand Hadoop serialization
  12. linux系列之:告诉他,他根本不懂kill
  13. java版gRPC实战之三:服务端流
  14. RabbitMQ核心知识总结!
  15. linux系列之:告诉他,他根本不懂kill
  16. java版gRPC实战之三:服务端流
  17. RabbitMQ核心知识总结!
  18. 10天拿到字节跳动Java岗位offer,学习Java开发的步骤
  19. 10天拿到字节跳动Java岗位offer,Java知识点思维导图
  20. Résumé des connaissances de base de rabbitmq!
  21. 10天拿到字節跳動Java崗比特offer,Java知識點思維導圖
  22. 10 jours pour obtenir un Byte Jump Java post offer, Java Knowledge point Mind Map
  23. 10 jours pour obtenir l'octet Jump Java post offer, apprendre les étapes du développement Java
  24. Java version of gppc Reality Three: server side stream
  25. Linux Series: Dites - lui qu'il ne connaît pas kill du tout
  26. "Data structure and algorithm" of front end -- binary search
  27. 2020-2021京东Java面试真题解析,如何才能通过一线互联网公司面试
  28. 13 SpringBoot整合RocketMQ实现过滤消息-根据SQL表达式过滤消息
  29. 12 SpringBoot整合RocketMQ实现过滤消息-根据TAG方式过滤消息
  30. 11 SpringBoot整合RocketMQ实现事务消息
  31. 11 springboot Consolidated rocketmq Implementation transaction message
  32. 12 springboot Consolidated rocketmq Implements Filtering messages - Filtering messages according to tag method
  33. 13 springboot Consolidated rocketmq Implementation Filtering messages - Filtering messages according to SQL expressions
  34. linux系列之:告诉他,他根本不懂kill
  35. (1)java Spring Cloud+Spring boot企业快速开发架构之微服务是什么?它的优缺点有哪些?
  36. Oracle 检查 DATE 列 RANGE 分区表已有分区的最大日期时间
  37. ConcurrentHashMap--原理
  38. 2020 - 2021 JD Java interview Real question Analysis, How can interview through First - Line Internet Company
  39. Concurrenthashmap - - Principes
  40. Oracle vérifie l'heure de date maximale d'une partition existante dans la colonne date
  41. Docker Compose 实践及梳理
  42. Qu'est - ce qu'un microservice pour Java Spring Cloud + Spring Boot Enterprise Quick Development architecture?Quels sont ses avantages et ses inconvénients?
  43. Plus sign interview knowledge points in Java
  44. Pratique et organisation de la composition des dockers
  45. Linux Series: Dites - lui qu'il ne connaît pas kill du tout
  46. Convenient CSS and jQuery drop-down menu solution
  47. Linux analog packet loss rate
  48. Redis:我是如何与客户端进行通信的
  49. 15 useful cron work examples commonly used by Senior Linux system administrators
  50. 24个 JavaScript 循环遍历方法,你都知道吗?
  51. Reading notes of JavaScript advanced programming (3rd Edition) 4
  52. 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)
  53. 24 méthodes de traversée de boucle Javascript, vous savez?
  54. 30 minutes pour apprendre à ouvrir le tableau de bord k8s (kubernets) dans le docker (explication graphique)
  55. Redis: comment je communique avec les clients
  56. Wsl2: Windows native Linux subsystem
  57. 30分钟学会Docker里面开启k8s(Kubernetes)登录仪表盘(图文讲解)
  58. Python高级用法总结(8)-函数式编程
  59. 261页前端面试题宝典,JavaScript变量声明提升
  60. The performance of JVM and Java applications of the same version differs by 30% on X86 and aarch64 platforms. Why?