算法部分
- 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作业的提交流程
- spark工作流程
- 10、RDD的容错原理和容错机制
- 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