10. Spark 的数据本地性有哪几种?
Spark 中的数据本地性有三种:
1)PROCESS_LOCAL 是指读取缓存在本地节点的数据
2)NODE_LOCAL 是指读取本地节点硬盘数据
3)ANY 是指读取非本地节点数据
通 常 读 取 数 据 PROCESS_LOCAL>NODE_LOCAL>ANY , 尽 量 使 数 据 以 PROCESS_LOCAL 或
NODE_LOCAL 方式读取。其中 PROCESS_LOCAL 还和 cache 有关,如果 RDD 经常用的话将该 RDD
cache 到内存中,注意,由于 cache 是 lazy 的,所以必须通过一个 action 的触发,才能真
正的将该 RDD cache 到内存中。
11. Spark 为什么要持久化,一般什么场景下要进行 persist
操作?
为什么要进行持久化?
spark 所有复杂一点的算法都会有 persist 身影,spark 默认数据放在内存,spark 很多内
容都是放在内存的,非常适合高速迭代,1000 个步骤只有第一个输入数据,中间不产生临
时数据,但分布式系统风险很高,所以容易出错,就要容错,rdd 出错或者分片可以根据血
统算出来,如果没有对父 rdd 进行 persist 或者 cache 的化,就需要重头做。
以下场景会使用 persist
1)某个步骤计算非常耗时,需要进行 persist 持久化
2)计算链条非常长,重新恢复要算很多步骤,很好使,persist
3)checkpoint 所在的 rdd 要持久化 persist。checkpoint 前,要持久化,写个 rdd.cache
或者 rdd.persist,将结果保存起来,再写 checkpoint 操作,这样执行起来会非常快,不
需要重新计算 rdd 链条了。checkpoint 之前一定会进行 persist。
4)shuffle 之后要 persist,shuffle 要进性网络传输,风险很大,数据丢失重来,恢复
代价很大
5)shuffle 之前进行 persist,框架默认将数据持久化到磁盘,这个是框架自动做的。
12. 介绍一下 join 操作优化经验?
join 其实常见的就分为两类: map-side join 和 reduce-side join。当大表和小表 join
时,用 map-side join 能显著提高效率。将多份数据进行关联是数据处理过程中非常普遍的
用法,不过在分布式计算系统中,这个问题往往会变的非常麻烦,因为框架提供的 join 操
作一般会将所有数据根据 key 发送到所有的 reduce 分区中去,也就是 shuffle 的过程。
造 成 大 量 的 网 络 以 及 磁 盘 IO 消 耗 , 运 行 效 率 极 其 低 下 , 这 个 过 程 一 般 被 称 为
reduce-side-join。如果其中有张表较小的话,我们则可以自己实现在 map 端实现数据关