海量数据处理思路方法

/**

    * @author wangdaopo

    * @email [email protected]

    */

海量数据处理思路方法

  • + - 如果超过内存空间限制采取分N文件而治之     Hash(query)%N, 将query相同范围映射放在同个文件
    • 2^10 = 1k   1024

      2^20=1M   百万左右

      2^30=1G  10亿左右

              100M      1亿左右  

    • 2^32 =4G  40亿

    • 可知预估所需占总用空间或已知总占用空间 是否超过内存限制。

      方法一:如果不知query个数,根据判断query所占位数,可预估最多有多少个不同的query*代表query实际所占空间。
      方法二:已知query个数*代表query实际所占空间。
      方法三:如果已知query个数和每个query实际所占空间,但是不想保存实际query来减少占用空间,而是根据判断query所占位数,可预估有最多有多少个不同的query,使用 每个query所表示情况(如采用2-Bitmap每个query分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义;如采用1-bitmap,表示0-1问题)占用空间  。预估最多有多少个不同的query*代表query表示所占空间。

  • 使用Hash map或Trie(前缀树/字典树)进行个数统计
    • 对于每一个小文件,可以构建一个query为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个query;
      • 实例
        • 海量日志数据,提取出某日访问百度次数最多的那个IP。
        • 怎么在海量数据中找出重复次数最多的一个?
    • Top K算法,维护一个K大小的小根堆,然后遍历query,分别和根元素query进行对比
      • 实例
        • 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。    假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。

          有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词

          有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。

          上千万或上亿数据(有重复),统计其中出现次数最多的前N个数据。

          一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词

  • 使用hash_se或Bloom Filter布隆过滤器   查找相同或不同的query
    • 求每对小文件中相同的query时,可以把其中一个小文件的query存储到hash_set中。然后遍历另一个小文件的每个query,看其是否在刚才构建的hash_set中,如果是,那么就是共同的query,存到文件里面就可以了。

      引入Bloom Filter布隆过滤器则可以很好的解决空间效率的问题。不需要存储元素本身

      • Bloom filter 采用的是哈希函数的方法,将一个元素映射到一个 m 长度的阵列上的一个点,当这个点是 1 时,那么这个元素在集合内,反之则不在集合内。这个方法的缺点就是当检测的元素量很多时候可能有冲突,解决方法就是使用 k 个哈希 函数对应 k 个点,如果所有点都是 1 的话,那么元素在集合内,如果有 0 的话,元素则不再集合内

        多个哈希函数将集合映射到位数组中

        布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。  

        • 它查询元素却不保存元素本身,具有良好的安全性

        (注意会有一定的错误率)。

      实例

      • 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
      • 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
      • 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
  • 如果有进行分而治之,最后需要根据要求进行归并处理。在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。

对于分布式地大数据处理,应当考虑两个方面的限制:
每台服务器进行算法计算的复杂度限制,包括时间和空间复杂度
服务器与服务器之间进行通信时的网络带宽限制

你可能感兴趣的:(算法)