大数据方向笔试面试题

1.使用大数据训练深度神经网络(Deep Neural Networks , 简称DNN)的方法:

  • SGD: 随机梯度下降。它能够收敛于最小值点,因此当训练数据过大时,用GD可能造成内存不够用,则可用SGD。
  • FTRL: 近似在线学习算法,具有非常好的稀疏性和收敛特性,在ctr预估中大量的使用。
  • RMSProp: 深度学习的最优方法之一。RMSProp算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快

ps: L-BFGS方法:所有的数据都会参与训练,算法融入方差归一化和均值归一化。当数据集过大时,不适用于训练DNN。

2.常见的可高效运算低耗能存储大数据的方法:

  • 并行计算技术
  • 分布式云存储技术
  • 分布式文件系统及数据库
  • 多源数据清洗及数据整合技术

3.Hadoop用来处理离线数据;spark/storm处理实时数据,流式处理

4.Hadoop MapReduce只适用于批量处理数据

5.MapReduce/Spark/Flink/Storm均支持使用YARN调度资源

6.FlinkSpark既支持批量计算,也支持流式计算

7.Spark Streaming支持秒级延迟,其吞吐量优于Storm(毫秒级)

8.请列出Hadoop进程名:

  • Namenode:负责管理datanode和记录元数据。
  • Secondarynamenode:负责合并日志,对一定范围内数据做快照性备份。
  • Datanode:存储数据。
  • ResourceManager:管理任务,并将任务分配给MRAppMaster
  • NodeManager:任务执行方。

8.1 Datanode负责 HDFS 数据存储。在强制关闭或者非正常断电的情况下datanode不会备份。

8.2 JobTracker是一个后台服务进程,运行在NameNode上。启动之后,会一直监听并接收来自各个TaskTracker发送的心跳信息,包括资源使用情况和任务运行情况等信息。

其主要功能:1.作业控制:JobTracker的作业控制模块则负责作业的分解和状态监控。(最重要的是状态监控:主要包括TaskTracker状态监控、作业状态监控和任务状态监控。主要作用:容错,为任务调度提供决策依据。)2.资源管理。

8.3 NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。

8.4 secondaryNameNode是一个用来监控HDFS状态的辅助后台程序。目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间。

8.5 TaskTracker是运行在多个节点上的slaver服务, 运行在DataNode上。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。

注: DataNodeNameNode 是针对数据存放来而言的; JobTrackerTaskTracker是对于MapReduce执行而言的

9.HDfS 中的 block 默认保存3份

10.HDFS 默认 Block Size为64MB

11.Puppet, Pdsh 和 Zookeeper可以管理集群

12.ClientNameNode 发起文件写入的请求;NameNode 根据文件大小和文件块配置情况,返回给 Client 它所管理部分 DataNode 的信息;Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序写入到每一个DataNode 块中。

13.1 Hadoop的核心配置通过两个xml文件来完成:1,hadoop-default.xml;2,hadoop-site.xml。(现在已经不存在)

13.2 Hadoop现在拥有3个配置文件:1,core-site.xml;2,hdfs-site.xml;3,mapred-site.xml。这些文件都保存在conf/子目录下。

14.‘jps’命令可以检查Namenode、Datanode、Task Tracker、 Job Tracker是否正常工作

15.MapReduce原理采用“分而治之”的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果, 得到最终结果。简单地说,MapReduce就是”任务的分解与结果的汇总”。

在Hadoop中,用于执行MapReduce任务的机器角色有两个:一个是JobTracker;另一个是TaskTracker,JobTracker是用于调度工作的,TaskTracker 是用于执行工作的。一个Hadoop集群中只有一台JobTracker。

在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理 过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。

注:用MapReduce来处理的数据集(或任务)必须具备这样的特点:待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。

16.1 HDFS写流程

  1. client链接namenode存数据
  2. namenode记录一条数据位置信息(元数据),告诉client存哪。namenode记录一条数据位置信息(元数据),告诉client存哪。
  3. client用HDFS的api将数据块(默认是64M)存储到datanode上。client用HDFS的api将数据块(默认是64M)存储到datanode上。
  4. datanode将数据水平备份。并且备份完将反馈client。 datanode将数据水平备份。并且备份完将反馈client。
  5. client通知namenode存储块完毕。 client通知namenode存储块完毕。
  6. namenode将元数据同步到内存中。namenode将元数据同步到内存中。
  7. 另一块循环上面的过程。另一块循环上面的过程。

16.2 HDFS读流程

  1. client链接namenode,查看元数据,找到数据的存储位置。
  2. client通过HDFS的API并发读取数据。client通过HDFS的API并发读取数据。
  3. 关闭连接。

17.MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出。Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中。

18.现在有10个文件夹,每个文件夹都有1000000个url,请用MapReduce找出top1000000url。

方法一
运用2个job,第一个job直接用filesystem读取10个文件夹作为map输入,url做key,reduce计算url的sum;下一个job map用url作key,运用sum作二次排序,reduce中取top10000000
1:首先进行wordcount计算
2:进行二次排序

方法二
建hive表A,挂分区channel,每个文件夹是一个分区。

SELECT x.url,x.c FROM (
SELECT url,count(1) AS c FROM A 
WHERE channel ='' group by url
) x 
ORDER BY x.c desc limit 1000000;

方法三:还可以用treeMap, 到1000000了每来一个都加进去, 删掉最小的。

19.1 Hadoop中Combiner的作用是reduce的实现,在map端运行计算任务,减少map端的输出数据。Combiner的使用场景是MapReduce的map和reduce输入输出一样,其作用是优化。

19.2 partition的默认实现是hash partition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。partition的作用是将数据分到不同的reduce进行计算,加快计算效果。

20.简述Hadoop安装:
1)创建Hadoop用户
2)改IP,修改HOSTS文件域名
3)安装SSH,配置无密钥通信
4)安装JAVA,配置JAVA的环境变量
5)解压hadoop
6)配置conf下的core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml
7)配置hadoop的环境变量
8)hadoop namenode -format
9)start-all.sh

21.hive有哪些保存元数据的方式, 个有什么特点?

1、 内存数据库derby;安装小,但是数据存在内存,不稳定

2、 mysql数据库;数据存储模式可以自己设置,持久化好,查看方便。

22.hive内部表外部表的区别:

  • 内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
  • 外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。

23.HBase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。

24.用mapreduce怎么处理数据倾斜问题:

map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。

例一:
源代码:


 public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;

  }

修改后

public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (((key).hashCode()+value.hashCode()& Integer.MAX_VALUE) % numReduceTasks;

  }

方式2:

public class HashPartitioner<K, V> extends Partitioner<K, V> {

private int aa= 0;

  /** Use {@link Object#hashCode()} to partition. */

  public int getPartition(K key, V value,

                          int numReduceTasks) {

    return (key.hashCode()+(aa++) & Integer.MAX_VALUE) % numReduceTasks;

  }

25.如何优化Hadoop框架
(1) 从应用程序角度进行优化。由于mapreduce是迭代逐行解析数据文件的,怎样在迭代的情况下,编写高效率的应用程序,是一种优化思路。

  • 避免不必要的reduce任务
  • 为job添加一个Combiner
  • 根据处理数据特征使用最适合和简洁的Writable类型
  • 重用Writable类型
  • 使用StringBuffer而不是String

(2) 对Hadoop参数进行调优。当前hadoop系统有190多个配置参数,怎样调整这些参数,使hadoop作业运行尽可能的快,也是一种优化思路。

(3) 从系统实现角度进行优化。这种优化难度是最大的,它是从hadoop实现机制角度,发现当前Hadoop设计和实现上的缺点,然后进行源码级地修改。该方法虽难度大,但往往效果明显。

(4)linux内核参数调整

26.在开发job时,设置reduce数为0 即可去掉reduce阶段。

27.3个datanode中有一个datanode出现错误时,这个datanode的数据会在其他的datanode上重新做备份。

28.生产环境中使用外部表的好处:

  • 因为外部表不会加载数据到hive,减少数据传输、数据还能共享。
  • hive不会修改数据,所以无需担心数据的损坏
  • 删除表时,只删除表结构、不删除数据。

29 - redis:分布式缓存,强调缓存,内存中数据

  • hbase:列式数据库,无法做关系数据库的主外键,用于存储海量数据,底层基于hdfs
  • hive:数据仓库工具,底层是mapreduce。不是数据库,不能用来做用户的交互存储

注:传统数据库:注重关系

30.MapReduce中map的数量有数据块决定,reduce数量随便配置。

31.设置日志收集分析系统:

  1. 通过flume将不同系统的日志收集到kafka中
  2. 通过storm实时的处理PV、UV、IP通过storm实时的处理PV、UV、IP
  3. 通过kafka的consumer将日志生产到hbase中。
  4. 通过离线的mapreduce或者hive,处理hbase中的数据通过离线的mapreduce或者hive,处理hbase中的数据

32.Hive语句实现word count:

  • 建表
  • 分组(group by)统计word count
SELECT word,count(1) FROM table1 
GROUP BY word;

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

答案:可以估计每个文件的大小为50亿×64=298G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

  1. 将文件存储到hdfs中,这样每个文件为64M或者是128M
  2. 分别对两个文件的url进行去重、排序输出,这样能排除a文件中相同的url,b文件也一样分别对两个文件的url进行去重、排序输出,这样能排除a文件中相同的url,b文件也一样
  3. 对a、b两个文件处理后的结果进行wordcount,并且在reduce中判断单词个数,个数为2的时候输出,这样就找到了a、b文件中的相同url。对a、b两个文件处理后的结果进行wordcount,并且在reduce中判断单词个数,个数为2的时候输出,这样就找到了a、b文件中的相同url。
  4. 此计算步骤中的每一步加载到内存中的文件大小都不会超过64M,远远小于4G。此计算步骤中的每一步加载到内存中的文件大小都不会超过64M,远远小于4G。

34.实时数据应用场景和技术:

  • flume:日志收集系统,主要用于系统日志的收集
  • kafka:消息队列,进行消息的缓存和系统的解耦
  • storm:实时计算框架,进行流式的计算。

35.HBase性能优化思路:

  1. 在库表设计的时候,尽量考虑rowkey和columnfamily的特性
  2. 进行hbase集群的调优:见hbase调优进行hbase集群的调优:见hbase调优

36.数据库怎么导入hive 的,有没有出现问题?

答:使用sqoop导入,我们公司的数据库中设计了text字段,导致导入的时候出现了缓存不够的情况(见云笔记),开始解决起来感觉很棘手,后来查看了sqoop的文档,加上了limit属性,解决了。

37.Hadoop 的 namenode 宕机,怎么解决?

答:先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在。如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。

38.一个datanode 宕机, 怎么一个恢复?

答:Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,那么datanode上的数据应该已经被备份到其他机器了,那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动。

39.Mapreduce 流程:

Map—combiner—partition—sort—copy—sort—grouping—reduce

40.Hive中

  • insert into:将某一张表中的数据写到另一张表中
  • override write:覆盖之前的内容。

41.怎么通过Hive sql删除HDFS?

ALTER table ptable 
DROP partition (daytime='20140911',city='bj');

元数据,数据文件都删除,但目录中daytime= 20140911还在。

42.比较MapReduce和Spark

  • MapReduce是文件方式的分布式计算框架,是将中间结果和最终结果记录在文件中,map和reduce的数据分发也是在文件中。
  • Spark是内存迭代式的计算框架,计算的中间结果可以缓存内存,也可以缓存硬盘,但是不是每一步计算都需要缓存的。

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