今天再来介绍一个小的优化点,是一个通过使用fastutil工具包对数据格式进行优化。首先来明确一个东西,什么是fastutil?
fastutil是一个Java集合框架的扩展,通过实现Java集合的接口,提供了特殊类型的map,list等等。通过使用fastutil可以使得对象占用更小的内存,更快的存取速度;通过这两个特点,我们可以将Spark作业中用的一些map,list等结构替换成fastutil来提高Spark作业的运行效率。fastutil的每一种集合类型,都实现了对应的Java中的标准接口(比如fastutil的map,实现了Java的Map接口),因此可以直接放入已有系统的任何代码中。
明确了fastutil以后,我们来看看其在Spark代码中的应用场景。
1.如果算子函数使用了外部变量;那么第一,你可以使用Broadcast广播变量优化;第二,可以使用Kryo序列化类库,提升序列化性能和效率;第三,如果外部变量是某种比较大的集合,那么可以考虑使用fastutil改写外部变量,首先从源头上就减少内存的占用,通过广播变量进一步减少内存占用,再通过Kryo序列化类库进一步减少内存占用
2.在一些RDD中,出现了要创建一些比较大的map,list等集合,有可能会占用比较大的内存空间;另一方面加上有可能涉及比较耗性能的遍历等操作,这个时候就可以考虑使用fastutil集合类来提高性能。
光说理论没什么卵用,我们来看看项目中到底是怎么使用的(这里结合我的项目,贴出部分代码),代码很简单,如下截图所示。
未使用fastUtil之前
使用fastUtil之后
总结:在项目某些使用了map等集合的地方,如果这个集合较大,就可以考虑采用fastutil代替传统的map等结构,从而提高程序的运行效率。本文到这里基本接近尾声,后续还会不断更新关于Spark作业优化的一些其他方式,欢迎关注。
如需转载,请注明:
作者:z小赵
链接:https://www.jianshu.com/p/a2f1295351e2
共同学习,写下你的评论
评论加载中...
作者其他优质文章