大数据热点问题TOP K
1单节点上的topK
(1)批量数据
数据结构:HashMap, PriorityQueue
步骤:(1)数据预处理:遍历整个数据集,hash表记录词频
(2)构建最小堆:最小堆只存k个数据.
时间复杂度:O(n +n*lgk) = O(nlgk)
空间复杂度:O(|n|+k) (|n| = number of unique words)
lintcode原题:Top K Frequent Words
(2)流式数据
数据结构:TreeMap, HashMap
步骤:有新数据到来时,HashMap进行更新,在TreeMap中查找所更新的条目,如果存在,把旧的条目删除,加入更新后的条目;如果不存在,将该条目与TreeMap中最小的比较,小于该最小值就pass,大于该值则TreeMap删除最小值,插入新的条目。
lintcode原题:Top K Frequent Words II
2 多节点上的topK
场景一: 假设给一组10T文件,文件内容是10million用户,当天的微博搜索记录,求微博今日热搜?
思路:先分再合。
a.切分成小文件
b.小文件分发到不同的节点
c. 每个节点计算自己的topK
d.合并每个topK,计算总的TopK

切分方式:如果按照文件顺序切分,可能会导致一个词频很高的词被均匀分配到各个节点,导致它在各个节点的topK中无法胜出。正确的切分方式是用hash,相同的单词 hash值相同,同一个的hash值只由一个节点处理。这样就保证了相同的单词一定会发送到同一个节点,不会出现上面的问题。
可能出现的问题:一个词的词频过大,都发往一个节点导致该节点负荷过重。解决思路是:建立监测机制,当发现一个节点负荷很重,其他节点负荷很轻时,对该节点上的词 加一个后缀,然后进行二次hash,发往其他节点进行topK,完成后再把TopK的结果返回到当前的slave。
场景二: 有N台机器, 每台机器各自存储单词文件,求所有单词出现频率的topK。
思路:使用rehash,将相同的单词发送到同一个节点,再来计算每个节点的topK,最后再合。有点跟shuffle类似。
3 Realtime TopK with Low QPS
当新数据进来时,写入到disk还是hashMap?
(答:都不是。写入disk速度太慢,写入hashMap会导致内存不够,以及宕机时会导致数据丢失。应该写入database。)
之后每次database更新就触发treeMap进行更新。
4 Realtime TopK with High QPS
QPS高的时候,database的效率很低,会带来高延时。解决方案是将请求分散到各个节点,这样每个节点的QPS就会降低。如下图:

问题是,当一个词很热门时,仍然会出现一个节点上的QPS很高,带来高时延,如下图:

用户向master请求topK,master向slave1请求topK1,但是此时有新数据到达slave1,使得dataBase更新,进而会更新TreeMap,更新TreeMap时会锁住TreeMap,使得获取topK1的请求一直要waiting。
解决方案:(牺牲一定的精确性得到低延时)使用缓存。新数据每次存到缓存中,缓存隔一段时间会往database里面写,database更新的时候再来锁treeMap。这样treeMap被锁的频率就大大降低了。

5 Approx TopK Algorithm(近似TopK算法)
由于实际情况中可能总共有一百万个单词,其中只有一百个词是高频词,剩下的都是低频词。把这些低频词存储在hash表中很浪费空间,因此有一种近似topK方法来解决这个问题。
该算法中,我们可以手动指定hash表的大小,且hash表中的key是不再是单词,而是单词的hash值,value仍然是词频(只不过表示所有hash值为key的词的词频)。当新词到来时,更新hash表,并且认为这个词的词频就是hash表中对应的词频,基于此来更新treeMap。
可以看出,上面的过程中存在两种情况会导致错误:
(1)多个低频词映射到同一个hash值,导致这个hash值的value很大,进而错误的选择低频词作为topK。
分析:这种情况其实出现的概率比较低。通常是多个低频词的词频加起来还没有一个高频词的词频大,还要要求这些低频词hash值相同。因此这种情况可以不考虑。
(2)一个高频词映射到一个hash值,使得它的value很大,这时候又来一个低频词也映射到这个hash值。这种情况下会误认为这个低频词的词频也是那么大,进而会错误地把它选到topK里面。
分析:这种情况实际中很有可能发生。解决办法是使用Bloom Filter,即选用多个hash函数,然后选取这些hash函数中映射的最小词频作为这个新词的词频。如果这个新词真的是高频词,那么这个词频就接近真实值;如果是低频词,则这个最小值很有可能就很小。
大数据热点问题TOP K的更多相关文章
- CSS实现大数据热点波纹图
CSS实现大数据热点波纹图 实现效果: 涉及知识点: 定位 盒子阴影 动画 思想:以3道波纹为例.首先使用一个div盒子作为圆心,然后每道波纹作为一个div.4个盒子均使用定位属性定位到圆心.然后设置 ...
- 优先队列PriorityQueue实现 大小根堆 解决top k 问题
转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...
- 优先队列实现 大小根堆 解决top k 问题
摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...
- 海量数据处理之top K问题
题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...
- Top k问题的讨论(三种方法的java实现及适用范围)
在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围. 合并法 这种方法适用于几个数组有序的情况,来求Top k.时间复杂度为O(k*m).(m:为数组的个数).具体实 ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- 如何解决海量数据的Top K问题
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...
- 大数据,why python
大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...
- top(k,n)—db kernel队解题思路
0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...
随机推荐
- Ruby on rails学习笔记——安装环境
出现问题: C:\Users\len>gem install rails ERROR: While executing gem ... (Gem::RemoteFetcher::FetchErr ...
- (转)Rest介绍
参考文献:Rest简介 REST是一种组织Web服务的架构,其只在架构方面提出了一系列约束. 关于Restful的无状态 所以在stackoverflow中,我们常常会看到有人问:我现在使用了这样一种 ...
- 开源License
http://www.open-open.com/bbs/view/1319816219625 http://my.oschina.net/yangsheng/blog/190917
- ecshop 调用收货地址
html {insert_scripts files='region.js,utils.js'} <script type="text/javascript"> reg ...
- 其他系统与ecshop的会员整合
步骤一:整合两个的会员数据 用软件Navicat 的 "导入向导"功能,导入你的原数据类型(sql,mdb,db)我的是mdb类型.下一步选择你原有的会员字段“user”.再进行下 ...
- ViewController respondsToSelector:]: message sent to deallocated instance
今天突然遇到这个问题,其实昨天下班的时候就已经有这个问题了, 就是先进入一个画页,然后再快速离开这个画页再进入其他画页就出现这个错误 了 找了好久也没有找出问题来,一开始以为是网络任务没有cancel ...
- owin
app.Properties["Hello"] = System.DateTime.Now; app.Run(async context => await context.R ...
- iOS-马上着手开发iOS应用应用程序-第一部分介绍
教程:基础 main 中的 main.m 函数会调用自动释放池 (autorelease pool) 中的 UIApplicationMain 函数. @autoreleasepool { retur ...
- CO-类的本质、description方法
类的本质 1. 类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class *Class; 类名就代表着类对象 ...
- Java面试笔记
1.&和&& if(str != null& !str.equals("")){ System.out.println("ok" ...