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的更多相关文章

  1. CSS实现大数据热点波纹图

    CSS实现大数据热点波纹图 实现效果: 涉及知识点: 定位 盒子阴影 动画 思想:以3道波纹为例.首先使用一个div盒子作为圆心,然后每道波纹作为一个div.4个盒子均使用定位属性定位到圆心.然后设置 ...

  2. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

    转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...

  3. 优先队列实现 大小根堆 解决top k 问题

      摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...

  4. 海量数据处理之top K问题

    题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...

  5. Top k问题的讨论(三种方法的java实现及适用范围)

    在很多的笔试和面试中,喜欢考察Top K.下面从自身的经验给出三种实现方式及实用范围. 合并法 这种方法适用于几个数组有序的情况,来求Top k.时间复杂度为O(k*m).(m:为数组的个数).具体实 ...

  6. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  7. 如何解决海量数据的Top K问题

    1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...

  8. 大数据,why python

    大数据,why python ps, 2015-12-4 20:47:46 python" title="大数据,why python">http://www.op ...

  9. top(k,n)—db kernel队解题思路

    0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...

随机推荐

  1. javascript字符串截取的substring、substr和slice

    本文详细的介绍了javascript中substring().substr()和slice()三个JS字符串截取的方法,substring()方法用于提取字符串中介于两个指定下标之间的字符.subst ...

  2. jquery mobile 图片自适应问题

    解决办法: 加入一段css <link rel="stylesheet" href="http://jquerymobile.com/demos/1.1.0/doc ...

  3. OC-改错题

    1,类方法中不能访问成员变量 2,id后不能加*(因为id相当于NSObject *) 3,id类型的变量不能用点语法 4,类对象只能调用类方法,不能调用对象方法 .description #impo ...

  4. 浅谈JavaScript中的定时器

    引言 使用setTimeout()和setInterval()创建的定时器可以实现很多有意思的功能.很多人认为定时器是一个单独的线程(之前我也是),但是JavaScript是运行在单线程环境中的,而定 ...

  5. Java并发编程核心方法与框架-TheadPoolExecutor的使用

    类ThreadPoolExecutor最常使用的构造方法是 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAli ...

  6. 命名不规范引发的DropDownListFor无法选中

    问题的引出: 项目中遇到和以下链接相同的问题,大概可以描述为:后台ViewData["KeyName"],前台Model属性里也有一个字段KeyName,那么DropDownLis ...

  7. Java-java中无符号类型的处理

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  8. solr6.1-----相关配置-详细介绍-启动-全文检索

    环境准备 jdk1.8.0_60  + apache-tomcat-8.5.4 + solr-6.1.0 进过测试.使用tomcat 7.x  不能正常启动solr .会报错,至于怎么原因,lz 暂时 ...

  9. 在hexo静态博客中利用d3-cloud来展现标签云

    效果: http://lucyhao.com/tags/ hexo自带的tag cloud的标签展现不太美观,想能够展现出“云”效果的标签.在网上找到了d3-cloud这个项目,github地址:ht ...

  10. 字符编码-UNICODE,GBK,UTF-8区别【转转】

    字符编码介绍及不同编码区别 今天看到这篇关于字符编码的文章,抑制不住喜悦(总结的好详细)所以转到这里来.转自:祥龙之子http://www.cnblogs.com/cy163/archive/2007 ...