spark调优测试

### Spark调优测试知识点 #### 一、Spark配置与资源管理 在进行Spark调优时,首先需要关注的是Spark的任务资源配置。配置文件`/usr/hdp/current/spark-client/conf/spark-defaults.conf` 和 `spark-env.sh`是关键,它们分别用于定义默认的Spark配置参数和设置环境变量。 - **`spark-defaults.conf`**: 这个文件包含了Spark的各种配置选项,例如任务的并发度、内存分配等。 - **`spark-env.sh`**: 通常用来设置环境变量,比如JVM的垃圾回收策略。 ### 二、任务资源分配 1. **任务并行度**: 通过`SPARK_EXECUTOR_INSTANCES`和`SPARK_EXECUTOR_CORES`来配置。具体来说,总的并行度为`SPARK_EXECUTOR_INSTANCES * SPARK_EXECUTOR_CORES`。 2. **内存分配**: 每个执行器(Executor)和驱动程序(Driver)都需要足够的内存资源。具体的计算公式为:`(SPARK_EXECUTOR_MEMORY + spark.yarn.executor.memoryOverhead) * (SPARK_EXECUTOR_INSTANCES) + (SPARK_DRIVER_MEMORY + spark.yarn.driver.memoryOverhead)`。这里`spark.yarn.executor.memoryOverhead`和`spark.yarn.driver.memoryOverhead`分别是Executor和Driver的额外内存开销,默认为各自内存大小的7.384%。 ### 三、内存管理和垃圾回收 1. **内存管理**: 在Spark中,内存被分为两部分:执行内存和存储内存。默认情况下,60%的内存用于执行,40%用于存储。可以通过调整`spark.storage.memoryFraction`来改变这个比例。 2. **垃圾回收**: 频繁的垃圾回收会严重影响Spark的性能。可以通过以下几种方式来优化: - 设置`-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps`来获取详细的垃圾回收信息。 - 调整垃圾回收策略,例如使用`-XX:+UseConcMarkSweepGC`或`-XX:+UseG1GC`等。 ### 四、数据结构优化 Spark默认使用Java的数据结构,而这些结构的内存消耗相对较高。可以采取以下措施减少内存占用: 1. 使用原生类型(primitive types),替换Java集合类为`fastutil`提供的更高效版本。 2. 减少对象引用的大小,例如使用`-XX:+UseCompressedOops`和`-XX:+UseCompressedStrings`等选项。 3. 使用`scala.collection.immutable`中的不可变集合,以降低GC的压力。 ### 五、数据读取优化 1. **数据分片**: Spark读取HDFS中的数据时,会根据HDFS的分片(split)来进行读取。可以通过调整`mapred.min.split.size`来控制每个分片的大小。 2. **数据格式选择**: 不同的数据格式对I/O效率有不同的影响。Parquet和ORC文件格式提供了更好的压缩率和查询性能。压缩算法如gzip、snappy和lz4也可以显著提高读写速度。 ### 六、广播变量使用 对于大任务中经常使用的只读变量,可以考虑使用广播变量来减少网络传输的成本。通过`SparkContext.broadcast`方法创建广播变量,并在任务中复用这个变量,可以显著提高性能。 ### 七、序列化库的选择 序列化库的选择对性能有着直接的影响。默认情况下,Spark使用Java序列化库,但这通常不是最高效的。通过将`spark.serializer`设置为`org.apache.spark.serializer.KryoSerializer`,可以显著减少序列化的时间和空间成本。 ### 总结 Spark的调优是一个综合性的过程,涉及到资源管理、内存优化、数据处理等多个方面。合理地配置资源分配、选择高效的数据结构和序列化库、优化垃圾回收策略等都是提高Spark应用性能的关键步骤。此外,根据具体的业务场景和数据特征进行针对性的优化也是必不可少的。

























/usr/hdp/current/spark-client/conf/spark-defaults.conf:
/usr/hdp/current/spark-client/conf/spark-env.sh
Spark调优:
【Spark集群并行度】
修改配置:/usr/hdp/current/spark-historyserver/conf/spark-defaults.conf
1.集群task并行度:SPARK_ EXECUTOR_INSTANCES* SPARK_EXECUTOR_CORES;
2.集群内存总量:(executor个数) * (SPARK_EXECUTOR_MEMORY+spark.yarn.executor.memoryOverhead)+(SPARK_DRIVER_MEMORY+spark.yarn.driver.memoryOverhead)。
Spark对Executor和Driver额外添加堆内存大小:
Executor端:由spark.yarn.executor.memoryOverhead设置,默认值executorMemory * 0.07与384的最大值。
Driver端:由spark.yarn.driver.memoryOverhead设置,默认值driverMemory * 0.07与384的最大值。
通过调整上述参数,可以提高集群并行度,让系统同时执行的任务更多,那么对于相同的任务,并行度高了,可以减少轮询次数。举例说明:如果一个stage有100task,并行度为50,那么执行完这次任务,需要轮询两次才能完成,如果并行度为100,那么一次就可以了。
但是在资源相同的情况,并行度高,相应的Executor内存就会减少,所以需要根据实际实况协调内存和core。
【Spark任务数量调整】
Spark的任务数由stage中的起始的所有RDD的partition之和数量决定,所以需要了解每个RDD的partition的计算方法。以Spark应用从HDFS读取数据为例,HadoopRDD的partition切分方法完全继承于MapReduce中的FileInputFormat,具体的partition数量由HDFS的块大小、mapred.min.split.size的大小、文件的压缩方式等多个因素决定,详情需要参见FileInputFormat的代码。
【Spark内存调优】
1. 对象所占内存,优化数据结构
Spark 默认使用Java序列化对象,虽然Java对象的访问速度更快,但其占用的空间通常比其内部的属性数据大2-5倍。参考Spark官方文档(http://spark.apache.org/docs/latest/tuning.html#tuning-data-structures)
(1)使用对象数组以及原始类型(primitive type)数组以替代Java或者Scala集合类(collection class)。fastutil 库为原始数据类型提供了非常方便的集合类,且兼容Java标准类库。
(2)尽可能地避免采用含有指针的嵌套数据结构来保存小对象。

- 深渊的雷坎特2017-11-09冲标题,满分。

- 粉丝: 120
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 2022年C语言概述-中南民族大学.ppt
- 信息电子技术学院网络办公系统.doc
- 教师网络的研修总结与反思-教师网络研修总结1000字(5篇).docx
- 【精品课件】Python的常量和变量.pptx
- UNIT3UNDERSTANDINGIDEASDEVELOPINGIDEAS高一英语上学期课文批注式.docx
- 系统安全设计方案.docx
- 网络技术基础课件.ppt
- Unit6EarthFirstDevelopingideas课件-高中英语(1).pptx
- Module12Unit2Stayawayfromwindowsandheavyfurn.ppt
- 通信公司财务半年工作总结财务工作总结.doc
- 关于昨天今天明天的演讲稿综合网络昨天今天明天演讲稿.doc
- 先进集体组织材料(县通信分公司).doc
- 网络计划技术与网络图绘制.ppt
- 北航网安学院密码学实验代码项目-包含DES加密算法优化ANSI-X917伪随机数生成实现ECC椭圆曲线密码学加速尝试多种密码学协议编程实践实验报告与测试用例-用于2023.zip
- 单片机实习报告.doc
- 2023年c语言二级考试重点和知识点.doc


