大数据面试中经典的案例分析

1. Hadoop会有哪些重大故障,如何应对?

1)namenode单点故障:通过zookeeper搭建HA高可用,可自动切换namenode。
2)ResourceManager单点故障:可通过配置YARN的HA,并在配置的namenode上手动启动ResourceManager作为Slave,在Master 故障后,Slave 会自动切换为Master。
3)reduce阶段内存溢出:是由于单个reduce任务处理的数据量过多,通过增大reducetasks数目、优化partition 规则使数据分布均匀进行解决。
4)datanode内存溢出:是由于创建的线程过多,通过调整linux的maxuserprocesses参数,增大可用线程数进行解决。
5)集群间时间不同步导致运行异常:通过配置内网时间同步服务器进行解决。

数据如何导入HDFS中,又如何导入数据库中?

数据处理之前的导入:通过HDFS shell命令或者Java API程序导入到HDFS中,如果需要导入Hive中,则在创建Hive数据表的时候load HDFS上的目标文件路径。
数据处理完成之后的导出:假设是hive处理完成之后的数据,可通过sqoop导出到本地的MySQL数据库中。

列举你了解的海量数据的处理方法以及使用范围

  • mapreduce: 大数据常用的分布式离线计算框架,核心思想为分而治之。
  • 倒排索引:一种索引方法,用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,在倒排索引中单词指向了包含单词的文档。
  • 消息队列:大量的数据写入首先存入消息队列进行缓冲,再把消息队列作为数据来源进行数据读取。这种方法在实时计算中经常用到,例如SparkStreamming Storm。比较常用的消息队列如kafka。
  • 数据库读写分离:在一台数据库中写入数据,另外的多台数据库从这台数据库中进行读取。

开放性问题(根绝你学过的知识 扩展你的思维)

大厂,例如腾讯 阿里会出这样的问题? 自己设计算法或者实现方案来解决。

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

解决方案:顺序读文件中,对于每个词 x,取 hash(x)%5000,然后按照该值存到 5000 个小文件(记为 x0,x1,…x4999)中。这样每个文件大概是 200k 左右。
如果其中的有的文件超过了1M 大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过 1M。 (这一过程就是mapreduce程序中 map方法中对数据的分割!!)
对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用 trie 树/hash_map 等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100个词及相应的频率存入文件,这样又得到了5000个文件(这里实质就是reduce阶段的核心思想)。
下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。

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

解决方案如下:
方案 1:
顺序读取10个文件,按照hash(query)%10 的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。找一台内存在2G左右的机器,依次对用 hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。对这10个文件进行归并排序(内排序与外排序相结合)。
方案 2:
一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
方案 3:
与方案 1 类似,但在做完 hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如 MapReduce),最后再进行合并。

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

方案 1:可以估计每个文件安的大小为 5G×64=320G,远远大于内存限制的 4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。
遍历文件a,对每个url求取 hash(url)%1000,然后根据所取得的值将url分别存储到 1000个小文件(记为 a0,a1,…,a999)中。这样每个小文件的大约为300M。遍历文件b,采取和a相同的方式将url分别存储到1000小文件(记为b0,b1,…,b999)。
这样处理后,所有可能相同的url都在对应的小文件(a0vsb0,a1vsb1,…,a999vsb999)中,不对应的小文件不可能有相同的url。然后我们只要求出 1000 对小文件中相同的 url即可。
求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿 bit,然后挨个读取另外一个文件的url,检查是否与 Bloom filter,如果是,那么该 url 应该是共同的 url(注意会有一定的错误率)。

未完待续, 之后南国 有总结更好的问题 定会持续更新~

你可能感兴趣的:(大数据,Hadoop)