前言

博主目前也是小白一名,目前只能写出简单的调优和调试的技能。
更多查看官网:
http://spark.apache.org/docs/latest/tuning.html

1. 使用SparkConf配置Spark

在Python文件中配置:

# 创建一个conf对象
conf = new SparkConf()
conf.set("spark.app.name", "My app)
conf.set("spark.master", "local[4]")
conf.set("spark.ui.port", "36000") # 重载默认端口配置

sc = SparkContext(conf)

更多的配置,可是使用 conf.set() 进行设置。

使用默认文件配置:
配置文件: my-config.conf

bin/spark-submit  \
--class com.example.MyApp  \
--properties-file my-config.conf  \
myApp.jar

在运行时使用标记设置配置:

bin/spark-submit  \
--class com.example.MyApp  \
--master local[4]  \
--name "My App"  \
--conf spark.ui.port=36000  \
myApp.jar

更多参考官网:http://spark.apache.org/docs/latest/configuration.html

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

输入文件:input.txt

## input.txt ##
INFO This is a message
INFO This is some other content

INFO Here are some messages
WARN This is a warning

ERROR Something bad happened
WARN More details on the bad thing
INFO back to normal messages

测试代码:

input = sc.textFile("./m/input.txt")
tokenized = input.map(lambda line: line.split(" ")).filter(lambda words: len(words)>1)
counts = tokenized.map(lambda words: (words[0],1)).reduceByKey(lambda x,y: x+y)
counts.collect()

08-Spark调优与调试
使用toDebugString() 查看RDD:
08-Spark调优与调试
上图展示的是RDD的谱系,即 input 和 counts 这两个节点的有向无环图。如,collect()等行为操作,都是根据这个谱系图进行计算的。
上面例子中,包含两个行为操作:
Web查看地址,浏览器输入:http://master:4040
下图为该列的整体谱系:
08-Spark调优与调试
下图为 reduceByKey() 的执行谱系:
08-Spark调优与调试
下图为 counts.collect() 的执行谱系:
08-Spark调优与调试
如果,再次执行 counts.collect() ,并不会从头计算,因为,上一次计算的结果已经被缓存:
08-Spark调优与调试

3. Web页面简介

  • http://master:4040/jobs
    08-Spark调优与调试
    这里可以看到那些RDD执行行为操作,和执行时间、是否成功等。

  • http://master:4040/storage/
    08-Spark调优与调试
    如果RDD执行了cache() 或者 persist() 操作,可以在该界面看到(经过博主测试,执行完counts.cache()后,并不会立即缓存,而是等待下一次执行如collect()的行为操作后才会缓存(即web页面才能看到))。
    其他界面也有很重要的作用,如果在执行任务时,出现执行失败,或者执行时间过长等可以在这里详细的排查。

  • http://master:8080/
    08-Spark调优与调试
    该页面针对Spark集群,可以看到集群的整体、各个工作节点的信息、工作情况等。

3. 并行度

每个 RDD 都会被分为 n 个分区,如果执行任务时,该 RDD 会被划分为 n 个task交由工作节点处理。
分区数并不是任何时候都越大越好,下面进行分区数情况的示例:
08-Spark调优与调试
如上图,data由spark默认分配了10个分区,而 a 通过data 筛选了部分数据,由于data是a的父RDD,所以a具有和data相同的分区数。但此时,由于a的元素可能远远小于了data,所以默认的分区数并不一定时候现在的a。
因此,可以通过 coalesce() 函数重新设置 a 的分区数,依次实现Spark的调优。

4. 序列化格式

当Spark需要通过网络传输数据,或是将数据溢写到磁盘上时,Spark需要把数据序列化为二进制格式。默认情况下,Spark会使用Java内建的序列化库。但是,更加推荐使用第三方库 Kryo,该序列化格式拥有比java序列化格式更短的序列化时间和压缩比。

5. 硬件供给

前面的博客提到过,Spark支持将数据缓存,并且支持内存缓存、和磁盘缓存。
当内存空间不足时,缓存到磁盘会比重新计算更加具有优势。
通过,在spark-env.sh的SPARK_LOCAL_DIRS参数设置缓存目录:
博主设置spark-2.0.2/tmp 为缓存目录(注:将spark-env.sh.template 复制即可,每个节点都需要进行配置,如博主的slave1、slave2、slave3
08-Spark调优与调试
当在执行Spark应用的过程中,该目录会生成一些文件,如:
08-Spark调优与调试
博主也是小白一名,如果有文中有不好之处、错误之处请见谅。

Spark调优官网:http://spark.apache.org/docs/latest/tuning.html

完!

相关文章:

  • 2021-12-22
  • 2021-12-19
猜你喜欢
  • 2021-11-13
  • 2021-09-14
  • 2021-12-04
  • 2021-12-17
  • 2021-05-13
  • 2021-12-13
相关资源
相似解决方案