spark
1.scala闭包?
闭包其实是一个函数,函数的返回值依赖于声明在函数外部变量。
2.scala伴生对象?
在同一个scala源文件中,class与object有同样的名字。
object称为伴生对象,class称为伴生类。它们之间可以相互访问private属性。
3.scala伴生对象apply方法?
在伴生对象中定义apply方法,直接用对象名object就可以调用apply方法,也可以实现构造伴生类的功能。
4.scala中var与val?
var可以多次赋值
5.scala柯里化?
将原来接受两个参数的函数变成接受一个参数的函数过程。
新函数返回一个原来以第二个参数作为参数的函数。
6.scala隐式转化?
在object定义隐式转换方法前加implicit def,在用到隐式转化地方用import引入类.方法,自动调用转化后的方法。
7.scala匹配模式?
match { case1 case2 }
8.scala与java区别?
1)申明变量不同。
2)返回值,scala不用return。
3)通配符,scala_ ,java*。
4)接口,scala为trait继承使用extends,多继承使用with。java为interface继承使用implements多继承用逗号。
9.spark集群运行模式?
1)单节点运行。
2)集群模式。
3)运行在yarn上面。
10.spark中reducebykey与groupbykey区别?
1)都可以进行聚合操作,reducebykey更快适合大数据集。
11.spark中的宽依赖和窄依赖?
宽依赖:一个父RDD分区对应多个子RDD分区。
窄依赖:一个父RDD分区对一个子RDD分区,多个父RDD分区对一个子RDD分区。
12.spark shuffle与hadoop shuffle区别?
1)spark处理任务输出结果放入内存中。hadoop处理任务结果放入磁盘中,需要大量IO操作。
2)hadoop中MR在groupby前对分区key排序。
13.spark产生数据倾斜的原因以及解决方法?
1)计算数据时数据的分散度不够,导致大量的数据集中到集群一台或几台机器上,而集群其它节点空闲会导致整个计算过程慢。
数据倾斜只会发生在shuffle过程中。
2)解决办法?
2.1)提高shuffle操作的并行度。增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。
2.2)使用随机key进行双重聚合。将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解 决单个task处理数据量过多的问题。接着去除掉随机前缀,再次进行全局聚合,就可以得到最终的结果
2.3)过滤少数导致倾斜的key。判断少数几个数据量特别多的key对计算结果不是特别重要,那么可以直接过滤掉那少数的几个key。
14.spark shuffle过程?
当rdd依赖中出现宽依赖的时候就会触发shuffle操作,Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程。
Shuffle描述着数据从map task输出到reduce task输入的这段过程。shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。因为在分布式情况下,reduce task需要跨节点去拉取其它节点上的map task结果。这一过程将会产生网络资源消耗和内存,磁盘IO的消耗。通常shuffle分为两部分:Map阶段的数据准备和Reduce阶段的数据拷贝处理。一般将在map端的Shuffle称之为Shuffle Write,在Reduce端的Shuffle称之为Shuffle Read.
https://www.cnblogs.com/itboys/p/9226479.html
15.spark 物理执行流程?
1.先把spark程序提交给driver,driver负责运行spark程序的main方法,运行完后生成逻辑执行图,然后把逻辑执行图调用Action。
2.DAGScheduler会生成stage并划分成不同阶段,每个阶段对应一个TaskSet。
3.DAGScheduler请求TaskScheduler调度TaskSet,TaskScheduler会询问集群有多少资源,资源返回给TaskScheduler。
4.TaskScheduler把stage调度到executor中执行taskSet,得到结果再发送给driver。