论文阅读笔记:Augmented Sketch: Faster and More Accurate Stream Processing
文章目录
这篇文章是苏黎世联邦理工学院和新加坡南洋理工大学3位学者在2016年SIGMOD发表的一篇论文,针对频繁项估计不准确问题,提出在在传统sketch前面添加一个过滤器,达到效果:将hot items保留在过滤器中,cold items被保留在传统sketch中,过滤器和传统sketch之间也进行频繁的数据交换。这篇文章同时也是杨仝老师课题组Cold filter论文的基础,两者处理过程刚好相反。
Abstract
近似算法(Approximated algorithm) 通常用于估计大容量(high volume)、快速数据流上项目的频率。存在问题:最常用的是Count-Min sketch变种,使用次线性空间进行计数,但可能在最频繁的项目计数中产生错误,并可能对低频项目进行错误分类。我们方案:我们通过提高最频繁项目的频率估计精度和减少低频项目可能的误分类来提高基于sketch的算法的准确性,同时也提高了总体吞吐量。
解决方案:Augmented Sketch(ASketch)是基于一个预过滤层(pre-filter stage),动态识别和聚合最频繁的项目。溢出预过滤层的项目使用传统的sketch算法进行处理,从而使解决方案具有通用性并适用于广泛的场景。预过滤层可以在多核机器上使用SIMD指令有效地实现,并且可以通过管道并行(pipeline parallelism) 进一步并行化,其中预过滤层在一个核中运行,sketch算法在另一个核中运行。
1. Introduction
在实时IP流量、电话呼叫、传感器测量、网页点击和抓取等场景中,大量数据以高速率流(high-rate stream)的形式生成。处理这样的流通常需要通过单遍(in a single pass) 创建的简洁概要结构(succinct synopses) 来近似。这些概要总结了流,以提供项目频率的估计,使用少量的空间,同时允许足够快地处理流。由于概要的大小与原始流大小相比较小,在空间(space)、准确性(accuracy)、效率(efficiency)之间存在一个妥协:减少空间增加效率但是会影响准确性。
研究问题:数据流的频率估计问题:给定一个数据项作为查询,我们估计该数据项在输入流中的频率计数。sketch数据结构通常用于解决此类问题。sketch优点:通过使用多个散列函数,sketch可以在有限的空间内总结(summarize)大量数据流。sketch缺点:由于是总结(summarization),该方法可能给出不准确的结果。第一,对于最频繁的项目,它可能给出一个不准确的计数。第二,它可能错误地将低频项目(low-frequency items)分类并将其报告为高频项目(high-frequency items)。
由于高频项通常在许多应用中更相关,包括负载平衡(load-balancing)和heavy-hitter查询,因此尽可能准确地估计最频繁项的频率非常重要。频率估计精度较低会影响后续的数据分析。以NLP为例:在情感分析等自然语言处理(NLP)应用中,sketch的一个典型应用是计算逐点互信息(PMI),然后找到前k个正面(positive)和负面(negative)单词。如果没有准确的排序,单词很容易被错误分类,导致错误的解释。尽管这个错误看起来很小,但它可能会在应用程序检查阈值(checking thresholds)、执行簿记(doing bookkeeping)和建立刚才讨论的排名(establishing ranking)时造成问题。
另外,由于许多sketch的单边误差保证(one-sided error guarantee) (即一个项目的估计频率至少与它的真实频率一样高),在sketch概要(sketch synopsis)中,一个低频项目可能会被误认为是高频项目。当我们构建一个具有Zipf频率分布合成流的16KB Count-Min摘要时,我们发现27个低频项目被错误地分类为高频项目,这些错误分类项目的平均相对误差为 1 0 5 10^5 105。这种错误分类可能对各种机器学习应用程序有害。举例:由于频繁项挖掘(frequency items mining)是频繁项集挖掘(frequency itemsets mining)的第一步,即使少量的错误分类项也会导致大量的假阳性项集(false-positive itemsets),这使得从汇总流中有效挖掘频繁项集变得困难。在基于sketch的聚类和分类中也会出现类似的情况,通常用于可疑事件检测(suspicious events detection),其中预测准确性的轻微改进可能会导致巨大的改进。
ASketch结构:Augmented Sketch是一个流处理框架,适用于许多基于sketch的概要(synopses),并与自适应预过滤(adaptive pre-filtering)和早期聚合策略(early-aggregation strategy)相结合。它利用底层流数据的倾斜(skew),通过更早地过滤掉最频繁的项目来提高频率估计的准确性。它还提高了整体吞吐量,同时使用与传统sketch完全相同的空间量。主要思想:流中的所有项目都要经过一个过滤阶段(filtering stage)。过滤器保留高频项,sketch处理分布的尾部。吞吐量的提高来自于过滤器的倾斜分布(skewed distribution)和极快的查找时间(例如,使用向量指令)。利用过滤器阶段捕获高频项也提高了频繁项频率估计的准确性。同时,从sketch中分离高频项目减少了错误分类。
我们的贡献:
- 我们探索了过滤器的使用,以便更早地捕获heavy hitters,并从随后的sketch数据结构中删除它们。最终的设计ASketch展示了如何有效率地实现这样的过滤器,以至于不仅准确而且提高了整体吞吐量。
- 由于在sketch数据结构前引入过滤器会改变后者的属性,因此我们对ASketch进行了广泛的分析,以及不同的设计参数如何影响准确性和性能。
- 现代硬件为提高过滤阶段的效率提供了几种可能性。在本文中,我们探索了使用单独的内核,使用SIMD指令和SPMD(单程序,多数据)并行模型的可能并行实现
- 性能分析显示了ASketch的优势,也揭示了现有解决方案之间的差异,以及过滤器如何与不同形式的sketch交互。我们比较了ASketch和 Count-Min、Holistic UDAFs、Frequency-Aware Counting、Space-Saving这些结构。
2. 相关工作
摘要构建(synopsis construction)问题已经在各种技术的背景下得到了广泛的研究,例如:采样(samping)、小波(wavelets)、直方图(histograms)、sketches、基于计数器的方法,即:Space-Saving和Frequent。sketches和基于计数器方法被广泛应用于流数据总结(stream data summarization)。区别:sketch通常用于频率估计。基于counter的数据结构是为查找前k个频繁项而设计的。sketch保留所有项目的近似计数,基于counter的方法只保留频繁项目的近似计数。sketch可以通过额外的堆(heap)或分层数据结构(hierarchical data structure)来支持top-k查询。然而,基于计数器的方法在top-k估计方面比sketch实现了更快的更新吞吐量,因为它们不计算所有项目的频率。
提出了几种系统来提高草图的流处理吞吐量,即:Holistic UDAFs。或者提高他们的查询处理精度,即:Frequency-Aware Counting和gSketch。ASketch通过对高频项进行预过滤和早期聚合(pre-filtering and early-aggregation) ,提高了准确性和吞吐量。像Holistic UDAFs和Frequency-Aware Counting这样的方法使用额外的数据结构,增加了总体存储需求,这对于小空间sketch数据结构来说通常是非常重要的。Skimmed Sketch观察到,使用sketch进行连接大小估计(join size estimation) 的大部分错误是由于高频项与低频项的碰撞而出现的,因此,提出了利用堆在后处理中撇去高频项的方法。
预过滤(pre-filtering)和早期聚合策略(early-aggregation strategy) 已被有效地应用于许多应用中,如重复消除(duplicate delmination)、外部归并排序(external merge sort)、Space-Saving的概要构建等。字符串匹配技术(String matching techniques) 用于改进XML预过滤,从而减少内存消耗和处理时间。预过滤已被有效地用于在复杂事件检测应用中从正在监控的事件中剔除无关事件,使用预过滤来消除数据。ASketch使用预过滤策略将sketch数据结构的常见项(common items)与不常见项(less common items)分开。
问题:histograms是什么,文献中经常遇见,是跟top-k类似的也是一个研究的场景吗
问题:join size estimation是做什么的呢
3. 预备知识
一个长度为 n n n的数据流是 n n n个元组的序列。第 t − t h t-th t−th个元组被表示成 ( k t , u t ) (k_t,u_t) (kt,ut),其中 k t k_t kt是一个数据项键(data-item key)用来进行哈希的, u t u_t ut是跟这个数据项关联的频率值。通常 k t k_t kt的值可以从一个大的域里面获得(即IP地址、URL等),这个值 v t v_t vt是一个正数,因此数据项的频率计数单调递增。
Sketch是一组用于汇总数据流的数据结构。sketch与布隆过滤器有相似之处,它们都使用哈希来总结数据(summarize data);区别:在于如何更新哈希桶(hash buckets)并使用这些哈希数据来推导估计。Count-Min在一般情况下实现了最好的更新吞吐量,并且在倾斜分布下具有较高的准确性。ASketch是通用的,能够与其他的sketch相结合。主要讨论的是ASketch和Count-Min sketch的组合。
Count-Min. 在Count-Min中,哈希用于近似维护数据流中大量不同项的频率计数。我们使用 w w w对独立哈希函数,每个哈希函数都均匀映射到范围 [ 0 … h − 1 ] [0 \ldots h-1] [0…h−1]随机整数上。数据结构本身由一个二维数组组成,包含 w ⋅ h w \cdot h w⋅h个单元格(cell),长度为 h h h,宽度为 w w w。每个哈希函数对应于 w w w个具有 h h h个单元格的一维数组中的一个。哈希函数用于更新这个二维数据结构中不同单元格的计数。
为了估计一个项目的计数,我们确定 w w w个哈希函数映射到的 w w w个单元格(cell)集合,计算这些单元格中最小值。让 c t c_t ct是被估计计数的真实值,那么估计值大于等于真实值 c t c_t ct,因为我们只处理非负计数,并且由于哈希单元之间的冲突,可能存在高估,可以确定估计的概率上界。对于一个数据流, N N N是迄今为止接收到的项目的总数,估计的计数最多为 c t + ( e h ) N c_t+(\frac{e}{h})N ct+(he)N,概率至少为 1 − e − w 1-e^{-w} 1−e−w。这里, e e e是自然对数的底数。
4. 过滤和聚合频繁项的动机(Motivation for filtering and aggregating frequent items)
Count-Min 性能. 假设Count-min sketch由 w w w对独立哈希函数,均匀映射范围到 [ 0 … h − 1 ] [0 \ldots h-1] [0…h−1]随机整数中,插入一个项目到Count-min所需时间 t s = O ( w ) t_s=O(w) ts=O(w)。频率估计期望误差至多是 ( e h N ) (\frac{e}{h}N) (heN),概率不超过 e − w e^{-w} e−w。
ASketch如何为一个过滤器提供空间. ASketch用一个过滤器增强了传统的Count-MIn sketch。假设过滤器消耗 s f s_f sf空间,插入一个项目到过滤器时间是 t f t_f tf。通常, s f s_f sf是非常小的,由于过滤器的硬件实现, t f < < t s t_f << t_s tf<<ts。为了给ASketch中过滤器提供空间,那潜在sketch数据结构的空间就要缩减了,以致于ASketch的总空间和单独使用Count-Min的空间保持一致。从潜在sketch数据结构中缩减空间有两种实现方式:减少哈希函数的数量或者减少每个哈希函数哈希到的整数范围或者两者都减少。
过滤器对ASketch吞吐量的影响. ASketch更新时间可以被表示成 t f + f i l t e r s e l e c t i v i t y ∗ t s t_f+filter_{selectivity}*t_s tf+filterselectivity∗ts,其中 t f t_f tf是过滤器更新时间, t s t_s ts是sketch更新时间, f i l t e r s e l e c t i v i t y filter_{selectivity} filterselectivity是溢出过滤器的数据项数与所有数据项总数之比。
假设在 N N N个聚合流计数中,过滤器处理 N 1 N_1 N1个计数,sketcht处理 N − N 1 = N 2 N-N_1=N_2 N−N1=N2个计数。因此, f i l t e r s e l e c t i v i t y = N 2 N filter_{selectivity}=\frac{N_2}{N} filterselectivity=NN2。然而,大多数真实世界流呈现倾斜(skew),对于Zipf分布,我们可以通过将top-k项的频率计数相加来方便地以封闭形式测量 f i l t e r s e l e c t i v i t y filter_{selectivity} filterselectivity。
过滤器对ASketch准确性影响. ASketch提高了存储在过滤器中的频繁项的频率估计精度。事实上,如果可以在过滤器中存储项目的精确频率计数,那么它们的频率估计误差将为零。对于存储在sketch中项目,我们减少它们和高频项(high-frequency items)的冲突,因为存储在过滤器的项目不再哈希到sketch中。这减少了低频项作为高频项出现的可能性,从而减少了误分类错误。然而,为了为过滤器提供空间,我们现在使用一个比原始Count-Min尺寸更小的sketch结构。这增加了存储在sketch中的低频项的频率估计误差,通常在可容忍的范围内。
Summary. 对于固定的ASketch大小,我们总结了过滤器大小,吞吐量和频率估计精度之间的权衡。
- 通过更大的过滤器,可以在过滤器中存储更多的高频项目;反过来,将导致为更多的高频项目有更好的频率估计精度。然而,如果我们考虑预期频率估计误差,它由数据流中高频和低频项引起的误差组成。由于高频项被查询的次数多于低频项,我们发现期望误差最初随着过滤器尺寸的增大而减小;但超过阈值过滤器大小后,它停止减少。这是因为随着过滤器尺寸的增加,虽然我们对更多高频项目有更好的准确性,但由于底层sketch尺寸的减小,我们也引入了低频项目更多的误差。
- 增加过滤器尺寸会增加过滤器处理时间 t f t_f tf,而在 f i l t e r s e l e c t i v i t y filter_{selectivity} filterselectivity上没有太多增益。因此,超过阈值过滤器大小后,吞吐量开始下降。
5. ASketch算法
ASketch在过滤器和潜在sketch之间交换数据项,因此过滤器(filter)存储观察到的输入流中最频繁的项。由于几个原因,数据项的这种移动是一个具有挑战性的问题。首先,需要确保交换过程不会在正常流处理速率上产生过多的开销。其次,很难从潜在sketch(underlying sketch)中移动项目及其频率计数。这是因为Count-Min只提供了一个项目真实频率的高估;如果我们从sketch中移动了一个项目的高估频率计数,可能会违反这个sketch提供的片面精度保证(one-side accuracy guarantee)。
示例1:假设数据项 A A A当前存储在count-min中,与某个哈希函数 H i H_i Hi对应的哈希单元为 A A A提供了最小的频率估计。从sketch中移除 A A A及其估计频率,将导致 H i ( A ) H_i(A) Hi(A)对应的哈希单元中的计数值为0。现在,考虑当前也存储在Count-Min中的所有项目 B B B,这样 H i ( B ) = H i ( A ) H_i(B)=H_i(A) Hi(B)=Hi(A)。从sketch中去掉 A A A后,所有这些 B B B的估计频率将变为0,这是对它们真实频率的低估。
在ASketch中,我们希望保持Count-Min的片面精度保证(one-sided accuracy guarantee) ,即ASketch报告的项目的估计频率必须始终是其真实频率的高估。我们通过在过滤器中引入两种不同的计数来实现这种准确性保证,如下所述。
算法描述:ASketch由两个数据结构组成:filter(F)和sketch(Count-Min sketch简称CMS)。过滤器存储一些高频项目和两个关联的计数,即它所监视的每个项目的new_count和old_count。new_count表示当前存储在过滤器中的项目的估计(过高估计)频率。new_count和old_count之间的差值表示特定项目驻留在过滤器中期间累积的(确切的)聚合频率(aggregated frequency)。sketch是作为经典的Count-Min实现的,它是一个二维数组,长度(即每个哈希函数的范围)h和宽度(哈希函数的数量)w。
流处理算法(stream processing algorithm) 如下:一条流中每个传入元组表示为 ( k , u ) (k,u) (k,u),其中 k k k是数据项的键, u u u是频率值。我们首先在过滤器中查找键 k k k,如果 k k k 不存在于过滤器中,并且过滤器中有一个空单元格,则将 k k k插入过滤器中,其old_count设置为 0 0 0,new_count设置为 u u u。下一次,每当我们在过滤器中找到键时,我们只更新它的new_count值,而不更改old_count值。如果在过滤器中没有找到 k k k,并且过滤器已满,则将数据项发送到sketch。我们使用传统的sketch更新协议将项目插入sketch中,即通过 w w w个不同的哈希函数将 k k k散列到 w w w个不同的行中,其中每个哈希函数将 k k k映射到 h h h个哈希值的范围内(也就是Count-Min插入过程)。
问题:这个old_count 是什么?记录什么有什么用?文章未提到
如果从未插入到sketch中仅在过滤器中,则old_count=0;如果从sketch中交换到过滤器中,则old_count是sketch中估计的频率。
问题:如果过滤器满了,他就直接把项目插到sketch了,为什么不能是跟过滤器中最小值进行比较,将最小值剔除然后插入,这样后面也不用在过滤器和sketch交换了?
按它这种方法,如果过滤器满了就将项目插入到sketch中,那要插到什么时候,直到sketch也满了吗?然后再在过滤器和sketch之间交换较大的数据项吗?
每当我们在sketch中插入一个项目时,我们都会得到其真实频率的估计(过高估计)。现在,我们额外跟踪当前存储在过滤器中的任何项的最小频率值(即new_count)。因此,如果插入到Count-Min中的最后一项的估计频率高于过滤器中最小项频率值,我们发起一个交换。散列到sketch中的最后一项现在被移动到过滤器中,并将其old_count和new_count设置为从sketch中获得的估计计数。但是,我们没有对sketch内的值做任何改变。为了在过滤器中容纳这个项目,现在将过滤器中频率最小的项目插入到sketch中;但是我们只将它的(new_count-old_count)频率散列到sketch中。**这是因为它的old_count频率可以是0,这表明该项目从未被放入sketch中;**否则,它的old_count频率已经包含在sketch中,因为项目最后一次从sketch中移动。
关键启发(key insight):我们可以通过使用(new_count-old_count)值准确地捕获当前存储在过滤器中的项目的命中次数(the hits for an item)。这有三个好处:(1) 通过在过滤器中累积这个计数,我们节省了在sketch中应用多个哈希函数的成本,从而提高了吞吐量。(2) 由于偏斜数据流中的高频项大部分时间都留在过滤器中,我们得到了这些项目更准确的频率计数。(3) 低频项目作为高频项目的误分类率也降低了,因为高频项目的(new_count-old_count)值的总和没有散列到底层sketch中。
查询处理算法:对于项目k出现频率的查询请求,算法首先在过滤器中执行查找,如果找到该项,则返回new_count;否则,将返回来自底层sketch的估计频率。
交换策略(Exchange policy) :首先,我们需要跟踪过滤器中最小的频率计数。这一步的效率取决于底层数据结构和过滤器的硬件实现。第二,我们从经验上发现,我们需要相对较少的交换与整体流大小进行比较,以确保高频项被存储并提前聚合在过滤器中。第三,也许更重要的是,我们的交换策略能触发过滤器和sketch之间的多次交换。例如,当过滤器中频率最低的项移动到Count-Min时,其估计的频率(由于基于哈希的冲突,现在将是高估)可能高于过滤器中频率第二低的项。这将启动另一个交换。每当我们在Count-Min中散列一个项目时,因为它没有在过滤器中找到(或者因为过滤器已满),我们总是限制自己在过滤器和sketch之间最多进行一次交换。第四,如果过滤器中最小频率项目的new_count和old_count差值是零,我们不在sketch中进行任何更新。
示例2:图4展示了一个数据元组 ( C , 1 ) (C,1) (C,1)被插入至ASketch中。因为过滤器满了,并且没有包含数据项 C C C,sketch就会被更新。由于此次更新,我们用阴影处理了受影响的单元格。然而,项目 C C C的估计频率是9,比过滤器中的最小频率(即项目A大小8) 更大。因此我们将 C C C移到过滤器中,并将其old_count和new_count赋值给其估计频率9。我们不会因为 C C C的移动而改变sketch单元格中的任何东西。最后,我们将A插入到sketch中;但是,只将其(new_count-old_count) 的差值为6 ,插入到Count-Min Sketch中。虽然,A的当前估计频率为10,大于当前过滤器中最小的计数,但我们没有发起任何其他交换。
6. 多核上的ASketch(ASketch on Multi-core)
讨论ASketch在现代多核硬件中的实现,重点是**(1)** 过滤器实现中的SIMD并行性(SIMD parallelism),(2) ASketch框架中的流水线并行性(pipeline parallelism),以及**(3)** 通过在多核机器中实现ASketch作为计数内核来实现SPMD并行性(SPMD parallelism)。
问题:这几个并行性都不清楚不知道是啥?
6.1 Filter with SIMD Parallelism
我们的目标是设计一个小尺寸的过滤器。它必须有效地支持以下两种操作:(1)根据数据项的键进行查找;(2)找到new_count值最小的项。
Space Saving算法也需要有效支持上述两种操作。作者使用了一个Stream-Summary数据结构和一个哈希表。哈希表用于查找操作,而stream-summary(一个根据计数值对所有项进行排序的链表)有助于第二个操作。因此,我们将其作为第一个设计方案。然而,这种实现有很高的空间开销,因为每个项可能需要多达四个指针。由于内存开销很大,对于相同的过滤器大小预算,它可以监视较少的项目,因此性能很差
在现代硬件上,通常对于小型数据结构,线性扫描(linear scan) 比基于哈希的查找(a hash-based lookup)性能更好,因为它避免了随机访问(random access)和指针跟踪(pointer chasing)。线性扫描也适用于矢量化执行(vectorized execution)。因此,我们考虑了两种基于数组的实现,即Vector和Heap。对于这两种实现,我们都使用三个值为(id, new_count, old_count)的数组。算法3显示了对id进行矢量化搜索以查找项目的位置。这是一个使用SIMD指令的线性扫描的实现。__builtin_ctz是gcc提供的在汇编中实现的特定于硬件的高性能函数。这个特定的函数返回一个数字的二进制表示中尾随零的计数,该数字用于查找命中(hit)的位置。Vector也使用线性扫描来查找具有最小计数的元素。我们发现,在zipf分布中,当偏度大于2时,向量(Vector)的性能非常有效。
参考文献:C++ vector 容器浅析 | 菜鸟教程 (runoob.com)
堆(Heap)在维护堆时会产生额外的开销。但是,这样做的好处是查找计数最小的项变得便宜了。我们评估了两种最小堆实现,即Strict和Relaxed(Relaxed Heap是松弛堆)。
参考文献:堆的进化之旅5-Relaxed Heap松弛堆_relaxed-heap-CSDN博客
6.2 Pipeline Parallelism: Filter and Sketch
当过滤器和sketch解耦并在单独的内核上运行时,过滤的好处更加明显。在这样的实现中,共享内存访问被两个处理器之间的消息传递接口所取代。如图1所示,两个数据结构之间的数据项交换现在通过消息进行。这样的设计已经被证明非常适合现代硬件,因为它避免了共享内存访问上下文中的锁定。
参考文献:图解大模型训练之:流水线并行(Pipeline Parallelism),以Gpipe为例 - 知乎 (zhihu.com)
6.3 SPMD Parallelism: ASketch as a Kernel
ASketch可以在SPMD模型中并行化,其中每个处理器将作为顺序计数内核执行ASketch。Thomas等人在单元处理器(cell processor)的背景下也考虑了类似的并行形式。我们想要演示ASketch的可伸缩性,并将其吞吐量与Count-Min作为内核使用时的吞吐量进行比较。
参考文献:computer architecture - Understanding the definition of SPMD - Computer Science Stack Exchange
SPMD (single program, multiple data) is a technique employed to achieve parallelism; it is a subcategory of MIMD. Tasks are split up and run simultaneously on multiple processors with different input in order to obtain results faster.
7. 实验结果
7.1 评价指标
- 流处理吞吐量(Stream processing throughput): 流处理吞吐量(以每毫秒项表示)衡量每毫秒处理的传入数据元组的平均数量。
- 查询处理吞吐量(Query processing throughput):查询处理吞吐量(以每毫秒的查询数表示)统计每毫秒可以回答的频率估计查询的平均数量。
- 我们用以下两个度量来评估频率估计查询的准确性:Observed error和Relative error。
- 观测误差(Observed error)测量为估计频率与真实频率之间的差值,累加所有查询项。我们将其表示为查询的所有数据项的聚合真实频率上的比率。
O b s e r v e d E r r o r = ∑ i ∈ Q u e r y ∣ e s t i m a t e d f r e q . i − t r u e f r e q . i ∣ ∑ i ∈ Q u e r y t r u e f r e q . i Observed Error=\frac{\displaystyle \sum_{i \in Query}|estimated \, freq._i-true \, freq._i|}{\displaystyle \sum_{i \in Query}true \, freq._i} ObservedError=i∈Query∑truefreq.ii∈Query∑∣estimatedfreq.i−truefreq.i∣
- 相对误差(Relative error): 一个频率估计查询的相对误差定义为估计频率与真实频率之间的差,除以该数据项的真实频率。在我们的结果中,我们报告了在所查询的预先指定的数据项数量上的平均相对误差。
A v g . R e l . E r r o r = 1 ∣ Q u e r y ∣ ∑ i ∈ Q u e r y ∣ e s t i m a t e d f r e q . i − t r u e f r e q . i ∣ t r u e f r e q . i Avg.Rel.Error=\frac{1}{|Query|} \displaystyle \sum_{i \in Query} \frac{|estimated \, freq._i-true \, freq._i|}{true \, freq._i} Avg.Rel.Error=∣Query∣1i∈Query∑truefreq.i∣estimatedfreq.i−truefreq.i∣
- 我们通过使用Precision-at-k来分析top-k频繁项查询的有效性:
P r e c i s i o n − a t − k = t r u e t o p − k f r e q u e n t i t e m s i n t h e t o p − k r e p o r t e d i t e m s k Precision-at-k=\frac{true \; top-k \; frequent \; items \; in \; the \; top-k \; reported \; items}{k} Precision−at−k=ktruetop−kfrequentitemsinthetop−kreporteditems
7.2 对比方法
我们将ASketch的准确性和效率与三种最先进的流处理方法进行了比较,并为所有这些方法分配了相同的总空间。
- Count-Min(CMS):Count-Min对传入元组(k, u)的键k应用w对独立哈希函数。在大多数实验中,我们固定w = 8,并根据概要的总大小改变h。
- Frequency-Aware Counting(FCM): 通过仅使用w个哈希函数的一个子集对每个数据项进行哈希,提高了Count-Min的准确性。给定一个数据项,该算法首先应用两个单独的散列函数来计算偏移量(offset)和间隙(gap),这决定了用于散列数据项的Count-Min散列函数的子集。此外,FCM改变了用于高频和低频项的哈希函数的数量。最后,它还使用MG counter数据结构来识别高频项目。
- Holistic UDAFs(H-UDAF):在将项目刷新到sketch之前,在低级表(low-level table)中执行运行长度聚合(run-length aggregation)。我们使用一个低级表,它能够存储与过滤器中相同数量的数据项,而底层sketch实现为Count-Min sketch。对于低级表中的查找,我们使用与过滤器查找相同的代码
8. 总结
在本文中,我们提出了ASketch -一种实现sketch的过滤技术。它通过提高最常见项目的频率估计精度和减少低频项目可能的错误分类来提高sketch的准确性。它还提高了总体吞吐量。ASketch在使用完全相同的空间的情况下,以更高的吞吐量和大约25倍的精度优于现有的流处理算法。我们进一步在ASketch中加入了并行性(parallelism),以支持更高的流速率,例如,流水线并行性(pipeline parallelism)在实际倾斜范围内(real-world skew range)将ASketch吞吐量提高了近两倍。在SPMD并行性(SPMD parallelism)的情况下,ASketch还展示了线性可伸缩性(linear scalability)。在未来的工作中,在目前使用sketch的各种机器学习和数据挖掘应用中使用ASketch将是一件有趣的事情。
9. 可继续学习的参考文献
- N. Alon, Y. Matias, and M. Szegedy. The Space Complexity of Approximating the Frequency Moments. In STOC, 1996.(经常看到被引用)
- B. H. Bloom. Space/time Trade-offs in Hash Coding with Allowable Errors. Comm. of ACM, 13:422–426, 1970.(标准Bloom filter)
- G. Cormode, M. Garofalakis, P. J. Haas, and C. Jermaine. Synopses for massive data: Samples, histograms, wavelets, sketches. Foundations and Trends in Databases, 4(1–3):1–294, 2012.(这是一本书)
- G. Cormode and M. Hadjieleftheriou. Finding Frequent Items in Data Streams. In VLDB, 2008.(Frequent)
- G. Cormode, T. Johnson, F. Korn, S. Muthukrishnan, O. Spatscheck, and D. Srivastava. Holistic UDAFs at Streaming Speeds. In SIGMOD, 2004.(Holistic UDAFs)
- S. Ganguly, M. Garofalakis, and R. Rastogi. Processing data-stream join aggregates using skimmed sketches. In Advances in Database Technology-EDBT 2004, pages 569–586. Springer, 2004.(Skimmed sketches)
- A. Goyal, H. D. III, and G. Cormode. Sketch Algorithms for Estimating Point Queries in NLP. In EMNLP-CoNLL, 2012.(与NLP相联系)
- B. Krishnamurthy, S. Sen, Y. Zhang, and Y. Chen. Sketch-based Change Detection: Methods, Evaluation, and Applications. In IMC, 2003.(k-ary sketch)
- Y. Lu, A. Montanari, B. Prabhakar, S. Dharmapurikar, and A. Kabbani. Counter braids: a novel counter architecture for per-flow measurement. In SIGMETRICS, 2008.(Counter braids)
- A. Metwally, D. Agrawal, and A. E. Abbadi. Efficient Computation of Frequent and Top-k Elements in Data Streams. In ICDT, 2005.(Space-Saving)
- N. Manerikar and T. Palpanas. Frequent Items in Streaming Data: An Experimental Evaluation of the State-of-the-art. Data Knowl. Eng., 68(4):415–430, 2009.(是对以前方法的一个总结)
- S. Muthukrishnan. Data streams: Algorithms and applications. Now Publishers Inc, 2005.(一本介绍数据流的书)
- O. Rottenstreich, Y. Kanizo, and I. Keslassy. The Variable-Increment Counting Bloom Filter. IEEE/ACM Trans. Netw., 22(4):1092–1105, 2014.(Counting bloom filter的变种)
- D. Thomas, R. Bordawekar, C. Aggarwal, and P. S. Yu. On Efficient Query Processing of Stream Counts on the Cell Processor. In ICDE, 2009.(FCM Sketch或者Frequency-Aware count)
filter的变种**) - D. Thomas, R. Bordawekar, C. Aggarwal, and P. S. Yu. On Efficient Query Processing of Stream Counts on the Cell Processor. In ICDE, 2009.(FCM Sketch或者Frequency-Aware count)
- P. Zhao, C. C. Aggarwal, and M. Wang. gSketch: On Query Estimation in Graph Streams. In VLDB, 2012.(gSketch)