hive建立内部表映射hbase_快手 HBase 在千亿级用户特征数据分析中的应用与实践...

f29d3c519da34e6451b6a49e08511ef6.png

分享嘉宾:陈杨 快手

编辑整理:Hoh Xil

内容来源:BigData NoSQL 12th Meetup

出品社区:DataFun

注:欢迎转载,转载请注明出处。

快手建设 HBase 差不多有2年时间,在公司里面有比较丰富的应用场景:如短视频的存储、IM、直播里评论 feed 流等场景。本次只分享其中的一个应用场景:快手 HBase 在千亿级用户特征数据分析中的应用与实践。为什么分享这个 Topic?主要原因:对于大部分公司来说,这都是一个普适的场景,因为很普遍,所以可选择的分析引擎也非常多,但是目前直接用 HBase 这种分析用户特征的比较少,希望通过今天的分享,大家在将来遇到这种场景时, 可以给大家提供一个新的解决方案。

本次分享内容包括:

  • 业务需求及挑战:BitBase 引擎的初衷是什么;
  • BitBase 解决方案:在 HBase 基础上,BitBase 的架构是什么样;
  • 业务效果:在快手的实际应用场景中,效果如何;
  • 未来规划:中短期的规划。

▌业务需求及挑战

1. 业务需求

812fcee002c90a5daa34cded3d93fcdc.png

用一句话来概括业务需求:在千亿级日志中,选择任意维度,秒级计算7-90日留存。

如上图所示。左边是原始数据,可能跨90天,每一天的数据可以看作是一张 Hive 宽表,在逻辑上可以认为每行数据的 rowkey 是 userId(这里不严谨,userId 可能是重复的),需要通过90天的原始数据计算得到右边的表,它的横轴和纵轴都是日期,每个格子表示纵轴日期相对于横轴日期的留存率。

该需求的挑战:

  • 日志量大,千亿级;
  • 任意维度,如 city、sex、喜好等,需要选择任意多个维度,在这些维度下计算留存率;
  • 秒级计算,产品面向分析师,等待时间不能过长,最好在1-2秒。

2. 技术选型

67d208a82a8951efbad612b94cf08d8c.png

面对这些问题,我们当时的技术选型:

① Hive,因为大部分数据可能是存在 Hive 里,可以直接写 SQL 计算,该方案不用做数据迁移和转换,但是时延可能是分钟到小时级别,因此否定了这个方案。

② ES,通过原始数据做倒排索引,然后做一个类似计算 UV 的方式求解,但是在数据需要做精确去重的场景下,它的耗时比较大,需要秒到分钟级。

③ ClickHouse,ClickHouse 是一个比较合适的引擎,也是一个非常优秀的引擎,在业界被广泛应用于 APP 分析,比如漏斗,留存。但是在我们的测试的中,当机器数量比较少时 ( <10台 ),耗时依然在10秒以上。

立足于这种场景,是否存在其它解决方案,延迟可以做到2-3秒(复杂的场景10秒以下),同时支持任意维度组合?基于 HBase,结合业界简单/通用的技术, 我们设计并实现了 BitBase 解决方案,用很少的资源满足业务需求。

▌BitBase 解决方案

1. 数据模型

8a6d0fda8413f83bc41c686d9bd5ba12.png

如上图所示,首先将原始数据的一列的某个值抽象成 bitmap(比特数组),举例:city=bj,city 是维度,bj (北京) 是维度值,抽象成 bitmap 值就是10100,表示第0个用户在 bj,第1个用户不在北京,依次类推。然后将多维度之间的组合转换为 bitmap 计算:bitmap 之间做与、或、非、异或,举例:比如在北京的用户,且兴趣是篮球,这样的用户有多少个,就转换为图中所示的两个 bitmap 做与运算,得到橙色的 bitmap,最后,再对 bitmap 做 count 运算。count 表示统计“1”的个数,list 是列举“1”所在的数组 index,业务上表示 userId。

2. BitBase 架构

8e13a86dc089769f7accaf9f79cfbbac.png

整个 BitBase 架构包括五部分:

  • 数据存储:主要存储两类数据,一类数据是 bitmap 索引和数据,另一类是转换字典的归档文件(见后面描述)。
  • 数据转换:有两种方式,第一种是通过 mrjob 转换,第二种是在线计算或导入;
  • 数据计算:负责计算和调度,并把 IO 数据计算结果返回给 Client;
  • Client:站在业务的角度,把它们的业务逻辑分装成一个个业务的接口;
  • ZK:整个系统是一个分布式的服务,用 ZK 做管理。

3. 存储模块

ef9a0a420dd0cb015e828e2c4afc2dd1.png

用数据存储设计的核心目的是让计算更快。

如上图,左边为一天的原始数据,包括多个 table,通过 mrjob 或者 rpc 的方式转换成中间的 bitmap。

bitmap 分为两部分,第一部分为 meta 信息(橙色部分),第二部分是 data 信息:

  • Meta 信息唯一定位一个 bitmap,db 可以认为是 hive 中的 db,table 也可以认为是 hive 中的 table,event 表示维度 (如:城市),eventv 表示维度值 (如:bj),entity 表示 userId(也可能是 photoId),version 表示版本。
  • BitmapData 从物理上讲是一个比特数组,把比特数组按照一定的大小进行切块:b1,b2,b3,...,bn,从而实现分块存储,分块计算。

最后把 bitmap 存在 HBase 的3张表中: 两张核心表和一张辅助表。

  • BitmapMeta, 保存 bitmap 的 meta 信息和一些 block 索引信息。
  • BlockData, 直接保存 bitmap block 数据。
  • BlockMeta,保存 block 的 meta 信息,起辅助作用。

4. 计算模块

ed97a3bf4f69213df792d9c22a6fa372.png

一个完整的计算流程涉及到三个组件:BitBase Client、BitBase Server 和 HBase regionServer。

① BitBase Client 首先把业务的需求封装成计算表达式,然后把计算表达式发给 BitBase Server;

② BitBaseServe 接收到请求后,从 BitmapMeta 表中查询 Block 索引,然后根据索引将表达式切分为 n 个子表达式;

③ 如果所有 bitmap 的 db 相同,则走 coprocessor 路由,否则按照数据亲和性,将 block 计算分发到其它 bitbaseServer 中。

④ 根据第3步的调度策略,分两条不同的路径计算 block 表达式

⑤ BitBase Server 聚合 block 计算表达式的结果,然后返回给 BitBase Client。

两种计算方式的对比:

  • 非本地计算,解决跨 db 计算的需求,它主要的瓶颈在于网卡和 GC。
  • 本地计算,解决同 db 计算的需求,它主要的瓶颈在 CPU 和 GC 上。整体上看本地计算的性能比非本地计算的性能提高3-5倍,所以要尽量采用本地计算方式。

5. DeviceId 问题

05c82a445dcbaea9a62f24aa1b9dc9f6.png

在引入 Bitmap 数据模型之后,我们隐含的也引入了一个非常大的问题:无法支持 deviceId。要支持 deviceId,首先需要将 deviceId 转化为数字类型,并且转换之后的 DeviceIdIndex 必须要满足四个条件:

① 连续:deviceIdIndex 如果存在空洞,会降低压缩效率,同时 Block 数量会增加,计算复杂度相应增加,最终计算变慢;

② 一致:deviceId 和 deviceIdIndex 必须是一一对应的,否则计算结果不准确;

③ 反解:根据 deviceIdIndex 能够准确、快速地反解成原始的 deviceId;

④ 转换快:在亿级数据规模下,deviceId 转化为 deviceIdIndex 的过程不能太长。

6. DeviceId 方案

连续、一致、支持反解:

8186caff76064dc3b82f2f62595f6e3a.png

如何保证连续、一致、支持反解?解决方案非常简单,利用 HBase 实现两阶段提交协议。如上图中间实线部分所示,定义 deviceId 到 deviceIdIndex 的映射为字典。第一张表存储字典的 meta 信息;第二张表存储 index 到 deviceId 的映射;第三张表存储 deviceId 到 index 的映射。

生成 Index 的过程。举例说明, 假设我们已经生成了 1w 个 deviceId 映射,那么此时 f:max=1w,现在将新生成 1k 条映射:

① 将 f:nextMax=f:max+1k=1.1w;

② 写 Index 到 deviceId 的反向映射表,1k 条;

③ 写 deviceId 到 Index 的正向映射表,1k 条;

④ 把 f:max=f:nextMax=1.1w 更新到 meta 表,生成过程结束。

如果在生成过程中出现异常或服务器宕机,则执行回滚流程:

① 如果我们检测到 f:nextMax 不等于 f:max(f:nextMax>f:max),则从表2中查询 max 到 nextMax 的数据,从表3中删掉相应的 deviceId 到 index 的映射记录;

② 再删掉表2中相应的 index 到 deviceId 的记录;

③ 最后把 f:nextMax=f:max,从而实现数据100%一致。

用 HBase 实现两阶段提交协议要求 index 生成流程和回滚流程一定是单线程的,从而出现性能瓶颈,所以 BitBase 设计了归档流程,以支持快速转换(见后面的描述)。Meta 表中有两个字段,如果发现新产生的数据大于 f:archive_num 就发起归档,把表3中的新数据直接写到 HDFS 中 archive_path 目录下。

快速转化:

95da1ad280ced9e7b14273ea41d4189a.png

这里我们用到了 MRjob 中的 Join:

① 同时输入原始数据和字典归档数据,在 MRjob 中根据 deviceId 做 join;

② 判断 deviceId 是否 join 成功;

③ 如果成功了,直接写 hdfs,这样就得到了转化后的数据;

④ 如果 join 失败,直接请求单实例 BitBase Master,BitBase Master 通过两阶段提交协议生成新的映射;

⑤ 然后返回给 join task 执行替换 deviceId;

⑥ 把转换后的数据写入 hdfs。

反解的过程很简单,直接多并发读取 HBase。

▌业务效果

ec7a60134d98dbb5feec81ac998bd7dc.png

如上图所示,第一个图是,2维度,不同时间跨度计算留存的时间延迟,第2个图是15日留存在不同维度上的时延,时延并不会随着维度的增长而增长,原因是维度越多,表达式中可能不需要计算的 block 块也越多。

982acf398517eb79cd5b79fdbedf926a.png

如上图所示,BitBase 可以应用在 app 分析,用户增长,广告 DMP,用户画像等多个业务场景中。

▌未来规划

e8712dc795895b226bdc136192d0f3f0.png

根据现在面临的业务场景,BitBase 后续会在多个方面做优化。支持实时聚合,在一些业务场景下,如运营效果监测,导入时效需要 <5min,BitBase 需要支持实时聚合;支持 SQL 查询,目前只支持 api 的接入方式,在一些简单场景下比较复杂;开源,希望通过开源,和大家一起挖掘 BitBase 的业务场景。

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

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

相关文章

使用DSX-5000 对已安装的电缆进行故障排除

周一上的早上&#xff0c;福禄克指定经销商—明辰智航接到用户的反馈&#xff1a;我想我的DSX5000测试仪坏了&#xff01;”&#xff0c;虽然他表面是非常坚固的机器&#xff0c;但看起来他的测试结果是错误的时候。 “是什么让你认为它坏了&#xff1f;”我问道&#xff0c;“…

maven添加子工程_重量级!Maven史上最全教程,看了必懂

作者 | 小明菜市场来源 | 小明菜市场(ID&#xff1a;fileGeek)头图 | CSDN 下载自东方IC前言为了持续集成和持续部署&#xff0c;需要把项目改造为&#xff0c;或者使用maven创建项目&#xff0c;下面介绍maven为什么要使用maven在开发中经常需要依赖第三方包&#xff0c;包与…

通过福禄克测试仪进行数据中心机房各个区域的测试或认证

根据您要测试数据中心区域的不同&#xff0c;您可能将遇到不同的应用程序、布线和连接等问题。了解数据中心的功能区域以及每个区域中可能需要测试的内容有助于为数据中心测试做好准备工作&#xff0c;那么当问题来到你身边时&#xff0c;处理就变得很简单。 机房设备摆放有什…

java深拷贝和浅拷贝介绍

浅拷贝概念 深拷贝概念 Data Slf4j public class Sheep implements Cloneable {private String name;private int age;private String color;private Sheep friend;public Sheep(String name, int age, String color) {this.name name;this.age age;this.color color;}Overr…

利用福禄克DSX系列测试仪部署MPTL模块化插头端接链路

在与客户合作时&#xff0c;认识到MPTL&#xff08;模块化插头端接链路&#xff09;比使用传统插座、面板和设备跳线更适合连接设备的地方非常重要。如果您要部署这种&#xff0c;福禄克网络指定经销商—明辰智航的工程师会在测试时介绍给您。 如果您与零售场所、教育场所和酒…

访问数据库_Lua 数据库访问

Lua 数据库访问本文主要为大家介绍 Lua 数据库的操作库&#xff1a;LuaSQL。他是开源的&#xff0c;支持的数据库有&#xff1a;ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。本文为大家介绍MySQL的数据库连接。LuaSQL 可以使用 LuaRocks 来安装可以根据需要安装你需要的数…

cwntos新建目录挂载磁盘_详解Linux磁盘挂载、分区、扩容操作的实现方法

概述今天主要分享下关于Linux磁盘挂载、分区、扩容操作的实现方法&#xff0c;先介绍下基本概念1、磁盘在Linux系统中所有的设备都会以文件的形式存储。设备一般保存在/dev目录下面&#xff0c;以sda、sda1、sda2 …,sdb、sdb1…,hda,hdb。现在的设备一般都是sd命名&#xff0c…

【翻译】WF从入门到精通(第六章):加载和卸载实例

上一篇&#xff1a;【翻译】WF从入门到精通&#xff08;第五章&#xff09;&#xff1a;workflow跟踪学习完本章&#xff0c;你将掌握&#xff1a; 1.理解工作流实例为什么要卸载和重新加载及其时机 2.理解工作流实例为什么要持久化及其时机 3.搭建SQL Server 2005&am…

python人脸照片分类_Python OpenCV 人脸识别(一)

前面介绍了Numpy模块&#xff0c;下面再介绍一个OpenCV模块&#xff0c;就基于这两个库看一下当下很火的人工智能是如何实现的&#xff0c;我们介绍几个&#xff1a;人脸识别(当下非常火的)、音视频操作等等。今天先介绍一下静态图片的人脸识别&#xff0c;后面再介绍动态视频以…

万兆以太网测试仪应该具备什么功能

在以太网技术中&#xff0c;100BaseT是一个里程碑&#xff0c;确立了以太网技术在商业用途的统治地位。千兆以太网以及随后出现的万兆以太网标准是两个比较重要的标准&#xff0c;以太网技术通过这两个标准从商业用途的局域网技术延伸到校园网以及城域网的汇聚和骨干。 以太网…

利用photoshop制作gif图片

首先准备你需要的几张素材图片 1.将素材图片根据发生的顺序放置在不同的图层 2.打开窗口下的时间轴 选择帧动画 3.创建第一张帧动画 选项卡右边这个按钮&#xff0c;点击这个选择新建帧 第一张图片显示其他的隐藏 就是图层那儿左边的眼睛 4.创建第二章帧 新建帧--点击第二个图层…

光纤铜缆测试安装的基础知识你都了解了吗?

福禄克经销商—明辰智航走访了多名读者&#xff0c;发现他们都说自己精通测试系统设计、安装和测试&#xff0c;但是很多行业的新标准新要求却是很懵懂。所以&#xff0c;了解当前较新的性能参数&#xff0c;系统必须满足的各种标准和要求以支持新的应用&#xff0c;确保为客户…

不禁网页的浏览器_网页游戏兴衰史:「农场」没有菜,「渣渣辉」不贪玩

本文经授权转载自 | 国家人文历史ID |gjrwls作者 |巴里安200X年某月某日凌晨2点50&#xff0c;小明悄悄打开房门&#xff0c;蹑手蹑脚地走进存放笔记本电脑的房间&#xff0c;将拔下电源的电脑抱紧在怀里&#xff0c;悄悄地回了房间。一进房&#xff0c;小明兴奋地打开电脑&…

Java策略模式demo(打折策略例子)

策略模式&#xff1a;它定义了算法家族&#xff0c;分别封装起来&#xff0c;让它们之间可以相互替换。此模式让算法的改变&#xff0c;不会影响到使用算法的客户端。 它对一系列的算法进行封装&#xff0c;为所有的算法定义一个抽象的接口&#xff0c;并通过继承该抽象算法接…

java 多态判断非空_收藏Java 面试题全梳理

脚本之家你与百万开发者在一起来源 | Java建设者(ID&#xff1a;javajianshe)作者 |cxuan如若转载请联系原公众号Java 基础篇Java 有哪些特点并发性的&#xff1a;你可以在其中执行许多语句&#xff0c;而不必一次执行它面向对象的&#xff1a;基于类和面向对象的编程语言。独立…

福禄克官方经销商给您科普光纤极性基础

极性定义了流动的方向&#xff0c;例如磁场或电流的方向。在光纤中&#xff0c;极性是定向的&#xff1b;光信号通过光缆从一端传输到另一端。光缆一端的光纤链路传输信号&#xff08;Tx&#xff09;必须与另一端的相应接收器&#xff08;Rx&#xff09;匹配。那么&#xff0c;…

django Form组件

django Form组件 Django的Form主要具有一下几大功能&#xff1a; 生成HTML标签验证用户数据&#xff08;显示错误信息&#xff09;HTML Form提交保留上次提交数据初始化页面显示内容小试牛刀 1、创建Form类 from django.forms import Form from django.forms import widgets #…

RUP大讲堂(第三讲):如何建立软件产品的愿景

我撰写的一些关于RUP的讲义&#xff0c;PDF格式&#xff0c;可在文后点击“附件下载”阅读全文。本篇内容简介及部分截图&#xff1a;◇ 为什么需要愿景◇ 业务愿景◇ 系统愿景◇ 导出愿景的技巧◇ 小结