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,一经查实,立即删除!

相关文章

thinkphp5中使用workerman

1、composer安装tp5的swoole插件 composer require topthink/think-worker2、WorkerController控制器 namespace app\index\controller;use think\worker\Server; use Workerman\Connection\TcpConnection;class WorkerController extends Server {protected $socket http://0…

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

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

WEB打印大全

1、控制"纵打"、 横打”和“页面的边距。 &#xff08;1&#xff09;<script defer> function SetPrintSettings() {  // -- advanced features  factory.printing.SetMarginMeasure(2) // measure margins in inches  factory.SetPageRange(false, 1, 3) /…

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

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

短信发送的流程,硬编码在了服务方法里面,优化方案

短信发送的流程&#xff0c;直接硬编码在服务方法里面。怎样优化&#xff1f; 须要建立一个系统的短信发送表。定义短信发送模板&#xff1b; 通过批处理&#xff0c;比方spring batchquartz&#xff0c;去扫描这个表。来统一进行短信发送处理。 而不是各自service&#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…

给学Java的大学生们分享一些经验

想来学习Java也有两个年头了&#xff0c;永远不敢说多么精通&#xff0c;但也想谈谈自己的感受&#xff0c;写给软件学院的同仁们&#xff0c;帮助大家在技术的道路上少一点弯路。说得伟大一点是希望大家为软件学院争气&#xff0c;其实最主要的还是大家自身的进步提升—— 1&a…

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

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

访问数据库_Lua 数据库访问

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

OkHttp 3.x 源码解析之Interceptor 拦截器

拦截器 Java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码&#xff0c;也可以在一个action执行前阻止其执行&#xff0c;同时也提供了一种可以提取action中可重用部分的方式。 在AOP&#xff08;Aspect-Orient…

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;后面再介绍动态视频以…

JAVA视频教程

http://www.icoolxue.com/album/show/38 因为需要对接接口&#xff0c;所以需要学服务器的语言&#xff0c;java&#xff0c;新的旅程开始转载于:https://www.cnblogs.com/chuangyiyuan/p/7118551.html

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

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

网络技术术语英汉对照

1. ADSL (Asymmetric Digital Subscriber Line) 非对称数字环路 2. ANSI (American National Standard Institute) 美国国家标准协会 3. APIPA (Automatic Private IP Addressing) 自动私有IP寻址 4. AppleTalk 由Apple公司推出的一种多层协议,一种可路由协议组 5. ARP (Addres…

利用photoshop制作gif图片

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