Spark面试相关

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的性能就得到提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值