Spark 面试题

Spark 有哪几种运行模式

  1. Local 模式:Local 模式就是运行在一台计算机上的模式,通常用于在本机练手和测试。
  2. Standalone 模式:构建一个 Master + Slave 构成的 Spark 集群,Spark 运行在集群中。
  3. Yarn 模式:Spark 客户端直接连接 Yarn,不需要额外构建 Spark 集群。有 yarn-client 和yarn-cluster 两种模式,主要区别在于:Driver 程序的运行节点。
  • yarn-client:Driver 程序运行在客户端,适用于交互、调试,希望立即看到 app 的输出

  • yarn-cluster:Driver 程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。

  1. Mesos 模式:Spark 客户端直接连接 Mesos,不需要额外构建 Spark集群,国内用得少,了解就好。

Spark 作业提交流程(Yarn 模式为例)

Spark 相关术语

请参见 Spark 相关术语介绍

宽依赖和窄依赖

窄依赖指的是每一个父 RDD 的 Partition 最多被子 RDD 的一个 Partition 使用;宽依赖指的是多个子 RDD 的 Partition 会依赖同一个父 RDD 的 Partition,会引起 shuffle。

RDD 缓存

RDD通过 persist 方法或 cache 方法可以将前面的计算结果缓存,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。
但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

cache 方式调用的是 persist 方法,只是默认设置了存储级别为在内存中存储一份。

CheckPoint 和 persist 的区别

persist 虽然可以将 RDD 的 partition 持久化到磁盘,但该 partition 由 blockManager 管理。一旦 driver program 执行结束,也就是 executor 所在进程 CoarseGrainedExecutorBackend stop,blockManager 也会 stop,被 cache 到磁盘上的 RDD 也会被清空(整个 blockManager 使用的 local 文件夹被删除)。而 checkpoint 将 RDD 持久化到 HDFS 或本地文件夹,如果不被手动 remove 掉,是一直存在的,也就是说可以被下一个 driver program 使用,而 cached RDD 不能被其他 dirver program 使用。

关于 RDD 分区器

目前在 Spark 中只有 Key-Value 类型的 RDD 才有分区器,非 Key-Value 类型的 RDD 默认的分区器是 None。

内置的分区器有两个:

  • Hash 分区:对于给定的key,计算其hashCode,并除以分区的个数取余,如果余数小于0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID。

  • Range 分区:对于给定的key,计算其hashCode,并除以分区的个数取余,如果余数小于0,则用余数+分区的个数(否则加0),最后返回的值就是这个key所属的分区ID。

自定义分区:

要实现自定义的分区器,你需要继承 org.apache.spark.Partitioner 类并实现下面三个方法。
(1)numPartitions:返回创建出来的分区数。
(2)getPartition(key: Any):返回给定键的分区编号(0到numPartitions-1)。
(3)equals():判断相等性的标准方法。这个方法的实现非常重要,Spark 需要用这个方法来检查你的分区器对象是否和其他分区器实例相同,这样 Spark 才可以判断两个 RDD 的分区方式是否相同。

简述 RDD、DataFrame、DataSet 的关系

请参见RDD、DataFrame、DataSet的区别

Spark 中的哪些算子会引起 Shuffle

所以涉及到宽依赖的算子都会引起 Shuffle,具体分为以下几类:

  1. 重分区操作:比如repartition、repartitionAndSortWithinPartitions、coalesce等。
  2. byKey类的操作:比如reduceByKey、groupByKey、sortByKey等。
  3. join类的操作:比如join、cogroup等。

reduceByKey 与 groupByKey 的区别

reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v]。
groupByKey:按照key进行分组,直接进行shuffle。
开发指导:reduceByKey比groupByKey,建议使用。但是需要注意是否会影响业务逻辑。

Repartition 和 Coalesce 关系与区别

  1. 关系:两者都是用来改变 RDD 的 partition 数量的,repartition 底层调用的就是 coalesce 方法 coalesce(numPartitions, shuffle = true)。

  2. 区别:repartition 一定会发生 shuffle,coalesce 根据传入的参数来判断是否发生 shuffle 一般情况下增大 RDD 的 partition 数量使用 repartition,减少 partition 数量时使用coalesce。

点个赞呗:程序员虾说 » Spark 面试题

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

请作者喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏