海量数据处理问题

一、方法论

  1. 对于固定大小的海量数据,通常可以采用分文件+哈希统计+内存处理(堆/快速/归并排序)的方法。
  • 对于字符串数据,可以对字符串进行哈希,哈希值%n(n为分文件数量),这样来说同一个字符串必然分配到一个文件当中,然后如果哈希均匀的话,就能够保证每个文件可以放入内存当中,在内存当中采用通用方法进行处理获得每个文件的结果,然后写到磁盘中,最后汇总或者直接在内存中汇总。
  • 对于数字,可以直接x%n(n为分文件数量)或者采用二进制前k位来分成2^k个文件块。
  1. Bloom filter(布隆过滤器)
  • 判断一条记录在另一个记录集合中是否存在。具体操作时,对于记录集合S中的n条记录,设置m位的bitmap和k个独立hash函数,遍历S集合,对于每条记录,将其k个hash函数值对应位置1。要判断一条记录是否存在时,查看其k个hash函数值对应位是否都是1,如果是,就认为存在,否则就不存在。bloom filter对于有hash函数值为0的,那么就可以100%确定这条记录不存在,但是可能把不存在的误判成存在的。但是这样的概率很小。
  • m应该>=nlg(1/E)lge 大概就是nlg(1/E)1.44倍,当hash函数个数k=(ln2)(m/n)时错误率最小。
  • Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。counter可以记录hash值对应到该counter的次数
  1. bitmap
  • 对于uint32型的数据比较有用,uint32每个数字对应一位,最后会申请512M的内存。
  1. Trie树(前缀树)
  • 适用范围:数据量大,重复多,但是数据种类小可以放入内存。
  • 基本原理及要点:实现方式,节点孩子的表示方式
  • 扩展:压缩实现。
  1. 外排序
  • 外部排序是针对海量数据无法放入内存中排序而产生的一种排序算法。基本算法是拆分成多个小文件,每个小文件可以放入内存当中,对于小文件进行排序后,再采用多路归并排序,也就是构造一个大小为文件块数的堆(升序就是小堆,降序就是最大堆),先分别从k个文件中读取一个数插入堆中,将堆顶元素写到文件中,然后从写出元素所在文件中再读入一个数,依次进行下去。
  • 适用范围:大数据的排序,去重

面试问题:

  1. 海量日志数据,提取出某日访问百度次数最多的那个IP。
  • 方法一:
    1. 分而治之/哈希映射:读取ip,划分成n个文件根据hashCode%n值,分划到相应的文件当中
    2. 哈希统计:对于每个文件,可以读入内存,hashmap统计ip次数(注意一个ip只会出现在一个文件当中),然后通过排序或者遍历获得最大次数的ip。
    3. 汇总:获得每个文件中出现次数最多的ip,进行堆排或者快排或者扫描,就可以获得出现次数最多的ip。
  • 方法二:
    trie树,用第k叉表示ip的一部分(ip可以分为四部分)。叶结点值可以存放ip次数。
  1. 寻找热门查询,300万个查询字符串中统计最热门的10个查询
    300万个字符串如果可以放进内存存储为hashmap,那么就不用分而治之/哈希映射了。
    哈希统计:hashmap统计每个字符串出现次数
    堆排序:简历大小为10的小顶堆,堆元素为键值对,键为字符串,值为字符串出现次数,遍历hasmap或者读入文件流,遇到键值对的值大于堆顶元素值,就插入堆,并且删除堆顶键值对。遍历完毕后就可以获得top k查询结果。
    trie树加大小为10的最小堆的方法也能够解决
  2. 在10G数据中,数据类型为uint32,内存1G,寻找其中重复出现的数字
    方法一、分而治之/哈希映射:根据uint32前4位将数据分成2^4个文件块
    哈希统计:hashmap统计每个文件块中重复出现的数字
    汇总:将每个文件快重复出现的数字直接并起来
    方法二、 bitmap
    uint32为2^32次方,对于每个数用一个bit记录是否出现,如果出现,就置该bit为1,如果发现该bit位已经为1,那么就直接将该数写到文件中,说明已经出现过。这种方法效率很高,但是如果可用内存更小或者改成uint64,那么就不行了。
  3. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
  • 如果每个数据只在一台电脑上出现,那么求出每台电脑的TOP10,再进行汇总。
  • 遍历一遍所有数据,重新hash取摸,如此使得同一个元素只出现在单独的一台电脑中,然后采用上面所说的方法,统计每台电脑中各个元素的出现次数找出TOP10,继而组合100台电脑上的TOP10,找出最终的TOP10。
  • 或者,暴力求解:直接统计统计每台电脑中各个元素的出现次数,然后把同一个元素在不同机器中的出现次数相加,最终从所有数据中找出TOP10。
  1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
    将a,b两个文件中的url经哈希分散到a[1000]个子文件中和b[1000]子文件中后,文件a_ib_i放入内存取交集即可。
  2. 怎么在海量数据中找出重复次数最多的一个?
    先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,然后求所有文件中最大的重复次数。

总结:

对于固定大小的海量数据,通用做法就是分文件hash+内存处理(堆/快速/归并排序)+汇总方法解决。可以一次性放进内存中处理的做法有bitmap,trie树。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342