加入收藏 | 设为首页 | 会员中心 | 我要投稿 宜春站长网 (https://www.0795zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

BAT大数据的面试题 快收藏!

发布时间:2018-09-18 12:39:14 所属栏目:教程 来源:千锋大数据开发学院
导读:9月15日技术沙龙 | 与东华软件、AWS、京东金融、饿了么四位大咖探讨精准运维! 1、kafka的message包括哪些信息 一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body

a、修改最大槽位数:槽位数是在各个 tasktracker 上的 mapred-site.xml 上设置的,默认都是 2

  1. property  
  2. namemapred.tasktracker.map.tasks.maximum/name  
  3. value2/value  
  4. /property  
  5. property  
  6. namemapred.tasktracker.reduce.tasks.maximum/name  
  7. value2/value  
  8. /property 

b、调整心跳间隔:集群规模小于 300 时,心跳间隔为 300 毫秒

  • mapreduce.jobtracker.heartbeat.interval.min 心跳时间
  • mapred.heartbeats.in.second 集群每增加多少节点,时间增加下面的值
  • mapreduce.jobtracker.heartbeat.scaling.factor 集群每增加上面的个数,心跳增多少

c、启动带外心跳

  • mapreduce.tasktracker.outofband.heartbeat 默认是 false

d、配置多块磁盘

  1. mapreduce.local.dir 

e、配置 RPC hander 数目

  • mapred.job.tracker.handler.count 默认是 10,可以改成 50,根据机器的能力

f、配置 HTTP 线程数目

  • tasktracker.http.threads 默认是 40,可以改成 100 根据机器的能力

g、选择合适的压缩方式,以 snappy 为例:

  1. property  
  2. namemapred.compress.map.output/name  
  3. valuetrue/value  
  4. /property  
  5. property  
  6. namemapred.map.output.compression.codec/name  
  7. valueorg.apache.hadoop.io.compress.SnappyCodec/value  
  8. /property 

17、设计题

1)采集nginx产生的日志,日志的格式为user ip time url htmlId 每天产生的文件的数据量上亿条,请设计方案把数据保存到HDFS上,并提供一下实时查询的功能(响应时间小于3s)

A、某个用户某天访问某个URL的次数

B、某个URL某天被访问的总次数

  • 实时思路是:使用Logstash + Kafka + Spark-streaming + Redis + 报表展示平台
  • 离线的思路是:Logstash + Kafka + Elasticsearch + Spark-streaming + 关系型数据库

A、B、数据在进入到Spark-streaming 中进行过滤,把符合要求的数据保存到Redis中

18、有 10 个文件,每个文件 1G,每个文件的每一行存放的都是用户的 query,每个文件的query 都可能重复。要求你按照 query 的频度排序。 还是典型的 TOP K 算法 ##,

解决方案如下:

1)方案 1:

顺序读取 10 个文件,按照 hash(query)%10 的结果将 query 写入到另外 10 个文件(记为)中。这样新生成的文件每个的大小大约也 1G(假设 hash 函数是随机的)。 找一台内存在 2G 左右的机器,依次对用 hash_map(query, query_count)来统计每个query 出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的 query 和对应的 query_cout 输出到文件中。这样得到了 10 个排好序的文件(记为)。 对这 10 个文件进行归并排序(内排序与外排序相结合)。

2)方案 2:

一般 query 的总量是有限的,只是重复的次数比较多而已,可能对于所有的 query,一次性就可以加入到内存了。这样,我们就可以采用 trie 树/hash_map等直接来统计每个 query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

3)方案 3:

与方案 1 类似,但在做完 hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如 MapReduce),最后再进行合并。

19、在 2.5 亿个整数中找出不重复的整数,注,内存不足以容纳这 2.5 亿个整数 。

  • 方案 1:采用 2-Bitmap(每个数分配 2bit,00 表示不存在,01 表示出现一次,10 表示多次,11 无意义)进行,共需内存 2^32 * 2 bit=1 GB 内存,还可以接受。然后扫描这 2.5亿个整数,查看 Bitmap 中相对应位,如果是 00 变 01,01 变 10,10 保持不变。所描完事后,查看 bitmap,把对应位是 01 的整数输出即可。
  • 方案 2:也可采用与第 1 题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。

20、腾讯面试题:给 40 亿个不重复的 unsigned int 的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那 40 亿个数当中? ##

方案 1:oo,申请 512M 的内存,一个 bit 位代表一个 unsigned int 值。读入 40 亿个数,设置相应的 bit 位,读入要查询的数,查看相应 bit 位是否为 1,为 1 表示存在,为 0 表示不存在。

方案 2:这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下: 又因为 2^32 为 40 亿多,所以给定一个数可能在,也可能不在其中; 这里我们把 40 亿个数中的每一个用 32 位的二进制来表示 ,假设这 40 亿个数开始放在一个文件中。 然后将这 40 亿个数分成两类:

  • 1.最高位为 0
  • 2.最高位为 1

并将这两类分别写入到两个文件中,其中一个文件中数的个数=20 亿,而另一个=20 亿(这相当于折半了); 与要查找的数的最高位比较并接着进入相应的文件再查找 再然后把这个文件为又分成两类:

  • 1.次最高位为 0
  • 2.次最高位为 1

并将这两类分别写入到两个文件中,其中一个文件中数的个数=10 亿,而另一个=10 亿(这相当于折半了); 与要查找的数的次最高位比较并接着进入相应的文件再查找。

.....

以此类推,就可以找到了,而且时间复杂度为 O(logn),方案 2 完。

(编辑:宜春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读