spark结合mysql性能优化_[Spark]Spark优化笔记

开发原则Broadcast与map结合使用 替代原始 join小表 broadcast 到每个excutor, 各个excutor本地直接调用小表,避免shuffle// 传统的join操作会导致shuffle操作。// 因为两个RDD中,相同的key都需要通过网络拉取到一个节点上,由一个task进行join操作。val rdd3 = rdd1.join(rdd2)// Broadcast+ma...
摘要由CSDN通过智能技术生成

开发原则

Broadcast与map结合使用 替代原始 join

小表 broadcast 到每个excutor, 各个excutor本地直接调用小表,避免shuffle

// 传统的join操作会导致shuffle操作。

// 因为两个RDD中,相同的key都需要通过网络拉取到一个节点上,由一个task进行join操作。

val rdd3 = rdd1.join(rdd2)

// Broadcast+map的join操作,不会导致shuffle操作。

// 使用Broadcast将一个数据量较小的RDD作为广播变量。

val rdd2Data = rdd2.collect() val rdd2DataBroadcast = sc.broadcast(rdd2Data)

// 在rdd1.map算子中,可以从rdd2DataBroadcast中,获取rdd2的所有数据。

// 然后进行遍历,如果发现rdd2中某条数据的key与rdd1的当前数据的key是相同的,那么就判定可以进行join。

// 此时就可以根据自己需要的方式,将rdd1当前数据与rdd2中可以连接的数据,拼接在一起(String或Tuple)。

val rdd3 = rdd1.map(rdd2DataBroadcast...)

// 注意,以上操作,建议仅仅在rdd2的数据量比较少(比如几百M,或者一两G)的情况下使用。

// 因为每个Executor的内存中,都会驻留一份rdd2的全量数据。

尽量使用map-side预聚合的算子

所谓的map-side预聚合,说的是在每个节点本地对相同的key进行一次聚合操作,类似于MapReduce中的本地combiner。

如使用reduceByKey或aggregateByKey 代替groupByKey

使用foreachPartitions替代foreach

一次函数调用处理一个partition的所有数据,而不是一次函数调用处理一条数据。如在foreach函数中,将RDD中所有数据写MySQL,那么如果是普通的foreach算子,就会一条数据一条数据地写,每次函数调用可能就会创建一个数据库连接,此时就势必会频繁地创建和销毁数据库连接,性能是非常低下;但是如果用foreachPartitions算子一次性处理一个partition的数据,那么对于每个partition,只要创建一个数据库连接即可,然后执行批量插入操作,此时性能是比较高的。实践中发现,对于1万

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值