10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

雅虎开源可以提升流操作速度的 DataSketches

  • 2016-01-24
  • 本文字数:1609 字

    阅读完需:约 5 分钟

就像在 Venture Beat 上所宣布的那样,雅虎开源了 DataSketches ,这是一个用 Java 编写的随机流算法库。DataSketches 允许进行通常来说开销很大的操作,像计算变量不同的值在流中出现的次数,而且消耗的时间少,占用的内存小,误差可预测。

正如他们在技术博客上所作的说明,雅虎内部已经使用DataSketches 来提升多个产品的性能,包括 Flurry 。_ Sketch _ 是 DataSketches 的一个基本概念,这是一个流的“汇总(summary)”,其中每次更新都按同样方式处理,而不考虑历史更新。这个概念是 DataSketches 性能的核心,因为传统的流处理需要保存一个随着时间增长的历史。例如,如果要计算每个唯一值出现的次数,就需要保存每个新出现的唯一值,这样,对于后来的唯一值,检查时间将会增加;因此,每次更新都会以一种不同的、开销更大的方式处理。另一方面,sketch 的构造方式使它只能保存固定数量的、需要保存的信息,也就是说,所有的更新都以完全相同的方式执行。

如果仔细研究下 DataSketches 背后的科学原理,那么我们就会发现,它以整合了 KMV 和自适应采样算法的 Theta-Sketch 框架为基础。感兴趣的读者可以读下这篇论文,它提供了该框架的形式化描述和特性说明,但在这里,我们将提供一种简化的、更为直观的描述。

就让我们将这个问题置于实时计算一个网站的独立访客的场景下。计算一个流中不同的变量值出现的次数,主要的问题是需要为每个已知的、不同的变量值存储一个副本。除此之外,变量的每个新实例(例如,每次新访问网站)都需要对照已知的、不同的变量值所组成的列表进行检查,看看这是一个新访客,还是一个已有的访客。这就是说,假如独立访客的数量为 N,则系统需要的内存为 O(N),每次网站访问需要花费长为 O(log N)的时间来检查是否是一个独立访客。

KMV(第 k 个最小值)算法的策略是以存储更少的值(k 个值)为基础,从中可以估计出 N 的大小,而且误差范围固定。要存储的值使用哈希函数计算得出,该函数将要测量的变量(在这个例子中是指对页面的独立访问)映射成 0 到 1 之间的一个值;实际上,这个哈希函数是什么并不重要,只要结果可以均匀地分布在 0 到 1 之间就可以。每次测量变量的一个新实例,我们就计算它的哈希值,并查看我们是否已经存储了该哈希值,如果没有,就存储它。实际上,主要的不同点是,在任何时刻,只有 k 个最小的值会被保存:如果有一个新值加入到组中,那么第 k+1 个值会被移除,保证内存占用一直为 O(k),时间成本一直为 O(log k)。这样,不同值出现的次数就可以估计为(k-1)/KMV,其中,KMV 为第 k 个最小值,或者是组中存储的、幸存下来的、最大的哈希值。

从检查结果表达式很容易推断出,如果我们比较两个流的数据,一个流中出现不同值的次数多于另一个,那么出现更多不同值的流会产生更多的哈希值,因此,存储的第 k 个哈希值将会比另一个流的第 k 个哈希值小。在 k 相同的情况下,第 k 个哈希值越小,上述表达式计算得出的值越大。由此可以得出结论,该表达式至少是与出现不同值的实际数量成正比的。

多篇研究论文已经证明了,上文从形式上阐述的表达式是一个很好的估计,不过,一个简单的试验就可以提供描述性的证据。假设一个数据流出现199 个不同的值,而且我们在算法中让k=20。如果一个哈希函数将结果均衡分布在0 到1 之间,那出现的199 个不同的值大体上将映射为0.005、0.01、0.015 等等,直到0.995。如果我们只保存20 个最小的值,那么第20 个值将是0.1,将这个值带入上述表达式,结果是(20-1)/0.1=190。

除了性能外,DataSketches 还有其他特性,例如,它能够组合已经分别计算好的sketch,并得到一个综合结果,而不需要要检查底层数据。这使用户可以计算单个组的数据或者数据分区,然后根据需要组合它们。 Maven Central 中提供了 DataSketches 库,以及用于 Hadoop Pig、Hadoop Hive 和 Druid 的适配器。

查看英文原文: Yahoo Open-Sources DataSketches for Faster Operations Over Streams

2016-01-24 18:004658
用户头像

发布了 1008 篇内容, 共 433.2 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

黑客是怎么cookie获取?钓鱼?键盘记录?

喀拉峻

网络安全 XSS

星环科技春季新品发布周,4月19日-23日重磅内容等你来解锁!

星环科技

架构实战营 - 第 6 期 模块三课后作业

乐邦

「架构实战营」

FastDFS入门,Java编程笔试题及答案

爱好编程进阶

Java 面试 后端开发

DPDK技术系统学习一(接收,发送,arp,icmp功能测试)

Linux服务器开发

虚拟化 网络协议栈 Linux服务器开发 DPDK C++后台开发

百度ToB垂类账号权限平台的设计与实践

百度Geek说

架构 后端

关于 MySQL 数据库学习的书籍有哪些值得推荐?

程序员万金游

MySQL 数据库 java 日志 MySQL 数据库 java

90天吃透阿里P8推荐的625页Java编程兵书技术实战,直接入职阿里定级P6

爱好编程进阶

Java 面试 后端开发

「连接」与CRM的「中国式」关系

ToB行业头条

IstioCon 2022,网易数帆六年优化经验即将揭秘

网易数帆

微服务 云原生 istio 服务网格 Service Mesh (ASM)

持续进击,STI上演极致通缩模型

BlockChain先知

《数字经济全景白皮书》金融科技篇 重磅发布!

易观分析

金融科技 互联网金融

为什么你应该了解 Loggie

网易数帆

Go Kubernetes 云原生 日志 Loggie

使用 Serverless Devs 插件快速部署前端应用

阿里巴巴云原生

阿里云服务网格 ASM 正式发布商业化版本

阿里巴巴云原生

新一代态势感知系统发布——北望

H3C-Navigator

网络安全 网络 态势感知关联分析、SOC 态势感知 安全运营

融云猿桌派:听说女生不适合搞 IT,哈?

融云 RongCloud

阿里云强力贡献:如何让 StarRocks 做到极速数据湖分析

StarRocks

数据库 大数据 StarRocks

Docker编排利器DockerCompose,java面试题大汇总

爱好编程进阶

Java 面试 后端开发

Github上都在疯找的阿里内部“全栈技能修炼”终于来了,中级java工程师面试题

爱好编程进阶

Java 面试 后端开发

互联网通信安全之 WebRTC 传输安全机制

融云 RongCloud

Scrum基础框架,快速配置Scrum自动化场景

阿里云云效

云计算 阿里云 Scrum 敏捷开发 研发敏捷

记一次Kafka写入超时问题详细分析

移动云大数据

kafka

eclipse配置SVN和Maven插件,原生Java开发的路该怎么走

爱好编程进阶

Java 面试 后端开发

Excel是世界上最危险的软件?

图灵教育

Python 数据分析 Excel

新华三首发400G园区核心交换机,开启园区超宽时代

H3C-Navigator

网络 交换机 智慧园区 网络交换机

融云 Unity SDK 升级,专注游戏场景,更好社交体验

融云 RongCloud

Linux 信号(Signal)

mazhen

Linux JVM signal Linux Kenel

百度程序员开发避坑指南(Go语言篇)

百度Geek说

后端

一键智能Mock,你值得拥有

Liam

前端 前端开发 Postman swagger web前端开发

2021阿里总监最新整理:初级-中级-高级大厂面试真题(附答案解析

爱好编程进阶

Java 面试 后端开发

雅虎开源可以提升流操作速度的DataSketches_Java_Abraham Marín Pérez_InfoQ精选文章