hbase filter原理_HBase应用|HBase在移动广告监测产品中的应用

21eef787b331a522ac603d19466813f9.png

1

HBase在Ad Tracking的应用

1.1

Ad Tracking的业务场景

Ad Tracking是TalkingData的移动广告监测产品,其核心业务模型是归因。App用户点击广告之后,及随后安装广告跳转到的应用或者游戏,Ad Tracking会对这些点击事件(用户点击广告的行为)和激活事件(用户安装应用的行为)进行监测。

归因需要做的是,接收到激活事件之后,通过激活事件匹配之前接收到的点击事件,如果激活归因到了点击,那么这个激活事件就是点击广告带来的,也就归因到了该广告对应的推广活动,而推广活动对应某个渠道,归因到了推广活动就归因到了投放广告的渠道等。后续的所有效果点事件(例如应用内的注册、登录等事件)也都将通过对应的激活事件找到对应的推广活动信息。

激活和各种效果点事件的原始信息,包括对应的设备、归因到的推广活动等,都可以提供给Ad Tracking用户为参考——Ad Tracking的数据导出功能。

1.2

HBase与数据导出

HBase作为一个分布式的列式存储,拥有强悍的数据写入能力,由于是列式存储,随着后期需求的增加,可以动态的增加存储的字段,非常契合Ad Tracking的数据导出的业务场景。

通过合理的设计rowkey,HBase又能保证很快的查询速度,用户在Ad Tracking后台进行数据导出之后,基本上秒级时间就能够完成数据的下载,能够保证很好的导出体验。

下面将对HBase的架构原理和在Ad Tracking数据导出功能中的应用进行介绍下。

2

HBase的架构

c453b12ebf82b9d5916288df17450ec9.png

图:HBase的基本架构

  • master:

    ▫表的操作,例如修改列族配置等

    ▫region的分配,merge,分割

  • zookeeper:

    ▫维护服务器存活、是否可访问的状态

    ▫master的HA

    ▫记录HBase的元数据信息的存储位置

  • region server:数据的写入与查询

  • hdfs:数据的存储,region不直接跟磁盘打交道,通过hdfs实现数据的落盘和读取

3

数据的写入

3.1

数据的写入过程

033ec3cc3e38fb1b803e2292b75deb26.png

图:数据的写入概览

  • WAL:write ahead log,数据首先写入log,保证数据不丢失,该log也是保存在hdfs上

  • MemStore:数据进入内存,按照rowkey进行排序

  • HFile:MemStore中的数据到达一定量或者一定时间,创建HFile落盘

3.2

数据格式

HBase存储的所有内容都是byte数组,所以只要能转化成byte数组的数据都可以存储在HBase中。

4

存储模型

907f1285f826856d11357c1b29f51be4.png

图:HBase的存储概念模型

  • 表:一个表由一个或者多个列族构成

  • 行:一个行包含多个列,列通过列族进行分类,每一行都有唯一主键rowkey

  • 列族:列族包含若干列,这些列在物理上存储在一起,所以列族内的列一般是在查询的时候需要一起读取。数据的属性,例如超时时间、压缩算法等,都需要在列族上定义

  • 列:一个行包含多个列,多个列维护在一个或者多个列族中

  • 单元格:列的内容保存在单元格中,如果有过更新操作,会有多个版本

5

存储实现

b8cde072a8e2c28b5fb4bf63ab96b2ed.png

图:HBase的存储结构

5.1

region

Table的数据以region的形式分布在所有的服务器上。region的存在是为了解决横向扩展问题。

5.1.1

region的拆分

通过将数据均衡的分布到所有机器上,可以充分利用各个服务器的能力,提高查询速度。随着数据的不断写入,region会不断增大,region太大会影响查询性能,所以hbase会自动对region进行拆分。

下面是两种常见的region的拆分策略:

  • ConstantSizeRegionSplitPolicy:老版本的Hbase使用的拆分策略,按照固定的大小进行拆分,默认为10G。缺点:太死板、太简单,无论是数据写入量大还是小,都是通过这个固定的值来判断

  • IncreasingToUpperBoundRegionSplitPolicy:新版本的默认策略,这个策略能够随着数据增长,动态改变拆分的阈值。

5.1.2

region的merge

场景:region中大量数据被删除,不需要开始那么多region,可以手动进行region的merge

5.2

store

一个region内部有多个store,store是列族级别的概念,一个表有三个列族,那么在一台服务器上的region中会有三个store。

5.2.1

MemStore

每个列族/store对应一个独立的MemStore,也就是一块内存空间,数据写入之后,列族的内容进入对应的MemStore,会按照rowkey进行排序,并创建类似于Btree的索引——LMS-Tree。

LMS-Tree(Log-Structured Merge Tree)

LMS树采用的索引结构与B+Tree相同,而且通过批量存储技术规避磁盘随机写入问题,因为数据过来之后,首先会在内存中进行排序,构建索引,当到达一定的量的时候,flush到磁盘中,随着磁盘中的小文件的增多,后台进行会自动进行合并,过多的小文件合并为一个大文件,能够有效加快查询速度。

038d6bb36dc6d0572044acaa66d328b5.png

图:LMS树的合并

flush时机:

  • 大小达到刷写阀值

  • 整个RegionServer的memstore总和达到阀值

  • Memstore达到刷写时间间隔

  • WAL的数量大于maxLogs

  • 手动触发flush

5.2.2

HFile

HBase的数据文件,HBase的所有数据都保存在HFile中,查询的时候也是从HFile中进行查询。

HFile包含多个数据块,存储了一个列族内的数据,以及相关的索引:

  • scan block:scan查询的时候需要读取的部分

    ▫data block:数据KV存储

    ▫leaf index block:Btree的叶子节点

    ▫bloom block:布隆过滤器

  • none scan block

    ▫meta block

    ▫intermediate index block:Btree的中间节点

  • load on open:HFile加载的时候,需要加载到内存的部分

    ▫root index block:Btree的根节点

    ▫meta index

    ▫file info

    ▫bloom filter metadata:布隆过滤器的索引

  • trailer:记录上面各个部分的偏移量,HFile读取的时候首先读取该部分,然后获取其他部分所在的位置

Hfile的compaction:

每次memstore的刷写都会产生一个新的HFile,而HFile毕竟是存储在硬盘上的东西,凡是读取存储在硬盘上的东西都涉及一个操作:寻址,如果是传统硬盘那就是磁头的移动寻址,这是一个很慢的动作。当HFile一多,每次读取数据的时候寻址的动作变多,查询速度也就变慢。所以为了防止寻址的动作过多,需要适当地减少碎片文件,后台需要持续进行compaction操作。

compaction的分类:

  • 小compaction:小的HFile的合并成大的

  • 大compaction:大的最终合并成一个,注意:只有在大compaction之后,标记删除的文档才会真正被删除

compaction的过程:

  • 读取compaction列表中的hfile

  • 创建数据读取的scanner

  • 读取hfile中的内容到一个临时文件中

  • 临时文件替换compaction之前的多个hfile

6

数据查询

6.1

查询顺序

1. 首先查找block cache:HFile的load on open部分是常驻内存的,data block是在磁盘上的,查询的时候,定位到某个data block之后,HBase会将整个data block加载到block cache中,后续查询的时候,先检查是否存在block cache中,如果是,优先查询block cache。之所以可以这么放心的使用block cache,是基于Hfile的不可变性,后续的修改和删除操作不会直接修改HFile,而是追加新的文件,所以只要HFile还在,对应的block cache就是不变的。

2. block cache查询不到再去查找region(memstore + hfile):通过hbase的元数据表,找到需要查询的rowkey所在的region server,从而定位到memstore和hfile

6.2

region的查找过程

7fe3df68ef5e7059bb88173e32d149db.png

图:region的查找过程

一个表有多个region,分布在不同机器上,需要一定的机制来确定需要查找的region

  • 通过zk找到meta所在的sever:meta表的位置保存在zk中,meta中保存了每个region的rowkey范围,以及region所在的位置

  • 通过meta查询出需要查询的region所在的服务器

  • 到服务器上进行查询

客户端会对meta信息进行缓存,加快查询速度。

6.3

查询API

  • get:查询某个rowkey对应的列

  • scan:指定rowkey范围的扫描(setStartRow, setStopRow)

  • filter:scan过程中,对内容进行过滤

其中指定rowkey范围是最有效的加快查询速度的方式,不限定rowkey的范围则需要全表扫

7

 Ad Tracking的HBase设计

rowkey结构:分区key-pid-eventTime-spreadid-序列

  • 分区key:应用的唯一key(随机字符串)的hashcode / hbase的region个数

  • pid:应用的自增唯一主键

  • eventTime:事件的时间

  • spreadid:推广活动的自增唯一主键

  • 序列:随机序列,保证上述字段相同的事件不会覆盖写入

Ad Tracking的hbase的rowkey是按照业务字段来设计的,相同应用的数据保存在同一个region中,查询快,但是由于用户的数据量不同,查询量也不同,可能导致热点数据,造成某台机器负载过高,影响机群正常工作。目前Ad Tracking的HBase的各个region空间占用尚存在一定程度的不均衡,但是还能接受。

一般HBase的rowkey中或多或少的会包含业务相关的信息,完全采用随机的rowkey,跟业务不相关,查询的时候只能全表扫,查询效率低。rowkey设计的关键就在于权衡查询速度和数据均衡之间的关系,下面介绍几方面rowkey的设计建议。

7.1

rowkey长度设计建议

  • 数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 rowkey 过长,比如超过 100 字节,1000w 行数据,光 rowkey 就要占用 100*1000w=10 亿个字节,将近 1G 数据,这样会极大影响 HFile 的存储效率;

  • MemStore 将缓存部分数据到内存,如果 rowkey 字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率;

  • 目前操作系统大都是 64 位系统,内存 8 字节对齐,rowkey长度建议控制在 16 个字节(8 字节的整数倍),充分利用操作系统的最佳特性。

7.2

rowkey设计方式-加盐

5775bf047912eae78d8e16237acf3e3b.png

图:rowkey设计方式-加盐

使用固定的随机前缀:

  • 优点:数据均衡

  • 缺点:因为前缀是随机的,所以无法快速get;而scan的速度还可以

7.3

rowkey设计方式-hash

b416834baac7788a3014bacebf928feb.png

图:rowkey设计方式-哈希

rowkey hash之后取md5的前五位:

  • 优点:打散数据,前缀在查询的时候能通过rowkey得到,可以很快get

  • 缺点:相同前缀的rowkey被打散,scan变慢

7.4

rowkey设计方式-反转

fa0a17b7abc513db14aa7ce377d8b1ba.png

图:rowkey设计方式-反转

反转一段固定长度的rowkey,或者整个反转。上图中三个网址属于相同域名下的,但是如果不反转,会完全分散到不同的region中,不利于查询。

end

参考资料

  • [hbase-io-hfile-input-output](http://blog.cloudera.com/blog/2012/06/hbase-io-hfile-input-output/)

  • [深入理解HBase的系统架构]
    (https://blog.csdn.net/Yaokai_AssultMaster/article/details/72877127)

  • [HBase底层存储原理]
    (https://www.cnblogs.com/panpanwelcome/p/8716652.html)

  • [HBase – 探索HFile索引机制]
    (http://hbasefly.com/2016/04/03/hbase_hfile_index/)

  • [HBase – 存储文件HFile结构解析]
    (http://hbasefly.com/2016/03/25/hbase-hfile/)

作者:TalkingData 战鹏弘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse 快捷键及插件

webstorm设置keymap为eclipse也可使用。 快捷键 快捷键用途使用方法编辑器事件ctrlt打开继承树将鼠标移到某个类上,按ctrltctrl/注释本行altshiefj生成属性注释,这杨的/**/ctrlalt 下箭头复制本行到下一行alt 下箭头移动本行到下一行ctrld删除整行alt/…

drools动态配置规则_关于规则引擎

很早之前就知道Drools,这几天正好有个项目,里面用了大量的规则定义,就想是否能采用Drools来解决。在github上分析了规则引擎项目,包括:Easy-ruleshttps://github.com/j-easy/easy-rules通过程序代码来完成规则引擎&…

linux安装mysql5.6

目录 准备工作 运行环境 确认你的安装版本 下载MySQL 安装MySQL 准备安装环境 编译和安装 配置MySQL 单实例配置 单实例配置方法 添加防火墙 启动MySQL 重启MySQL 多实例配置 什么是多实例 多实例配置方法 创建启动文件 初始化数据库 配置防火墙 启动MySQL 登陆MySQL 重启MySQL…

Spring 4 MVC入门实例

Spring 4发布很长一段时间了,从 Spring 3 到 Spring 4 有巨大的改变。网上还有很多教程是基于 Spring 3.0 的,甚至 Spring 2.5,要想按照网上的教程“按图索骥”还是挺困难的。纵有一些 Spring 4.0 MVC 的教程例子,也往往是 “Spri…

python写入二进制文件的库_python之写入二进制文件

概述 计算机都是以二进制存储文件的,如mp3、图片等,文本文件也是如此,在本节中以二进制模式写入文件 写文件的很多操作,与读文件的操作是相同的,建议先看 读取二进制文件 打开文件 读写文件,要先通过内置op…

gulp插件gulp-ruby-sass和livereload插件

gulp-ruby-sass是gulp的一个插件,主要是用来实现sass编译,livereload插件主要是实现文件保存时浏览器自动刷新,避免了手动f5的频繁的操作 准备工作:chrome浏览器安装livereload插件,没有安装的可以百度搜索或者FQ下载&…

eclipse 创建 maven web 项目教程

(1)新建一个Maven 项目 file –> new –> maven project 直接点 next 直接点 next 填写groupid和artifactid,这两个可以随便填,名称而已。填完 finish (2)将项目转成 Dynamic Web项目 选中项目&#…

sql backup database备份d盘_ClickHouse 备份与恢复

本文转载自 万能修实验室 作者:公先生 ID: dropudatabase我们评估一款数据库产品,除了稳定性和易用性外,数据安全也十分重要,备份与恢复往往是最后一道安全门。但如果备份策略不完善、恢复手段无效,一旦发生数据误删除…

线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式

start 方法和 run 方法的比较代码演示:/** * * start() 和 run() 的比较 * * * author 踏雪彡寻梅 * version 1.0 * date 2020/9/20 - 16:15 * since JDK1.8 */public class StartAndRunMethod { public static void main(String[] args) { // run 方法演示 // 输出: name: mai…

webgl 游戏_如何选择 WebGL 框架和引擎?

数据可视化Sugar-百度智能云​cloud.baidu.comSugar 是我们从零开始开发的 BI 产品,可以不用写 SQL 制作报表及大屏页面,上半年我们发布了三维场景功能,可以放到大屏中展现:为了实现这个功能,我们调研了大量 WebGL 相关…

java 正则表达式 替换字符串img标签的路径_正则表达式和有限自动机的应用

1. 为什么谈有限自动机时要谈正则表达式?原因是:正则表达式所匹配的所有字符串所构成的语言可以用有限自动机识别。根本原因是:正则集(正则表达式所匹配的所有字符串集合)是由右线性文法(3型文法&#xff0…

14.6 Spring MVC 测试框架(翻译)

14.6 Spring MVC 测试框架(每天翻译一点点) Spring MVC测试框架对 Spring MVC 代码提供一流的测试支持 ,它拥有一个 fluent API ,可以和JUnit, TestNG 或其它任何测试框架协同使用。 此测试框架基于 spring-test 模块的Servlet API mock obje…

html读取本地txt_手机本地电子书籍阅读器 — 静读天下

在早期山寨按键手机流行的年代手机中必装两款软件莫过于Anyview和Opera浏览器了,一个是本地最佳阅读工具另一个是压缩流量访问网页的利器,时过境迁好多人都早以忘记了这些昔日的王者。曾经那帮挑灯夜读看小说的熊孩子都已经长大了,在难得的休…

华为手机丢失定位网站_手机端网站优化要从网站的设计和定位开始入手

移动端网站优化要从网站的设计和定位开始入手,重要的是简洁易用,切忌复杂,令用户搞不明白找不到想用的。对于搜索引擎而言,好的用户访问体验也是排名的最佳标准。下面小编就来分析一下设计对手机端网站优化排名的影响。1、使用规范…

安卓接受后台数据转换解析出错_安卓手机内存越大,速度就会越快?

与非网 2 月 18 日讯,现在安卓手机的内存在产品规划上越来越大,2020 年发布的旗舰手机运行内存已经拓展到惊人的 10GB 以上,而这个运存大小已经超过笔记本主流的 8GB 内存,手机到底需要这么大的内存吗?安卓手机的内存为…

ipv6地址格式_IPV6与IPV4的差异

ipv6相比,我们现在的IPV4,有什么优势,有什么差异IPv6的路由表更小,IPv6的组播支持以及对流的支持增强,IPv6加入了对自动配置的支持,IPv6具有更高的安全性. 与IPV4相比,IPV6具有以下几个优势:IPv6具有更大的地址空间。IPv4中规定IP…

反序列化对象列表发生异常_通过反序列化漏洞,黑客能做什么呢?

在之前的文章中讲解了一个反序列化的例子,我们已经知道,通过反序列化漏洞,黑客可以调用到Runtime.exec()来进行命令执行。换一句话说,黑客已经能够在服务器上执行任意的命令,这就相当于间接掌控了你的服务器&#xff0…

tcl之内容

转载于:https://www.cnblogs.com/chip/p/5847126.html

js密码强度正则表达式_知道这20个前端正则表达式,能让你做项目时少写1000行甚至一万行

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升。正则表达式经常被用于字段或任意字符串的…

腾讯视频客户端导出MP4格式

腾讯视频下载下来之后是.qlv格式,这种格式只能使用客户端播放。感觉挺蛋疼的,Mp4好不容易让各种设备都可以统一播放视频了,这样一搞感觉又倒退了几十年,关键的是,有些资源是腾讯独家的,不装客户端就看不了&…