揭秘Spark应用性能调优

引言:在多台机器上分布数据以及处理数据是Spark的核心能力,即我们所说的大规模的数据集处理。为了充分利用Spark特性,应该考虑一些调优技术。本文每一小节都是关于调优技术的,并给出了如何实现调优的必要步骤。
本文选自《Spark GraphX实战》。

创新互联网络公司拥有10年的成都网站开发建设经验,近1000家客户的共同信赖。提供成都网站制作、网站建设、网站开发、网站定制、卖链接、建网站、网站搭建、响应式网站建设、网页设计师打造企业风格,提供周到的售前咨询和贴心的售后服务

1 用缓存和持久化来加速 Spark

我们知道Spark 可以通过 RDD 实现计算链的原理 :转换函数包含在 RDD 链中,但仅在调用 action 函数后才会触发实际的求值过程,执行分布式运算,返回运算结果。要是在 同一 RDD 上重复调用 action 会发生什么?

RDD 持久化

一般 RDD 不会保留运算结果,如果再次调用 action 函数,整个 RDD 链会重新 运算。有些情况下这不会有问题,但是对于许多机器学习任务和图处理任务,这就 是很大的问题了。通常需要多次迭代的算法,在同一个 RDD 上执行很多次,反复 地重新加载数据和重新计算会导致时间浪费。更糟糕的是,这些算法通常需要很长 的 RDD 链。
  看来我们需要另一种方式来充分利用集群可用内存来保存 RDD 的运算结果。 这就是 Spark 缓存(缓存也是 Spark 支持的一种持久化类型)。
  要在内存中缓存一个 RDD,可以调用 RDD 对象的 cache 函数。以下在 spark- shell 中执行的代码,会计算文件的总行数,输出文件内容 :

val filename = "..."val rdd1 = sc.textFile(filename).cacherdd1.countrdd1.collect

如果不调用 cache 函数,当 count 和 collect 这两个 action 函数被调用时, 会导致执行从存储系统中读文件两次。调用了 cache 函数,第一个 action 函数(count 函数)会把它的运算结果保留在内存中,在执行第二个 action 函数(collection 函数)时,会直接在使用缓存的数据上继续运算,而不需要重新计算整个 RDD 链。 即使通过转换缓存的 RDD,生成新的 RDD,缓存的数据仍然可用。下面的代码会找出所有的注释行(以 # 开始的行数据)。

val rdd2 =rdd1.filter(_.startsWith("#"))
rdd2.collect

因为 rdd2 源于已缓存的 rdd1,rdd1 已经把它的运算结果缓存在内存中了, 所以 rdd2 也就不需要重新从存储系统中读取数据。

注意:cache 方法作为一个标志表示 RDD 应当缓存,但并不是立即缓存。 缓存发生在当前 RDD 在下一次要被计算的时候。

持久化等级

如上所述,缓存是其中一种持久化类型。下表列出了 Spark 支持的所有持久 化等级。
        揭秘Spark应用性能调优
  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       揭秘Spark应用性能调优


本文标题:揭秘Spark应用性能调优
分享路径:http://scyanting.com/article/psopjj.html