| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hbase 深度使用分析 -> 正文阅读 |
|
[大数据]Hbase 深度使用分析 |
版本描述:Hbase 2.X 版本CRUD场景描述:
循环put...那是不可能的..可以使用put(List<Put> puts) 需要注意的是当一部分数据插入成功后,此时某个RegionServer出现异常,之前的数据是不会回滚的,对于插入失败的数据hbase默认会进行重试直到到达最大重试次数还是失败即会结束重试(失败数据在写缓冲区),不过如果列族错误了,那么不会进行重试,直接抛出异常
get(List<Get> gets) 返回一个Result数组,如果一部分数据失败,一部分数据查询成功,最终hbase还是会返回异常,如果你希望不要抛出异常而是返回成功部分的数据,那么可以使用batch接口进行查询
常见的OLTP数据库,最常用的就是各种join语法,不过在hbase可不支持这种语法,那么当我们需要通过部分条件查询批量数据的时候就会用到scan命令,不过考虑到性能那么我们一般使用scan(byte[] startRow,Filter filter) 这里的filter是用来翻页的,这个时候hbase会返回一个ResultScanner对象(这个时候hbase还没有真正的去scan数据,只是返回了你这个构建器对象而已) Hbase 数据结构:
当然hbase也和常见数据库一样有一个行数据主键(Rowkey),每一个行都有一个rowkey,这个是按照字典排序的 Hbase必知概念:
很多MQ架构中都提供了异步刷盘/同步刷盘机制,其实hbase的WAL也和这个是一样的逻辑,WAL同样提供了异步/同步方式,同步方式对性能损耗较大但是数据100%安全,根据自己业务场景的实际需要改变 我刚开始的时候也有一个疑问,这种架构总觉得怪怪的,后来我发现是我肤浅了,我的疑问是:数据先写到WAL中,然后内存store汇聚数据,在写道hfile中,但是WAL和HFile的存储介质都是HDFS,那么不是有点多此一举么,其实这么设计的问题在于数据的顺序性,因为HDFS上的文件不能编辑,而数据库数据存放的顺序性是很重要的,如果我们数据一到就写到HDFS中,那么你很难保障数据的是顺序的,那么Menstore的价值就是在于内存整理顺序批量一次性的写到硬盘,那么这批数据的顺序性就是有保障的
HFile是由一个个块组成的,默认每个块64KB
Hbase之疑问?hbase是一个随机读写数据库,并且上面也说到HDFS时不支持编辑文件内容的,那么hbase怎么完成CRUD的? 其实hbase基本都一直再做新增操作,刚刚说道CELL是多份的,当你编辑的时候其实hbase新增了一份cell,只是内部的版本号信息比之前的大,当你删除一条数据的时候,hbase还是做了新增操作,只是这条数据没有value,并且类型是DELETE,常用术语墓碑标记 那么疑问又来了,一直在做insert操作,第一个是垃圾数据会非常的庞大,第二个是数据的顺序性肯定不对了,其实hbase每隔一段时间会进行一次合并(这个操作和CK很类似)合并分为两种类型(minor和major)major合并过程中如果发现墓碑标记,那么就会忽略这条数据,这个时候这条数据才是真正的被物理删除了 Hbase数据的读取Hbase实际的读取顺序是先从BlockCache中找数据,找不到了再去Memstore和HFile中查询数据。 在Scan扫描的时候store会创建StoreScanner实例。StoreScanner会把MemStore和HFile结合起来扫描,所以具体从MemStore还是HFile中读取数据,外部的调用者都不需要知道具体的细节。当StoreScanner打开的时候,会先定位到起始行键 Client? -? Region 最早期的hbase采用了三层查询方式,现在已经废弃了因为代码复杂还没啥实际意义 现在已经变成了两层查询方式,
Hbase 进阶过滤器,在scan查询的时候经常用到,可以看成SQL语句中的where条件,在遍历过程中,不满足filter条件的数据就会被过滤 过滤器的模糊值匹配?
上面那段代码会有个小问题就是一个列族下其他列也满足这个条件的话数据也会被捞出,那么指定列进行值匹配的话需要看下面的代码
过滤器的精确值匹配
过滤器的值预算匹配
Hbase的分页 hbase 并没有SQL的limit现成功能,需要传入PageFilter并且当第一页数据取完,想获取第二页数据的时候需要将前一页最后条数据的rowkey记录下来,变成第二页的startRowkey来使用。 不过Hbase的分页有个坑,一般初次使用很容易被坑进去,它并不能精确的按照你的分页条数返回数据,可能会比你定义的分页条数多,主要原因是因为你的Filter会到各个Region中执行,所以如果想要精确的条数,还需要自己在内存中排序处理下 结果集返回指定列族 列族过滤器,FamilyFilter
结果集返回指定列
Hbase 调优作者刚进得物的时候就接手了一个hbase调优的任务项,当时的场景是hbase的get缓存命中率在92%以上,但是P99 在8~10MS之间,期望调优后可以将P99稳定在4~5MS之间,要知道Hbase是java开发的,那么避免不了就是GC的问题 本文从几个角度考虑hbase的调优
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:42:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |