Spark面试相关

it2023-05-29  71

Spark

Spark的集中部署方式: local:运行在一台机器上 Standlone:构建一个master+Slaves的资源调度集群 Spark自身的一个调度系统 Yarn:Spark客户端直接连接Yarn。不需要额外构建Spark集群 有yarn-cluster和yarn-client两种模式 Mesos:较少

Spark任务使用Shell脚本提交

Spark提交作业参数:

executor-cores:内核数“2-5个” executor-memory:默认1G driver-cores:默认为1 driver-memory:默认512m

提交任务的样式: spark-submit –master local[5] –driver-cores 2 – driver memory 8G –executor-cores 4 –num-executors 10 –executor-memory 8G –class packageName.ClassNameXXXX.jar –name “spark job name” InputPath OutputPath

Spark 中的血统概念(RDD)

RDD在Lineage依赖方面分为Narrow Dependencies 和Wide Dependicies 用来解决数据容错时的高效性一斤划分任务的时候起到重要作用

例举Spark中的算子:

1.map(返回一个新的RDD) 2.mapPartions(类似于map,独立在RDD的每一个分片中运行) 3.reduceByKey:在一个K/V的RDD上调用 4.aggregateByKey:在kv对的RDD中,按照KEY将value进行分组合并 5.combineByKey:createCombiner: V=>C, mergeValue: (C, V) =>C, mergeCombiners: (C, C) =>C):

例举Spark中的action算子:

1.reduce: 2.collect 3.first: 4.take: 5.aggregate: 6.countByKey: 7.foreach: 8.saveAsTextFile:

例举:Spark在Shuffle过程中算子: reduceByKey; 按照Key进行聚合,在shufle之前有combine预聚合操作,返回结果是:RDD[K,V] groupByKey; 按照key进项分组,直接进行shuffle ByKey;

当Spark涉及到数据库的操作时,如何减少Spark运行中的数据库连接数? 使用foreachPartition代替foreach,在foreachPartition内获取数据库的连接。

Spark中join和left join有什么区别? join类似sql中的inner join【交集】 left join 类似sql的left outer join【前一个RDD为主】 可以使用left semi join替换left join的场景:left semi join【in(keyset)】 避免全表扫描

SparkStreaming有哪几种范式可以消费Kafka中的数据,区别是什么? 1.receiver方式: 使用Kafka的高层次Consumer API来实现的; receiver从Kafka中获取的数据都是存储在Spark Executor的内存中 启用高可用配置防止丢失数据:依靠SpaekStreaming的预写日志机制 【预写日志机制】同步接收Kafka的数据写入分布式文件系统的预写日志中 2.Direct方式: spark1.3引入 周期性的查找Kafka来获取每个Topic+partition的最新的offset, 从而定义每个batch的offset范围; 优点: 简化并行读取:并行读取Kafka 高性能:保证0数据丢失receiver模式中需要开启wal机制,效率较低 kafka本身就有备份的机制 Receiver是使用kafka的高阶API用以在Zookeeper保存消费过 的offset 这是消费Kafka的传统方式,这种方式没法保证数据被处理有且仅有一次; 因为Spark和Zookeeper可能没有同步; Direct:使用的是Kafka的加紧单api,SparkStreaming自己就负责追踪消费的 offset,并保存在checkpoint中;

Repartition和Coalesce关系与区别 关系:都是用来改变RDD的Partition数量,repartition底层调用的就是coalesce方法 区别:repartition一定会发生shuffle,coalease会根据传入参数判断是否发生shuffle

Spark缓存机制和Checkpoint机制: 都是做RDD持久化的, cache:内存,不会截断血缘,使用计算过程中的数据缓存 checkpoint:磁盘,阶段血缘关系

Spark中的共享变量(累加器和广播变量): 累加器:Spark的一种分布式变量机制(类似MR) 用途: 累加器调试过程中对作业执行过程中的时间进行计数 广播变量—高效分发

涉及数据库连接时,如何减少Spark运行中的数据库连接数? 使用foreachPartition代替foreach

RDD,DataFrame,Dataset RDD: 优点: 编译时类型安全 编译时就检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的开销 集群和IO操作都需要对对象的数据和结构进行序列化和反序列化 GC 的性能开销,频繁的创建和销毁

DataFrame Dataframe引入了schema和off-heap DataSet: 结合了RDD和D爱他Frame的优点,并带来一个全新的概念Encoder。 当序列化数据时,Encoder产生的字节码与off-set进行交互能勾搭到按需 访问数据的效果

Spark中实现topN的获取: 方法一: 按照key对数据进行聚合(groupByKey) 将value转化为数组,利用Scala的sortBy或者sortWith进行排序 方法二: 取出所有的key 对key进行迭代,每次去吃一个key利用Spark的排序算子进行排序 方法三: 自定义分区器,按照key进行分区,要使不同的可以进入到不同的分区 对每个分区运用spark的排序算子进行排序

优化:合并小文件(coalesce)减少map的数量,shuffle时join的性能就得到提升

最新回复(0)