fastutil简介
fastutil 是扩展了java 标准集合框架(Map、List、Set;HashMap、ArrayList、HashSet)的类库,提供了特殊类型的map、set、list和queue;
fastutil能提供共更小的内存占用,更快的获取速度;我们使用fastutil提供的集合类,来替代自己平时使用的JDK原生的Map、List、Set好处在于,fastutil集合类,可以减少内存占用,并且在进行集合的遍历、根据索引或者(key)获取元素的值和设置元素的值的时候,提供更快的存取速度;
fastutil也提供了64位的array、set和list 以及高性能快速的,以及实用的IO类,来处理二进制和文本类型的文件;
fastutil版本要求jdk1.7以及以上
fastutil的每一种集合类型,都实现了对应java中标准接口,比如fastutil的map,实现了Java的map接口,因此可以直接放入已有系统的任何代码中。fastutil还提供了一些JDK标准类库中没有的额外功能(如双向迭代器)
fastutil除了对象和原始类型为元素的集合,fastutil也提供引用类型的支持,但是对于引用类型是使用等于号=进行比较的,而不是equals()方法
fastutil尽量提供了在任何场景下都是速度最快的集合类库
Spark中应用fastutil的场景
一、算子函数使用了外部变量
那么
第一,可以使用Broadcast广播变量优化;
第二,可以使用Kryo序列化类库,提升序列化性能和效率;
第三,如果外部变量是某大众比较大的集合,可以考虑使用fastutil改写外部变量
从源头上就可以减少内存占用,通过广播变量进一步减少内存占用,再通过kryo序列化类库进一步减少内存占用
在算子函数里,也就是task要执行的计算逻辑里面
如果计算逻辑中,需要创建比较大的Map、List集合等,可能会占用比较大的内存空间,而且可能涉及到消耗性能的遍历、存取等集合操作;那么此时,可以考虑将这些集合类型使用fastutil类库重写,使用fastutil结合类以后,就可以在一定程度上,减少task创建出来的集合类型内存占用;避免executor内存频繁占满,频繁唤起GC,导致性能下降。
fastutil调优的说明
fastutil其实没有你想象中的那么强大,也不会跟官网上说的效果那么一鸣惊人。广播变量、Kryo序列化类库、fastutil,都是之前所说的,对于性能来说,类似于一种调味品,烤鸡,本来就很好吃了,然后加了一点特质的孜然麻辣粉调料,就更加好吃了一点。
分配资源、并行度、RDD架构与持久化,这三个就是烤鸡;broadcast、kryo、fastutil,类似于调料。
比如说,你的spark作业,经过之前一些调优以后,大概30分钟运行完,现在加上broadcast、kryo、fastutil,也许就是优化到29分钟运行完、或者更好一点,也许就是28分钟、25分钟。
shuffle调优,15分钟;groupByKey用reduceByKey改写,执行本地聚合,也许10分钟;跟公司申请更多的资源,比如资源更大的YARN队列,1分钟。
fastutil如何使用
第一步
在pom. 中引用fastutil的包
<dependency>
<groupId>fastutil</groupId>
<artifactId>fastutil</artifactId>
<version>5.0.9</version>
</dependency>
List => IntList
基本都是类似于IntList的格式,前缀就是集合的元素类型;特殊的就是Map,Int2IntMap,代表了key-value映射的元素类型。除此之外,刚才也看到了,还支持 、reference。
继续阅读与本文标签相同的文章
一位工作10年程序员老司机总结的忠告
腾讯WeTest工具PerfDog面向全球发布
-
关注盲人群体 美团推出语音点外卖应用
2026-05-19栏目: 教程
-
卡特马克让制造走向“智造”,百年厨具品牌走向智能化
2026-05-19栏目: 教程
-
拼多多盘初涨逾2%,回应腾讯退出母公司股东行列为正常变化
2026-05-19栏目: 教程
-
Android 10在用户权限方面有何调整?现在真的更安全了吗?
2026-05-19栏目: 教程
-
Alex Kipman:视网膜投影技术将成为AR眼镜最佳代替方案
2026-05-19栏目: 教程
