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. Android学习笔记——download

    该工程的功能是实现从网上的链接下载一个lrc文件和一个mp3文件 以下代码是MainActivity.java中的代码 package com.example.download; import com ...

  2. Android学习笔记——CheckBox

    该工程的功能实现在一个activity中显示一个单选框和一个多选框 以下代码是MainActivity.java文件中的代码 package com.example.checkbox; import ...

  3. Fragment碎片的创建和动态更新

    Fragment,在平板应用中较为参见,把视图分为两个甚至多个模块. 一,一个简单的fragment 1.创建两个局部文件,用于等待被调用 (1)left_fragment (2)right_frag ...

  4. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

    java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别   以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自 ...

  5. Haproxy安装配置及日志输出问题

    简介: 软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载 ...

  6. jQuery EasyUI API 中文文档 - ValidateBox验证框

    jQuery EasyUI API 中文文档 - ValidateBox验证框,使用jQuery EasyUI的朋友可以参考下.   用 $.fn.validatebox.defaults 重写了 d ...

  7. [Js/Jquery]jquery插件开发

    摘要 上篇文章简单学习了js自调用方法.今天就趁热打铁,学一学怎么编写一个jquery插件. JQuery 参考地址:http://www.cnblogs.com/playerlife/archive ...

  8. SQL Server2008窗口计算

    (一) 窗口的定义:指为用户指定的一组行,也称着"分区".如下图所示的窗口分区.每一个班级看作是一个数据窗口,一共有三个窗口 (二)窗口计算的相关方法 1)over()用法  格式 ...

  9. Linux下的文件及文件后缀名

    Linux下的文件及文件后缀名 2013-03-14 15:34 6969人阅读 评论(0) 收藏 举报 ++++++++++++++++++++++++++++++++++++++正文+++++++ ...

  10. JavaScript基础整理(1)

    最近读了<JavaScript权威指南>这本书,闲来无事对自认为重要的知识做了些整理,方便以后查阅. JavaScript中的最重要的类型就是对象,对象是名/值对的集合,或字符串到值映射的 ...