面试必须掌握的十个海量数据问题及解决方案

题目

问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(将题干简化,假设日志中仅包含IP数据,也就是说待处理的文件中包含且仅包含全部的访问IP,但内存空间有限,不能全部加载,假设只有512MB)

解决方案:

分治

第一:如何有效的划分数据

第二:如何在子集上解决问题

第三:如何合并结果

首先解决如何划分,由于IP地地址范围从000.000.000.000~255.255.255.255共有2^32个大约4GB,那么我们可以通过取模的方式进行划分,直接将四段数据相连就得到一个IP对应的数字A,再对A模1024(模数取多少可以自己指定,保证每个小文件能被放到内存就好),这样大文件被划分成小文件了,并且相同的IP一定被划分到相同的文件中。

其次解决每个小文件中TOP1的问题:
这里可以用很多方式进行处理,比如你可以构造自己的HashMap,key为IP,value为当前出现次数,最后找到value最大的Key即为当前文件中出现次数最多的IP。
这里直接将1024个子文件的统计结果进行比较就好,不用排序,直接选择最大的一个就好。

————————————————

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

解决方案:细心的读者可以发现这个和第一个问题应该没有太大别,区别就在于第一个问题是Top1,这个问题是TOP100。

那么对于这个问题,主要考虑的是如何划分(每个文件要小于1M),这里可以考虑划分为2028份。

对于第二步可以考虑用堆排序
即常用的TopN手段。

第三部就是更为常见的归并排序
————————————————

问题三:给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

解决方案:这种题目,我首先想到的就是布隆过滤器(BloomFilter)
当然使用布隆过滤器存在一定的错误率,所以面试者可以和面试官进行进一步的沟通,看是否允许有一定的错误率。

如果使用布隆过滤器,那么问题就很好办了,4G的内存足以容纳300多亿的bit,所以足够处理了,先将a文件中的url都放入布隆过滤器,之后遍历b文件,对每个url都询问布隆过滤器看其是否已经存在,如果存在,则此条URL输入结果文件。

第二种方案就是采用更为通用的但对于这个问题效率较低的分治思想,对a,b进行分片,a,b文件大小都大约320G,那么每个文件都切分成1G的320个小文件。

————————————————

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

解决方案:这种题又是典型的wordcount问题,首先这种题不用说都是内存有限制(最好问问面试官,内存限制是多少)。如果没内存限制直接一个trie树就搞定了(因为一般来说query的重复都比较多)。

如果内存限制比较大,那么可以尝试屡试不爽的分治方法。但在使用之前需要先对原来的文件进行一下处理通过hash(url)%A,这里A只分成多少分,这里可以也取10,就是将原来的10个文件转为新的10个文件,如果内存限制比较大,那么这个A可以根据内存大小调整,要让1G/A <= 内存大小。

接下来就是要对每个小文件进行统计,可以用hashmap(url,count),也可以用trie树。

之后采用归并排序的方法得到最终结果。

————————————————
 

问题五:怎么在海量数据中找出重复次数最多的一个?

解决方案:如果看了前面四个题目,这里相信读者应该已经会自己解决了。

使用屡试不爽的分治思路,先划分成小文件,之后分别统计,之后再选取max,读者可以思考如何优化小文件内的处理方法。

怎么在海量数据中找出重复次数最多的10个?

分治+topK;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://blog.csdn.net/hitxueliang/article/details/52153476

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值