spark面试简洁版

Spark的优点和缺点分别是什么?


优点:①基于内存式计算的分布式的统一化的数据分析引擎,处理速度快,
           ②功能全面、性能前列、开发接口多样化、学习成本和开发成本比较低
(实现离线数据批量处理:类似于MapReduce,写代码做处理
实现交互式即时数据查询:类似于Hive、Presto、Impala,使用SQL做即席查询分析
实现实时数据处理:类似于Storm、Flink实现分布式的实时计算
实现机器学习的开发:代替传统一些机器学习工具)
缺点:相比其他的内存式计算引擎,spark的性能比较低,当程序需要shuffle时,性能会比较低

什么是Driver、Executor?

Driver:Spark程序的驱动进程
- 每个Spark程序都包含一个Driver进程
- Driver运行以后会解析代码通过SparkContext来实现Driver功能
- 负责向ClusterManager主节点申请启动Executor
- 负责解析代码构建Task
- 负责调度、分配以及监控Task的运行
Executo:Spark程序的执行进程
- 每个Spark程序都包含一个或者多个Executor进程
- 由Driver向ClusterManager申请启动,ClusterManager会根据资源情况将Executor分配运行在Worker节点上
- 每个Spark应用程序都拥有属于自己的Executor,不同程序的Executor并不共享
- Executor用于运行Task计算任务,并且将计算数据存储在内存或者磁盘中

什么是宽依赖,什么是窄依赖,为什么要设计宽窄依赖?

窄依赖:父RDD的一个分区的数据只给了子RDD的一个分区【不用调用分区器】
特点:一对一或者多对一,不经过Shuffle,性能相对较快,但无法实现全局分区、排序、分组等
宽依赖:父RDD的一个分区的数据给了子RDD的多个分区【需要调用Shuffle的分区器来实现】
特点:一对多,必须经过Shuffle,性能相对较慢,可以实现全局分区、排序、分组等
**问题3:为什么要设计对RDD的关系标记宽窄依赖?**
- **提高数据容错的性能**,避免分区数据丢失时,需要重新构建整个RDD
- 场景:如果子RDD的某个分区的数据丢失
- 不标记:不清楚父RDD与子RDD数据之间的关系,必须重新构建整个父RDD所有数据
- 标记了:父RDD一个分区只对应子RDD的一个分区,按照对应关系恢复父RDD的对应分区即可
- **提高数据转换的性能**,将连续窄依赖操作使用同一个Task都放在内存中直接转换
- 场景:如果RDD需要多个map、flatMap、filter、reduceByKey、sortByKey等算子的转换操作
- 不标记:每个转换不知道会不会经过Shuffle,都使用不同的Task来完成,每个Task的结果要保存到磁盘
- 标记了:多个连续窄依赖算子放在一个Stage中,共用一套Task在内存中完成所有转换,性能更快

RDD的设计概念

RDD是什么?为什么需要RDD?
        弹性 分布式 数据集:类似于Python中的list, 但RDD是分布式的
        本质:就是一个分布式列表,用于将数据划分到不同的分区中存储,每 个分区可以存储在不
        同的节点上,实现分布式存储
        功能:实现分布式数据的存储,用于提供分布式计算,每个分区会由一 个Task进行处理

RDD的五大特性

        特性一:每个RDD都由一系列的分区构成
        特性二:RDD的计算操作本质上是对RDD每个分区的计算
        特性三:每个RDD都会保存与其他RDD之间的依赖关系:血链或者血脉
        特性四:可选的,如果是二元组【KV】类型的RDD,在Shuffle过程中可以 自定义分区器
        特性五:可选的,Spark程序运行时,Task的分配可以指定实现最优路径 解:最优计算位置

RDD算子的分类?


Tranformation算子:转换算子:lazy模式,不会立即执行所以不会触发job的运行,函数返回值固定为RDD类型
Action算子:触发算子:会触发job的运行,返回值为非RDD类型

RDD的算子


构建RDD:parallelize、textfile
转换RDD:map/flatMap/filter/reduceByKey/sortByKey/groupByKey/repartition......
触发RDD:foreach/count/first/take/collect/top/reduce/fold......

RDD的容错机制


什么是Persist?

缓存在内存中,如果内存不足就写入磁盘
rs_rdd.persist(StorageLevel.MEMORY_AND_DISK)
rs_rdd.unpersist(blocking=True)
缓存在内存中,如果内存不足就写入磁盘,缓存2份
rs_rdd.persist(StorageLevel.MEMORY_AND_DISK_2)
场景:高性能
适合:RDD需要多次使用,或者RDD是经过非常复杂的转换过程所构建
不适合:RDD只使用1次而且构建比较简单
思考:缓存的RDD是否会丢失?
缓存的RDD缓存在内存或者磁盘中,内存中RDD丢失的概率存在的
如果RDD在内存中的缓存丢失怎么办?会通过血脉重新构建缓存
什么是Checkpoint?
将RDD**的数据**【不包含RDD依赖关系】存储在HDFS上
# 设置一个检查点目录
sc.setCheckpointDir("../datas/chk/chk1")
# 将RDD的数据持久化存储在HDFS
rs_rdd.checkpoint()

未完待续............

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值