spark开发及调优

本文详细介绍了Spark开发调优的七大原则,包括避免重复RDD、复用RDD、持久化处理、减少shuffle、使用map-side预聚合、优化序列化性能以及解决数据倾斜问题。同时,也阐述了Spark开发环境的准备,包括使用SBT编译、打包Spark任务,以及在IDEA中配置Spark运行环境。此外,还提及了SparkSQL操作Hive的相关内容。
摘要由CSDN通过智能技术生成

一、spark开发调优

1.避免重复RDD

  • 原则一:避免创建重复的RDD
    • 对同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据
    • 极大浪费内存
      在这里插入图片描述
      在这里插入图片描述

2.尽可能复用RDD

  • 原则二:尽可能复用同一个RDD
    • 比如:一个RDD数据格式是key-value,另一个是单独value类型,这两个RDD的value部分完
      全一样,这样可以复用达到减少算子执行次数
      在这里插入图片描述
      在这里插入图片描述

3.多次使用的RDD持久化

  • 原则三:对多次使用的RDD进行持久化处理

    • 每次对一个RDD执行一个算子操作时,都会重新从源头处理计算一遍,计算出那个RDD出来,然后进一步操作,这种方式性能很差
    • 对多次使用的RDD进行持久化,将RDD的数据保存在内存或磁盘中,避免重复劳动
    • 借助cache()和persist()方法
      在这里插入图片描述
      在这里插入图片描述
  • 原则三:对多次使用的RDD进行持久化处理

    • persist持久化级别
      在这里插入图片描述

4.避免shuffle

  • 原则四:避免使用shuffle类算子
    • 在spark作业运行过程中,最消耗性能的地方就是shuffle过程
    • 将分布在集群中多个节点上的同一个key,拉取到同一个节点上,进行聚合和join处理,比如
      groupByKey、reduceByKey、join等算子,都会触发shuffle
      在这里插入图片描述
      在这里插入图片描述
  • Broadcast+map的join操作,不会导致shuffle操作,但前提适合RDD数据量较少时使用

5.map-side预聚合

  • 原则五:使用map-side预聚合的shuffle操作
    • 一定要使用shuffle的,无法用map类算子替代的,那么尽量使用map-site预聚合的算子
    • 思想类似MapReduce中的Combiner
    • 可能的情况下使用reduceByKey或aggregateByKey算子替代groupByKey算子,因为
      reduceByKey或aggregateByKey算子会使用用户自定义的函数对每个节点本地相同的key进行
      预聚合,而groupByKey算子不会预聚合
      在这里插入图片描述
      在这里插入图片描述

6.使用Kryo优化序列化性能

  • 原则六:使用Kryo优化序列化性能
    • Kryo是一个序列化类库,来优化序列化和反序列化性能
    • Spark默认使用Java序列化机制(ObjectOutputStream/ ObjectInputStream API)进行序列化和反序列化
    • Spark支持使用Kryo序列化库,性能比Java序列化库高很多,10倍左右
      在这里插入图片描述

7.数据倾斜解决方案

1、提高shuffle操作的并行度。
2、使用随机数前缀进行Join操作。对key增加随机数。
3、将reduce join转为map join。
4、过滤少数导致数据倾斜的 key。如null值数据。
5、使用hive预处理数据。
6、使用两阶段聚合操作。
7、单独处理倾斜的key
8、rangepartioner+key转换处理

二、spark开发环境准备

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值