QCon 全球软件开发大会(北京站)门票 9 折倒计时 4 天,点击立减 ¥880 了解详情
写点什么

如何在 30 分钟内完成数十亿条数据的分析?

2019 年 6 月 27 日

如何在30分钟内完成数十亿条数据的分析?


1. 受众分析需求及难点


TalkingData 推出的数字化营销平台(Smart Marketing Cloud,以下简称 SMC),提供了一套从人群构建、客群洞察,再到同步投放、客观监测的一体化解决方案,帮助企业构建完整的数字化营销闭环。SMC 服务多个行业的广告主和广告代理,帮助他们对目标受众人群进行分析、洞察和触达。但是由于 SMC 汇集了包括一方企业数据、二方媒体数据和 TalkingData 自有数据在内的多源数据,数据量非常大;此外,为了对受众人群进行全面、深入的画像,TalkingData 基于人口属性、移动端行为偏好等建立了拥有六大类别、800 多个标签的标签体系,维度非常多。这对数据的处理分析提出了巨大的挑战。


在具体使用中,产品性能是企业非常重视的方面。为了提升 SMC 的性能,让用户能够快速、准确的实现目标受众洞察,我们从技术上对 SMC 的受众分析能力进行了三大方面的优化。


2. 使用技术原理及方案:


Bitmap 计算


在 SMC 中,由于数据量巨大,我们对所有广告主构建的受众人群均会使用 RoaringBitmap 进行存储。由于 RoaringBitmap 只能存储整型数据,而我们需要处理的数据量在大多数情况下高达数十亿条,故我们将 RoaringBitmap 进行扩展,使之支持长整型数据。


原生 RoaringBitmap 只支持 int 类型,最大数据存储量为 2147483647,由于 TalkingData 设备数据量约 80 亿,已远远超过 RoaringBitmap 的存储范围,所以需要使用长整型来扩展 RoaringBitmap。



以 set(long)方法为例,寻址方法大概如下代码所示:


public void set(long offset) {    int index = (int) (offset / max());    int value = (int) (offset % max());    bitmaps.get(index).set(value);}

复制代码


扩展之后的 RoaringBitmap,已经获得了比较好的存储和读取速度。但这还只是开始,随后还需要对这些人群数据进行多维度的分析和计算。


RocksDB 加速计算


SMC 的受众分析维度包含:人口属性维度、设备属性维度、商旅属性、App 行为分析等。基于以上维度对某个广告受众人群包进行分析时,需要进行约 10 万次 Bitmap 的交并运算,此时系统 CPU 和 I/O 就成了瓶颈。于是我们采用 RocksDB 进行 Bitmap 的缓存,以减少 I/O 耗时。


RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进行调优,包括直接使用内存、使用 Flash、使用硬盘或者 HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生产和调试使用。


RocksDB 优势如下:


  • 为需要存储 TB 级别数据到本地 FLASH 或者 RAM 的应用服务器设计

  • 针对存储在高速设备的中小键值进行优化——支持存储在 flash 或者直接存储在内存

  • 性能随 CPU 数量线性提升,对多核系统友好


RocksDB 支持 snappy、zlib、bzip2 lz4 和 lz4_hc 压缩算法。对不同层的数据可以配置不同的压缩算法。一般来说,90%的数据保存在 Lmax 层。一个典型的安装可能是 L0-L2 层不配置压缩算法,中间层用 snappy 压缩算法,而 Lmax 层采用 zlib 压缩。使用 RocksDB 后,I/O 性能显著提升,原来需要 3 个小时以上才能计算完成的任务,现在缩短到 1.5 小时即可计算完毕。


但这个时间仍然太长,让人无法忍受,于是我们想到对系统数据进行抽样,以加快运算速度。


随机抽样算法


随机抽样是最为常用的算法之一,它最大的特点是能够通过抽取、计算较小的数据样本量,来尽可能客观的推断数据总体特征。


我们需要进行随机抽样且保持有序,当总设备量为 n,需要随机挑选出 m 个设备,其中 m < n。输出是[0 , n-1] 范围内 m 个随机整数的有序列表,不允许重复。从概率的角度说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。简单来说就是从 n 个数中, 随机抽取 m 个数据,并保持有序。


轮流判断 n 个数组成的列表中每个数的概率(m/n),每次判断后 n=n-1,若当前被判断的数被选择,则 m=m-1,否则 m 不变。



实现方式:


public static Set<Long> random(long n,int m){    Set<Long> set = new TreeSet<Long>();    long remaining = n-1;    for (long i = 0; i<n ;i++){        if (Math.random() * remaining < m){            set.add(i);            m -= 1;        }        remaining -= 1;    }    return set;}

复制代码


我们使用次方法从总设备量中随机抽取受众人群分析样本数据并加工成 Bitmap。我们假设另此 Bitmap 为 A,男性全量数据 M,则计算 X 人群中的男性占比 P 的公式为:



采用随机抽样方式获得的占比结果还是会有一定偏差。经对比 50 组随机构建的受众人群包,对性别占比进行分析,相对误差率均未超过 8%,在可接受范围之内。



经过随机抽样计算之后,Bitmap 数据占用 RocksDB 存储显著减小,Bitmap 计算效率显著提高,数十亿数据量的受众分析任务可在 30 分钟内计算完成。


基于以上这些优化,智能营销云可以快速完成对广告受众的分析,让广告主在整个广告投放过程中及时了解自己的目标受众特点以及分布情况,从而指导广告主及时对广告投放受众群体进行调整。


2019 年 6 月 27 日 10:578196

评论 1 条评论

发布
用户头像
…………………………
2019 年 06 月 27 日 11:36
回复
没有更多了
发现更多内容

Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

zhisheng

大数据 flink 流计算

招联金融助力经济复苏 致力成为“智慧生活的消费金融专家”

极客编

那个业务大拿死在了这个地方

小眼睛聊技术

Java 学习 高效工作 程序员 个人成长

DDD 实践手册(番外篇: 事件风暴-实践)

Joshua

领域驱动设计 DDD 事件风暴 事件驱动 Event Storming

《从0到1学习Flink》—— Flink JobManager 高可用性配置

zhisheng

大数据 flink 流计算

Flink 从0到1学习—— Flink 不可以连续 Split(分流)?

zhisheng

大数据 flink 流计算

游戏夜读 | 数据整理的难题?

game1night

Jenkins 插件开发之旅:两天内从 idea 到发布(上篇)

donghui

DevOps jenkins jenkins-plugin

k8s上运行我们的springboot服务之——k8s 1.16.0安装

柠檬

k8s

【迁移】撸论文系列之——Bigtable

罗琦

论文阅读 bigtable

Deno会在短期内取代Node吗?

Geek_Willie

node.js SpreadJS deno

2020年4月云主机性能评测报告

博睿数据

云计算 百度云 ucloud 性能测试 公有云

Jenkins 插件开发之旅:两天内从 idea 到发布(下篇)

donghui

DevOps jenkins jenkins-plugin

《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了?

zhisheng

大数据 flink 流计算

Neo4j执行计划

脚动两轮男之漂流小王子

Flink 从0到1学习 —— 如何使用 Side Output 来分流?

zhisheng

大数据 flink 流计算

1分钱秒杀!疫情季,如何为孩子的升学保驾护航?

极客编

北大学子手写实现《统计学习方法》书中全部算法!

GitHubDaily

人工智能 GitHub 学习 程序员

《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ

zhisheng

大数据 flink 流计算

如何参与开源项目

郭旭东

GitHub 开源

职场“潜”规则(二)

俊毅

职场 感悟 个人提升 人才

露营之美,在乎山水之间也

李冬梅

k8s上运行我们的springboot服务之——上传服务到docker私服

柠檬

Docker springboot

JVM源码分析之堆内存的初始化

猿灯塔

如果你想做汽车开发,请先看看这篇。

水滴

自动驾驶 软件开发 开发

重学 Java 设计模式:实战工厂方法模式

小傅哥

设计模式 小傅哥 重构 架构设计 工厂模式

聊一聊采访外籍人员时需要注意的几点事项

李冬梅

态度 体验 感悟

你不知道的JSON.stringify(上)

前端黑板报

Java json

一文搞懂RSA算法

somenzz

k8s上运行我们的springboot服务之——在linux安装docker并搭建docker私服

柠檬

Docker k8s

边缘计算隔离技术的挑战与实践

边缘计算隔离技术的挑战与实践

如何在30分钟内完成数十亿条数据的分析?-InfoQ