大数据的一些面试题

  1. 海量日志数据,提取出某日访问百度次数最多的那个IP。

这道题就是用Hash + Heap的办法来做的典型问题。我们先遍历每个IP,对每个IP算一个Hash,这样每个Hash就均匀的Map到了Hash空间里。然后根据每个IP计算的Hash(IP)%100 将这个IP放到100个文件中。这种做法就保证了同一个IP一定会被分到同一个文件中,而且所有IP应该是均匀分布的。然后对于每个文件里出现IP的频率进行统计(可以用HashMap, 也可以用trie,每个Tire的leaf上存一个freq),然后用MinHeap排序找出每个文件的Top K,然后再合并所有的Top K,就得到了结果。

同样的办法可以用在其他的统计String的TopK频率等等类似的问题中。

  1. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
    如果每个数据只出现在同一台电脑上,那么就可以用上面的方法解决,还省去了Hash的过程。但是如果同样的数据可能出现在不同的电脑中呢?
    那么我们就要把相同的数据用Hash的办法放到同样的电脑中。相当于重新分布一下。
    或者我们直接用另外一台电脑统计所有电脑中数据出现的次数(因为有重复,所以有可能一台电脑就可以放的下),然后再按频率进行排序。

同样的问题还可以用一些分布式的framework来做比如map reduce。把每个document分给mapper,mapper遍历所有的word,然后做成word->1这样的pair,然后经过shuffle以后变成word->{1,1,1,1…}这样的,然后我们只要在reducer里面分析这个组合就可以了。

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

同样的对每个url进行Hash,然后根据Hash(url)的结果将他们分成1000份(这样每一份是0.32G,如果hash算法好的话)。然后a 和 b的每个相对应的file进行比较看看有没有重复的(用hashmap就可以)因为如果是同样的hash算法的话,相同的url一定是分配到相同的file中的。

或者我们也可以给其中一个url生成一个bloom filter,然后用这个bloom filter来filter另外一个hash,如果没有重复,那么我们可以肯定没有重复,如果bloom filter的结果说可能有重复,那么我们再进到array里一个一个检查。

2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
其实我们只需要把所有整数划分到能够放进内存里的bucket里面,比如说2^26 32M大小的file,然后每次check这个范围内的整数,用bitmap来看是否有重复的。 给每个integer assign一个bit,如果出现过就把这个bit设置成1,这样就知道这个bit是否见过了

给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
同样只要用bitmap,每个bit assign一个数,只要那个对应的数被设置成1了,就表示那个数存在,是逻辑和算法上的,和计算机的物理特性没有关系。

外排序,外排序

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

所以我们可以用内存作为缓冲区来进行外排序,将所有的词都按String比较大小的方法外排序。这样所有的string都已经排好序了,然后我们再一个一个统计所有string出现的次数,最后输出频率最高的那个。