关于RDD算子的问题:
1、如果Application中只有一个action类算子,那么有没有必要使用控制类算子?
没有,因为一个action类算子对应一个job,没必要往内存或磁盘中写。
2、如果持久化的级别是MEMORY_ONLY(CACHE),如果内存不足会不会出现OOM?
不会出现,能存多少就存多少,不会报错。存不下的就不存了,等需要的时候会根据依赖关系重新计算。
3、如果持久化的级别是MEMORY_AND_DISK,会不会将一个partition的数据一部分存储到内存一部分在磁盘?
不会,因为存储单元是partition,不容分割。
Stage中的一些问题:
1、stage中每一个task(管道计算模式)在什么时候落地磁盘?
-
如果是stage后面是action类算子:
collect:将每一个管道的计算结果收集到Driver端的内存中。
saveAsTextFile:将每一个管道的计算结果写到指定记录。
count:将管道的计算结果统计记录数,返回给Driver。 -
如果是stage后面是stage:
在shuffle write阶段会写磁盘,目的是为了防止reduce task拉取数据失败。倘若不写入磁盘,一旦拉取失败会重新向Map端拉取数据,会重新shuffle,写入磁盘,直接在磁盘拉取就可以。
2、spark在计算的过程中,是不是非常消耗内存?
不是,因为stage的计算模式是管道计算模式。
3、什么场景下最耗内存?
控制类算子,cache
4、解释一下如果管道中有cache逻辑,他是如何缓存数据的?
会复制一份相同的数据进行缓存。
5、RDD弹性分布式数据集,为什么不能存储数据,还依然叫数据集?
虽然RDD是逻辑上的概念,但是RDD具有管理数据的能力,也可说RDD所映射的数据。
推测执行相关问题:
1、如果1T数据,单机运行30分钟就能执行完毕,但是使用spark来计算(4个节点),需要2小时,为什么?
原因:
1)计算发生了数据倾斜(大量的数据给了少量的task,少量的数据给了大量的task);
2)开启了推测执行机制,会复制多份挣扎task。
2、对于ETL(Extract Transform Load)类型的业务,开启推测执行,重试机制,对于最终的结果会不会有影响?
会有影响。最终数据库中会有重复的数据。比如,当task执行到90%的时候发生了错误,开启重试机制,那么这90%的数据会重复
解决方案:
- 关闭各种推测、重试机制。
- 设置一张事务表。
Spark HA:
1、Maser的主备切换过程中需要做哪些工作?
大致工作是Master将元数据同步至zookeeper文件系统中,Master挂掉,zookeeper选举备用Master接管工作,然后Master去zookeeper拉取元数据,基于拉来的数据,备用Master去通知worker易主,此后备用Master接收worker心跳。
2、Master主备切换的过程,能否提供一个新的Application到集群中运行?
不能,因为主Master已经挂掉,切换过程中,备用Master处于正在恢复状态,不能接受客户端的请求。
3、如果有一个Application已经在集群中运行,那么主备切换过程中对这个正在运行的Application有没有影响?
没有影响,因为Spark是粗粒度的资源调度,任务在运行前已经找Master申请好资源了。