大数据面试题整理

算法部分

  • 1、给定一个大文件(即无法一次性加载到内存中,以下的大文件均为该定义),每行代表一个访问IP,统计出现次数最多的IP。
    • 1)逐行读取数据,并将数据映射(如取模)到N个小文件中;
      2)以IP为Key,频率为Value,分别统计每个小文件中每个IP出现的次数;
      3)找出每个小文件中出现次数最多的IP;
      4)对这N个小文件出现次数最多的IP进行排序,得到最终结果。
  • 2、在1的基础上,求出现次数最多的K个IP(top-K问题)
    • 1)、2)与上述一致;
      3)统计出每个小文件中出现次数最多的K个IP;
      4)对这N*K个IP出现的频率进行排序,得到最终结果。
  • 3、给定a、b两个大文件,每行代表一个访问IP,求出a、b中重复的IP
    • 1)将a文件映射到N个小文件中;
      2)b文件执行与a文件一致的映射方法;
      3)现在问题转化为求解N个文件对中的重复IP,可将a文件的每个小文件中的IP通过集合存储,再遍历b文件中的小文件,判断其IP是否在对应的文件中,如在则说明重复。

大数据工具部分

  • 1、spark中的RDD是什么,有什么特性?

    • RDD全称为弹性分布式数据集,是spark中最基础的数据抽象,是一个不可变、可分区、可并行的数据集合。
    • RDD具有五大特性:
      分区列表 RDD的数据存在于一个分区列表中、
      每个分区都有一个计算函数、
      依赖于其他RDD列表 一个RDD依赖于其他的一个或多个RDD、
      如果RDD中存储的数据为Key-Value,则可以按Key对RDD进行重新分区
      数据本地性。
  • 2、概述一下spark中常用的算子
    map、mapPartitions、flatMap、foreach、foreachPartitions、reduceByKey、groupByKey、sortByKey、filter、reduce、collect、take、glom、join、union、repartitions、coalesce
    transform和action的差别?懒惰操作
    (注意对比,如:

    • 1.map与mapPartitions的区别,map是把函数f作用于每一行,而mapPartitions是把函数f作用于每个分区,再将每个分区的元素以迭代器的方式进行遍历;
    • 2.map和flatMap:
      flatMap会做一个扁平化操作
    • 3.map和foreache的区别:有无返回值;
    • 4.reduceByKey和groupByKey:reduceByKey会先在每一个节点上作聚合,这样做有利于减少shuffle时的IO操作,所以应尽量 选用reduceByKey;
    • 5.repartitions和coalesce:是否具有shuffle
  • 3、RDD的依赖关系

    • RDD的依赖分为两类:宽依赖和窄依赖。其区别为,如果一个RDD的父RDD的每一个分区只对应一个子RDD,则为窄依赖(map、filter、mapPartitions、union…);如果一个RDD的父RDD的每一个分区对应多个子RDD,则为宽依赖(reduceByKey、join…)。
      如果依赖关系为窄依赖,当子RDD的某个分区丢了,通过RDD的血统关系找到该分区对应的父RDD分区,然后重新计算这一部分即可恢复丢失的数据;如果依赖关系为宽依赖,当子RDD的某个分区丢了,就需要全部重新计算。
  • 4、spark中的DAG是什么?

    • DAG即有向无环图,spark用DAG来描述RDD之间的依赖关系,这种关系也称为血统(lineage)。使用DAG可以对计算进行优化。
  • 5、spark的stage是如何划分的?

    • spark遇到一个action操作会产生一个job,DAGScheduler会形成对应的DAG,然后按DAG进行stage划分,具体划分方式为:从DAG末端往前回溯,如遇到宽依赖就划分出一个stage。
  • 6、spark中的对应关系?

    • 一个Application(运行一次脚本)中可能存在一个或多个action操作,一个action操作会产生一个job,一个job中遇到一次shuffle会划分一个stage,一个stage对应一个taskset,一个taskset中有多个task,一个stage的最终RDD有多少个分区taskset中就对应多少个task,一个task交由一个Executor执行,一个Executor一次执行一个task。
  • 7、spark内存溢出

    • Driver端内存溢出
      Driver端运行了SparkContext、DAGScheduler、TaskScheduler,当stage划分过多等会消耗过多内存资源,此时可以通过spark.driver.memory来增加Driver内存的申请。
    • map时产生大量的对象
      使用mapPartitions来代替map
    • RDD分区数据不平衡
      如果重新分区不影响计算结果,则可通过repartition重新对数据进行分区,如果数据倾斜是因为某个key数据量过大,则可参考spark优化
  • 8、spark on yarn中,yarn-client和yarn-cluster的区别?

    • yarn可以动态协调不同框架之间的资源使用(将不同的框架的资源管理器统一,如MapReduce与Spark同时跑程序,如果MapReduce任务结束了,则可将其资源重新分配给Spark)
    • yarn-client模式下,Driver运行在提交代码的机器上,main函数的输出结果可以直接通过交互窗口看到,因为要与yarn进行大量通信,所以该模式可能会造成流量激增,仅适合调试使用。
    • yarn-cluster模式下,Driver运行在ApplicationMaster上,该模式下提交完代码即可退出,无交互,适合生产。
  • 9、spark作业的提交流程

  • 10、RDD的容错原理和容错机制

  • 11、spark的共享变量

    • 1 广播broadcast
      • 对于全局变量,如果不是使用广播形式分发,则每个task会收到一份数据,而如果使用广播方式,则每个节点只接收一份数据。
      • 广播变量只能读取,无法修改。
    • 2 累加器
      • 累加器是一个用于全局统计的变量,在executor上只能对累加器进行修改,而无法读取。Driver端可以读取累加器的数值。
  • 12、Driver的作用

    • 每一个spark作业都包括一个Driver进程,用于运行我们提交的main函数。其功能包括创建SparkContext,并负责向集群申请资源、作业的调度等。
  • 13、spark中worker的作用

    • 管理节点的资源并与master进行通信。
  • RDD、DataFrame、DataSet之间的区别?

  • hadoop和spark的shuffle区别?

  • 高可用性?

    • 使用zookeeper
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章