spark 性能调优

来源:互联网 发布:人工智能利与弊演讲ppt 编辑:程序博客网 时间:2024/05/21 10:07
spark 配置文件:
spark 在三个地方进行配置:spark-submit --选项、spark-defaults.conf文件,spark-env.sh文件。
已经配置的参数可以通过http://:4040 上的应用程序web ui查看已经配置的属性,只有已经配置的属性才会显示出来。

spark几个重要概念和术语:出处http://blog.csdn.net/oopsoom/article/details/23857949
1. application
 
用户在spark上构建的程序,包含driver程序和集群上的executors
2. driver program
运行main函数并且创建SparkContext的程序,类似于hadoop的word count的main函数
3. cluster manager
集群资源管理器,在集群上获取资源的外部服务。如:standalone, mesos, yarn
4. worker node
集群中任何一个可以运行spark应用代码的节点。Worker Node 是物理节点,可以在上面启动Executor进程。
5. executor
在每个WorkerNode上为某个应用启动一个进程,负责运行任务,并且负责将数据存在内存或磁盘上,每个人物有各自独立的Executor. Executor是执行Task的容器。是一个应用程序运行的监控和执行容器。它的职责:1. 初始化程序执行的上下文,解决应用程序需要运行时的jar依赖,加载类。2. 有一个ExecutorBackend向cluster manager汇报当前任务状态。
6. job
可以理解为每个action的计算会生成一个job. 用户提交的job会提交给DAGScheduler, job会被分解为stage 和task.
7. stage 
一个job会被拆分为多组task, 每组 task为一个stage. 比如:map stage, reduce stage. Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。比如 rdd.parallize(1 to 10).foreach(println) 这个操作没有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;如果是rdd.map(x => (x, 1)).reduceByKey(_ + _).foreach(println), 这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。如果job中有多次shuffle,那么每个shuffle之前都是一个stage。
8. task
被送到executor上的工作单元,spark上的task分两类:shuffleMapTask,  resultTask
9. partition
计算单位,可以自己定义划分依据。

spark shuffle
转自:http://blog.csdn.net/johnny_lee/article/details/22619585
shuffle 是链接map和reduce之间的桥梁,map的输出要用到reduce中必须经过shuffle这一个环节。shuffle的性能高低直接影响整个程序性能的吞吐量(单位时间内处理的数据量)。shuffle是mapreduce框架里的一个特定的phase。介于map phase 和reduce phase之间。这个过程就是shuffle.  当map输出的结果要被reduce使用,输出结果需要按照key进行哈希,并且分发到每一个reducer上去。这个过程就是shuffle. shuffle 涉及了磁盘的读写和网络的传输,因此其性能高低直接影响到了整个程序的运行效率。




spark 性能优化涉及的问题

1. reduce 任务数量设置不合理。
解决方案:根据实际情况调节默认配置。方式是修改参数spark.default.parallelism。通常,reduce 数目设置为core数目的2到3倍。数量太大的话,造成很多小任务,增加启动任务的开销。数目太少,任务运行缓慢。

2. shuffle磁盘IO时间长
解决方案:设置spark.local.dir为多个磁盘。设置磁盘为IO速度快的磁盘,通过增加IO优化shuffle性能。

3. mapreduce数量大,造成shuffle小文件数目多
解决方案:默认情况下shuffle文件数目为map tasks*reduce tasks。通过设置spark.shuffle.consolidateFiles 为True,来合并shuffle中间文件。此时文件数为reduce tasks 的数目。

0 0
原创粉丝点击