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. Spring MVC学习笔记——POJO和DispatcherServlet

    POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJB(Enter ...

  2. Java反射机制<1>

    如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象). 任何一个类如果没有明确地声明继承自哪个父类的 ...

  3. C#中导入Win32 API函数

    C#中导入Win32 API的方法: 1.引用命名空间 using System.Net.Security; using System.Runtime.InteropServices; 2. [Dll ...

  4. LaTeX 算法代码排版 --latex2e范例总结

    LaTeX 写作: 算法代码排版 --latex2e范例总结 latex2e 宏包的使用范例: \usepackage[ruled]{algorithm2e}                     ...

  5. VS2013-解决error C4996: 'fopen'问题

    VS2013中如何解决error C4996: 'fopen'问题 初次使用vs系列编辑器编写控制台应用程序时常出现如下错误: error C4996: 'fopen': This function ...

  6. maven test 运行 指定类或方法 打包 mvn clean assembly:assembly

    >mvn test -Dtest=[ClassName] 运行测试类中指定的方法:(这个需要maven-surefire-plugin:2.7.3以上版本才能支持)   >mvn test ...

  7. centos 7.0 安装

    最小化安装的  主要查看硬盘使用时间 需要安装 smartmontools 这个 [root@localhost ~]# yum install -y smartmontools 已加载插件:fast ...

  8. MySQL注入

    SQL Injection Tutorial by Marezzi (MySQL) SQL注入教程由Marezzi(MySQL的) In this tutorial i will describe h ...

  9. Yii2 使用八 使用scenarios

    在model里定义 public function scenarios() { return [ 'add' => ['title', 'content'], ]; } 在rules里定义 [[ ...

  10. 单选框的回显c:if

    <input type="radio" name="sex" value="boy" <c:if test="${te ...