使用Java编写Spark Streaming来做大数据处理(五)

81 篇文章 0 订阅
52 篇文章 2 订阅

本篇围绕spark开发中的优化展开

参考致谢:

https://blog.csdn.net/u012715448/article/details/79457664

https://www.cnblogs.com/itboys/p/9226479.html

九项原则

一、避免重复创建RDD

二、复用同一RDD

三、频繁使用的RDD进行持久化

.persist(StorageLevel.MEMORY_AND_DISK());

记得释放资源

rdd.unpersist();

四、尽量避免shuffle算子

讲这个之前,我们先来聊一聊什么是shuffle。

shuffle描述数据从map task 输出到 reduce task的这段过程
Shuffle 过程本质上都是将 Map 端获得的数据使用分区器进行划分,并将数据发送给对应的 Reducer 的过程。

众所周知,rdd3=rdd1.join(rdd2);join操作会导致shuffle操作
这时候我们可以使用Broadcast将一个数据量小的RDD作为广播变量

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

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

五、使用map-side预聚合的shuffle操作

通关两张图来演示预聚合的含义
groupByKey
在这里插入图片描述
reduceByKey
在这里插入图片描述
通过两个图分别展示 了groupByKey和reduceByKey的大致过程,即groupByKey是先shuffle,后聚合;
所有的键值对都会进行shuffle,这将增加很多无谓的数据进行网络传输。而reduceByKey则使用了预聚合

六、使用高性能的算子

(1)使用mapPartitions 代替map
(2)使用foreachPartitions代替foreach
(3)使用filter之后进行coalesce操作

七、广播变量

八、使用kyro优化序列化性能

spark2.0版本中默认使用

九、优化数据结构

Java中,有三种较为耗费内存

  1. 对象
  2. 字符串
  3. 集合类型

使用中能用简单 类型,不用复杂类型

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值