缘由
由于有面试通知,现在复习一下十道和海量数据处理相关的题。两篇博客已经讲的非常完备了,但是我怕读懂了并非真的懂,所以必须自己复述一遍。面试归类
下面6个方面覆盖了大多数关于海量数据处理的面试题:- 分而治之/hash映射 + hash统计 + 堆/快速/归并排序;
- 双层桶划分
- Bloom filter/Bitmap;
- Trie树/数据库/倒排索引;
- 外排序;
- 分布式处理之Hadoop/Mapreduce。
第一类:分治后hash统计再排序
第一题:海量日志数据,提取出某日访问百度次数最多的那个IP
解答:该题解题思路总共分为三步
- 分而治之/hash映射:如果该文件过大,不能全部读入内存。我们就必须先利用hash函数将其分割成若干小文件。再分别对各个小文件进行处理。注意这一步我们肯定会将相同的ip放在同一个文件。由于这个题干给的比较少。我只有自己脑补一下,大概给我们的日志中就是百度web服务器自己记录的来自不同的ip的访问。这个日志是按天生成的,所以现在我们要统计一天内,哪一个ip访问本网站百度的次数最多。那么日志中肯定就是记录是访问ip和时间,但是相同的ip肯定是单独的一条。所以现在要将相同的ip放在同一个文件中处理。由于我们确定某个ip放到哪一个子文件的时候是使用的一个hash函数,对一个ip用hash函数求值后取模,就可以确定这个条ip记录放到哪一文件。所有在相同的ip一定存在一个文件,这样方便我们统计。
- hash_map统计:针对每一个文件,我们肯定是可以读入内存了。(因为这里每一个文件的大小是我们在第一步控制的)。针对内存中的每一条记录,以ip为键,以其出现的次数为值,遍历该文件中的每一条记录。(顺便深入思考一下:这里所谓的hash_map就是一个底层以hashtable实现的数据结构。我猜想底层也就是有一个巨大的数组,数组下标就是键的hash值,而数组的内容就是值。在这里就是用ip算出了数组下标,然后数组内容就是该ip出现的次数。当然更多内容需要去探索,比如这个数组大小是如何确定?发生冲突是如何解决。不过这点与该题无关了,我们只是利用hashmap这个数据结构。)
- 堆/快速排序:针对每一个文件,只需遍历一次就可以取得该文件,ip次数出现最多的那个ip。将所有小文件中访问次数最多的ip一对比,就可以得到整个文件中ip最多的那一个。
第二题:寻找热门查询,300万个查询字符串中统计最热门的10个查询
题干:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。解答:
有了一题的思路,那么这道第二题就更好理解了,思路肯定还是分而治之/hash映射 + hash统计 + 堆/快速/归并排序。但是我们需要考虑第一步是否有必要,因为共有记录300万条,就算每条记录的长度都是255字节,那么就是
(3000000*1/4)1024 约等于 (3000000*1/4)1000 ,结果单位为MB(注意1/4的单位是kb),那么就是0。75g。所以这整份文件是可以轻易读入大小为1G的内存的。所以第一步分而治之/hash映射在本题中是不需要的。
直接第二、三步:
hash统计:遍历这1000万条记录,每天都以一个query为键,其出现的累计出现的次数为值。那么就可以在一次遍历的过程中将所有的统计query出现的次数统计完。
堆/快速/归并排序:由于我们只需要求出前10个query。所以也就是求top k的问题,那么使用堆结构。我们可以logK的时间内完成查找和调整堆结构。所以,我们只需要维护一个大小为10的最小堆。我们确实是求查询次数最多的10个次,所以我们该用最小堆。接着,就将先将300万条记录的前10个插入最小堆,调整最小堆,然后将第11个与最小堆的堆顶比较,如何堆顶元素大,那么不做任何改变,如果堆顶元素小,那么就用第11个替换掉堆顶元素,然后调整最小堆,与第12个进行比较。那么我们在一次遍历之后就可以选出最大的10个。
第三题
3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。解答:
显然过程还是分而治之/hash映射 + hash统计 + 堆/快速/归并排序。而且题中已经说的很明显了,就是内存肯定是不够用的。所以我们肯定要进行分而治之/hash映射这一步。我就不再复述了,因为和上面两道题和相似。
第四题
4、海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。解答
还是分而治之/hash映射 + hash统计 + 堆/快速/归并排序 这个思想。