6、Spark性能优化

spark最大的有点也是它最大的问题-----基于内存的计算模型
1、使用高性能序列化类库
Kryo类库序列化,比java的Serializable占用空间更小,通常比Java序列化的小10倍。
使用方法:SparkConf().set(“spark.serializer”,“org.apache.spark.serializer.KryoSerializer”)即可
2、优化数据结构
优先使用数组以及字符串而不是集合类
避免多层嵌套的结构
通常情况下,会将HashMap,List这种数据统一用String拼接成特殊格式的字符串
3、对多次使用的RDD进行持久化
4、使用序列化的持久化级别
5、java虚拟机垃圾回收机制
6、提高并行度
7、广播共享数据
例如在大表join小表,可以将小表通过broadcast广播出去
8、数据本地化
9、reduceByKey和groupByKey的合理使用,reducebykey会在map端先进行你自定义的function操作,可以减少IO,reduceByKey优先级更高
10、Shuffle调优
11、数据倾斜的处理 缓解/消除:
一、避免数据源的数据倾斜
①尽量避免数据源的数据倾斜,比如数据源是kafka,相关的topic和各parition之间的数据是否平衡,直接决定Spark处理该数据时是否会产生数据倾斜
②例如数据源是hive,而Hive表中的数据本身很不均匀,可以先对hive的源表进行预处理。这种思路是将数据倾斜提前到了hive的etl中,这种可以设置每天例如凌晨去执行一次然后每次再spark作业美团.点评的交互式用户行为分析系统使用了这种方案
二、调整并行度,分散同一个Task的不同Key
在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数设置的shuffle read task的数量,对于Spark sql中的shuffle类的语句。可以设置spark.sql.shuffle.partitions,默认值是200,对于很多场景来说有点小
三、两阶段聚合
将原本相同的key通过附加随机前缀的方式变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解决单个task处理数据量过多的问题,接着去掉随机前缀再进行全局聚合,仅仅适用于聚合类的shuffle操作
四、自定义partitioner
使用自定义的partitioner替换掉默认的hashpartitioner
优点:不影响原有的并行度设计,因为如果改变并行度后续stage的并行度也会默认改变,可能影响stage
缺点:只能将不同key分散开,但是对于同一key对应数据集非常大的场景不适用,而且需要根据数据特点自定义partitioner不够灵活
五、将reduce side join 转变为 map side join
在对RDD进行join或者spark sql join,如果一个rdd或者表的数据量不大,比如几百M或者1-2G
不使用join而是使用BroadCast变量与mao类算子实现join,这样可以避免shuffle操作。将较小RDD的数据通过collect算子拉取到Driver端的内存中,然后对其创建一个BradoCast变量
优点:效果很好
缺点:因为我们将小表广播出去,比较消耗内存资源,driver和每个executor内存中都会驻留一份小表的全量数据。因此只适合一大一小

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark SQL性能优化是提高Spark SQL查询速度和效率的关键。下面是一些建议和技巧: 1. 数据分区和分桶:通过合理的数据分区和分桶,可以减少数据倾斜和提高查询性能。使用合适的列进行分区和分桶,可以使查询只针对特定的数据子集进行操作。 2. 数据压缩:使用适当的数据压缩方式可以减少数据存储和传输的成本,并提高查询性能。Spark SQL支持多种压缩格式,如Snappy、Gzip等。 3. 合理设置资源:根据集群规模和任务需求,合理设置Spark SQL的资源配置。包括executor内存、executor核数、并行度等参数的调整,可以根据具体情况进行优化。 4. 数据倾斜处理:数据倾斜是指某些数据分区的大小远远超过其他分区,导致任务执行时间变长。可以采用一些技术手段来解决数据倾斜问题,如使用随机前缀、增加分区、使用广播变量等。 5. 使用合适的数据格式:选择适合查询需求的数据格式可以提高查询性能。例如,Parquet格式支持谓词下推和列式存储,可以减少IO和提高查询速度。 6. 缓存和持久化:对于经常被重复查询的数据,可以使用Spark的缓存和持久化机制,将数据存储在内存或磁盘上,避免多次计算和IO操作。 7. SQL优化:优化SQL查询语句,包括选择合适的连接方式、使用合适的索引、避免不必要的数据转换和计算等。 8. 资源监控和调优:通过Spark监控工具,如Spark UI、Ganglia等,可以实时监控任务的资源使用情况,及时发现和解决性能瓶颈。 综上所述,通过合理的数据分区和分桶、数据压缩、资源配置、数据倾斜处理、数据格式选择、缓存和持久化、SQL优化以及资源监控和调优等手段,可以有效提高Spark SQL的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值