(8)Spark调优与调试

8.1 使用SparkConf配置Spark

Spark中最主要的配置机制是用过SparkConf类对Spark进行配置,当创建出一个SparkContext时,就需要创建出一个SparkConf的实例。

在Python中使用SparkConf创建一个应用

#创建一个conf对象
conf = new SparkConf()
conf.set("spark.app.name", "My Spark App"0
conf.set("spark.master", "local[4]")
conf.set("spark.ui.port", "36000")

#使用这个配置对象创建一个SparkContext
sc = SparkContext(conf)

Spark中的每个配置选项都是基于字符串形式的键值对。要使用创建出来的SparkConf对象,可以调用set方法来添加配置项设置,然后把这个对象传给SparkContext的构造方法。

 

8.2 Spark执行的组成部分:作业、任务和步骤

Spark执行时有下面所列的这些流程:

  • 用户代码定义RDD的有向无环图:RDD上的操作会创建出新的RDD,并引用他们的父节点,这样就创建出了一个图。
  • 行动操作吧有向无环图强制转译为执行计划:当你调用RDD的一个行动操作时,这个RDD就必须倍计算出来,这也要求计算出该RDD的父节点。Spark调度器提交一个作业来计算所有必要的RDD。这个作业会包含一个或多个步骤,每个步骤其实也就是一波并行执行的计算任务。一个步骤对应有向无环图中的一个或多个RDD,一个步骤对应多个RDD是因为发生了流水线执行。
  • 任务于急群众调度并执行:步骤是按顺序处理的,任务则独立地启动来计算出RDD的一部分。一旦作业的最后一个步骤结束,一个行动操作也就执行完毕。

 

8.3 查找信息

Spark在应用执行时记录详细的进度信息和性能指标,这些内容可以在两个地方看到:Spark的网页用户界面以及启动器进程和执行器进程生成的日志文件中。

8.3.1 Spark网页用户界面

默认情况下,它会在驱动器程序所在机器的4040端口上。

8.3.2 驱动器进程和执行器进程的日志

 

8.4 关键性能考量

8.4.1 并行度

RDD在物理执行期间,会被分为一系列的分区,每个分区都是整个数据集的子集。当Spark调度并运行任务时,Spark会为每个分区中的数据创建一个任务。该任务在默认情况下会需要集群中的一个计算核心来执行。Spark也会针对RDD直接自动推断出合适的并行度,这对大多数用例来说已经足够了。输入RDD一般会根据其底层的存储系统选择并行度。

并行度会从两个方面影响程序的性能:

  1. 当并行度过低时,Spark集群会出现资源闲置的情况;
  2. 当并行度过高时,每个分区产生的间接开销累积起来就会更大

Spark提供了两种方法来对并行度进行调优:

  1. 在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度;
  2. 对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数。

8.4.2 序列化格式

当Spark需要通过网络传输数据,或者将数据溢写到磁盘上时,Spark需要把数据序列化为二进制格式。序列化会在数据进行混洗操作时发生,此时有可能需要通过网络传输大量数据。

8.4.3 内存管理

 

posted @ 2017-01-25 16:56  cyoutetsu  阅读(195)  评论(0编辑  收藏  举报