关于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%的数据会重复
解决方案:
关闭各种推测、重试机制。
设置一张事务表。
待更。。。。。。
大家喜欢多多关注,你的关注是我最大的动力
可以关注我的微信公众号:首席数据师 里面有很多关于大数据的干货
网友评论