大数据面试题(附答案,持续更新...)

  1. 说说对hadoop的理解,都有哪些组件,分别是干什么的
    hadoop是一个分布式系统基础框架,主要包括HDFS(分布式存储系统),Mapreduce(分布式计算框架),Yarn(资源管理框架)

  2. kafka在什么地方需要用到zookeeper
    kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。zookeeper中存储的信息有broker,consumer等重要znode信息;kafka节点broker的选举也是通过zookeeper来实现,主要流程是在zookeeper创建/controller临时节点来实现leader选举,并在该节点中写入当前broker的信息,利用Zookeeper的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的broker即为leader,即先到先得原则,leader也就是集群中的controller,负责集群中所有大小事务

  3. 了解HBase吗?
    HBase是一个开源的、分布式的、版本化的、非关系型数据库,适合对大数据进行随机、实时读/写访问

  4. 说下spark中的transform和action
    transformation是得到一个新的RDD,比如从数据源生成一个新的RDD或者从RDD生成一个新的RDD;常见的transformation操作有 map,filter,flatMap,mapPartition,groupbyKey,reducebyKey,sortByKey,cartesian等等;action是得到一个值或者一个结果,常见的action操作有collect、count、saveAsTextFile、countByKey、take、first、foreach等等

  5. 为什么spark要把操作分为transform和action
    transformation提交是不会执行计算的,计算只有在action被提交的时候才被触发。比如特别耗时的一些操作,不到必须要用这个操作的结果的时候可以不用执行,对性能提升比较明显。

  6. spark中有了RDD,为什么还要有Dataframe和DataSet?
    大数据面试题(附答案,持续更新...)
    RDD是分布式的 Java对象的集合,Spark框架本身不了解Person内部的结构。而DataFrame是分布式的Row对象的集合,Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame算子比较丰富,最终要的是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等。DataSet是DataFrame的一个特例,它存储的是一个强类型值,而不是一个Row,所以在编译的时候会检查类型。 RDD API是函数式的,强调不变性,大部分场景是在创建新对象而不是修改老对象,API会比较简洁,但是带来的问题是会在运行期间不断创建对象回收对象,造成GC压力大。Spark SQL在框架内部已经在各种可能的情况下尽量重用对象,这样做虽然在内部会打破了不变性,但在将数据返回给用户时,还会重新转为不可变数据。利用 DataFrame API进行开发,可以免费地享受到这些优化效果

  7. 了解函数式编程吗?说下c/c++和scala这种函数式编程语言的区别

  8. Java中抽象类和接口的区别
    抽象类(抽象类就是为了被继承):抽象类中的抽象方法必须定义为protected或者public,因为如果我们将其定义为私有的话,就无法被子类继承(其实也不是不好继承,而是不好调用);抽象类中的抽象方法如果没有在某一个子类中实现,那这个子类也要声明为抽象类;抽象类是不可以实例化的;一个类只能继承一个抽象类
    接口(为了方法而生):接口中可以有变量和方法,但是接口中的变量是被强制置为public static final 的,并且只能为该类型;接口中的方法,能且只能是public abstract方法,而且对于接口中的方法都不能有具体实现;一个列可以多继承接口

  9. 了解GC吗?
    大数据面试题(附答案,持续更新...)
    Java虚拟机中进行垃圾回收的场所有两个,一个是堆,一个是方法区。在堆中存储了Java程序运行时的所有对象信息,而垃圾回收其实就是对那些“死亡的”对象进行其所侵占的内存的释放,让后续对象再能分配到内存,从而完成程序运行的需要。关于何种对象为死亡对象,在下一部分将做详细介绍。Java虚拟机将堆内存进行了“分块处理”,从广义上讲,在堆中进行垃圾回收分为新生代(Young Generation)和老生代(Old Generation);从细微之处来看,为了提高Java虚拟机进行垃圾回收的效率,又将新生代分成了三个独立的区域(这里的独立区域只是一个相对的概念,并不是说分成三个区域以后就不再互相联合工作了),分别为:Eden区(Eden Region)、From Survivor区(Form Survivor Region)以及To Survivor(To Survivor Region),而Eden区分配的内存较大,其他两个区较小,每次使用Eden和其中一块Survivor。Java虚拟机在进行垃圾回收时,将Eden和Survivor中还存活着的对象进行一次性地复制到另一块Survivor空间上,直到其两个区域中对象被回收完成,当Survivor空间不够用时,需要依赖其他老年代的内存进行分配担保。当另外一块Survivor中没有足够的空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老生代,在老生代中不仅存放着这一种类型的对象,还存放着大对象(需要很多连续的内存的对象),当Java程序运行时,如果遇到大对象将会被直接存放到老生代中,长期存活的对象也会直接进入老年代。如果老生代的空间也被占满,当来自新生代的对象再次请求进入老生代时就会报OutOfMemory异常。新生代中的垃圾回收频率高,且回收的速度也较快。就GC回收机制而言,JVM内存模型中的方法区更被人们倾向的称为永久代(Perm Generation),保存在永久代中的对象一般不会被回收。其永久代进行垃圾回收的频率就较低,速度也较慢。永久代的垃圾收集主要回收废弃常量和无用类。

  10. 数据库都有哪些引擎
    InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎
    MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。
    MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

  11. 数据库的锁了解哪些
    行级锁:行级锁和表级锁是根据锁的粒度来区分的,行记录,表都是资源,锁是作用在这些资源上的。如果粒度比较小(比如行级锁),可以增加系统的并发量但需要较大的系统开销,会影响到性能,出现死锁,,因为粒度小则操作的锁的数量会增加;如果作用在表上,粒度大,开销小,维护的锁少,不会出现死锁,但是并发是相当昂贵的,因为锁定了整个表就限制了其它事务对这个表中其他记录的访问。
    悲观锁:Pessimistic Lock正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守悲观态度,事务每次去操作数据的时候都假设有其他事务会修改需要访问的数据,所以在访问之前都要求上锁,行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。 一个典型的倚赖数据库的悲观锁调用: select * from account where name=”Erica” for update 这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录。 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
    乐观锁:Optimistic Lock,和悲欢锁相反,事务每次去操作数据之前,都假设其他事务不会修改这些需要访问的数据 ,所以 在访问之前不要求上锁,只是在进行更新修改操作的时候判断一下在访问的期间有没有其他人修改数据 了。它适用于多读的应用类型,冲突真的发生比较少的时候就比较好,这样省去了开销的开销,可以提高吞吐量;但如果是真的经常要发生冲突的,那每次还要去判断进行retry,反倒降低的性能,这个时候悲欢锁比较好。数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

  12. 应用层协议有哪些

  13. 什么场景用TCP,什么场景用UDP

  14. HTTP状态码都有哪些,具体说一下

  15. HTTP长连接和短连接

  16. url和uri的区别

  17. 线程和进程的区别

  18. hashmap的实现

  19. hashmap的loadfactory是干嘛的

  20. hashmap的扩容

  21. 为什么每次扩容都是翻倍,增加1.5倍不行吗

  22. 扩容的时候为啥不多扩一点,比如4倍

  23. spark和mapreduce比较 (spark有弹性,高度利用内存,简化代码,DAG写起来可以绕地球两圈,不像mapreduce一次reduce提交一次)

  24. 传统关系型数据库和hdfs比较 (前者轻量级,侧重实时操作;后者重量级,分布式,分而治之化整为零,横向扩展性好)

  25. map join实现?应用场景?两张大表怎么选?(通过广播大变量;一般用在大表join小表,可容忍小表数据冗余的场景;两张大表就分而治之,再sort merge)

  26. 输入网址到返回网页的过程(域名解析,tcp连接建立,数据传输,数据回传,渲染,显示)

  27. sql这块如何(没有注重语法的掌握,表示日后工作用到会熟能生巧,重点学习了理论,索引原理,并发这一块儿)

  28. 海量数据处理成结构化数据 技术难点

  29. mapreduce 的热点问题

  30. flume 介绍

  31. kafka 介绍

  32. flume+kafka 为什么是经典组合

  33. 窗口函数 有哪些 有什么功能

  34. reduce 任务过长 shuffle过长 如何解决

  35. storm和spark最大的区别

  36. Hadoop生态系统中,Hive数据库与Hbase数据库的区别,以及分别适用场景

  37. HDFS数据一致性靠什么保证

  38. HDFS读写流程

  39. MYISAM和InnoDB比较 很有可能继续往下问B+树

  40. 平衡二叉树算法时间复杂度

  41. NP问题 P问题

  42. Hadoop 用的什么发行版型

  43. HA配置中节点信息同步靠什么

  44. 数据如何进行处理的 特别涉及用户隐私 userid字段如何处理

  45. 介绍死锁, 死锁的四个条件

  46. 线程和进程的区别

  47. MR是怎么确定MapTask数量的

  48. HBase底层,rowkey怎么设计的,为什么这么设计

  49. 线程池种类,自己设计线程池,如何避免处理重复任务