
从 5MB 到 1.6GB 数据:Java/Scala/Python 在 Spark 中的性能表现全解析
arXiv:2510.19012 (cross-list from cs.DC)
***parative analysis of large data processing in Apache Spark using Java, Python and Scala
Ivan Borodii, Illia Fedorovych, Halyna Osukhivska, Diana Velychko, Roman Butsii
***ments: CITI 2025, 3rd International Workshop on ***puter Information Technologies in Industry 4.0, June 11-12, 2025, Ternopil, Ukraine. The article includes 10 pages, 5 figures, 9 tables
Subjects: Distributed, Parallel, and Cluster ***puting (cs.DC); Databases (cs.DB); Programming Languages (cs.PL); Software Engineering (cs.SE)
1. 一段话总结
本研究针对Apache Spark中使用Java、Python、Scala三种编程语言处理大数据的性能展开对比分析,以ETL流程(提取-转换-加载) 为核心,将来自open-meteo(1.6GB 2024年小时气温数据)和simplemaps.***(5MB 47k城市地理数据)的数据集加载到Apache Iceberg表中,在统一硬件(Windows 10、16GB RAM、Ryzen 5 4600H)和软件配置(Spark 3.5.1、Iceberg 1.7.1)下测试执行时间;结果显示Python在中小数据集(world_cities表6.71秒、weather_events表46.34秒)处理中更快,而Scala在复杂多步骤ETL任务(weather_hourly_events表374.42秒)中表现最优(优于Java的379.8秒和Python的398.32秒),最终得出“语言选择需结合数据集规模与任务复杂度,需同时考虑Spark参数与语言执行特性”的结论。
2. 思维导图
3. 详细总结
1. 研究背景与意义
-
研究对象:Apache Spark中Java、Python、Scala三种编程语言的大数据处理性能差异,聚焦ETL全流程(数据提取、转换、加载到Apache Iceberg表)。
-
研究必要性:现有文献多关注单一语言或部分处理阶段,缺乏“统一配置下全周期语言影响”的综合分析;而Spark语言选择会显著影响执行时间、内存消耗、扩展性,尤其大规模数据处理中,几秒延迟可能放大为小时级耗时。
-
核心目标:在相同Spark配置、输入数据集下,对比三种语言的ETL性能,为大数据系统设计提供语言选择依据。
2. 相关工作综述
| 研究者/年份 |
研究内容 |
关键结论 |
| Vergas(2022) |
Spark+Scala环境下,Iceberg vs Delta Lake/Hudi(云存储) |
Iceberg读速最优(比Hudi快20%、比Delta Lake快10-15%),但更新速度仅为Delta Lake的1/2 |
| Ciesielski(2024) |
PySpark+Iceberg处理金融大数据 |
Iceberg通过ACID事务和版本控制,降低数据访问时间,适合需数据完整性的场景 |
| Ahmed(2020) |
Spark vs Hadoop(10节点集群,60TB存储,WordCount/TeraSort) |
Spark性能更优:WordCount快2倍,TeraSort快14倍(Scala实现,原生API兼容) |
| Ketu(2020) |
Spark vs Hadoop(迭代/流处理任务,多语言测试) |
Spark迭代任务快2-10倍(内存计算优势);Scala用于高性能场景,Python用于机器学习集成 |
3. 研究方法
(1)数据集详情
| 数据来源 |
数据内容 |
数据规模 |
核心字段 |
| simplemaps.*** |
全球城市地理信息 |
5MB CSV,47k条 |
City、Lat(纬度)、Lng(经度)、Population、Country_iso2 |
| open-meteo |
2024年全球小时气温数据 |
1.6GB CSV |
Date(时间戳)、Temperature_2m、Lat、Lng |
| 合并后数据 |
城市-小时气温关联数据(ETL目标) |
- |
含气温、地理、人口、国家等综合字段 |
(2)实验环境配置
-
硬件环境:Windows 10 Home(64位)、16GB RAM、AMD Ryzen 5 4600H(3.00GHz)、Radeon Graphics;JVM堆内存约3934MB,支持12核并行任务。
-
软件环境:
- 框架:Apache Spark 3.5.1(分布式处理)、Apache Iceberg 1.7.1(分析型表管理)
- 语言:Java 11.0.14、Scala 2.12.18、Python 3.11
- 开发工具:PyCharm(Python)、IntelliJ IDEA(Java/Scala)
(3)统一Spark配置(保障实验公平性)
| 配置参数 |
描述 |
| master = local[*] |
本地多线程模式,利用所有可用CPU核心 |
| spark.sql.catalog.local.type |
Iceberg目录类型:Hadoop(基于文件系统存储) |
| spark.executor.instances = 5 |
启用5个executor(共6个执行单元) |
| spark.executor.cores = 2 |
每个executor分配2个CPU核心 |
| spark.driver.cores = 2 |
Driver分配2个CPU核心 |
| spark.sql.adaptive.enabled = true |
启用自适应查询执行(优化查询计划) |
| spark.memory.offHeap.enabled = true |
启用堆外内存,减少JVM垃圾回收开销 |
(4)ETL流程设计
-
提取阶段:Spark读取CSV文件,通过
header=true识别表头、inferSchema=true自动推断数据类型(三种语言代码见表7)。
-
转换阶段:
- 数据清洗:
dropDuplicates()移除重复项;to_date()转换时间格式。
- 表关联:用
join()基于Lat/Lng字段合并城市与天气数据,小数据集(城市数据)用broadcast()优化关联速度。
-
加载阶段:数据写入Iceberg表,采用
overwrite模式(保留历史数据)+ overwrite-mode=dynamic(最小化重写批次),三种语言代码见表8。
4. 实验结果
(1)各语言执行时间对比(核心结果)
| Apache Iceberg表名 |
Java(秒) |
Scala(秒) |
Python(秒) |
性能排序 |
| world_cities(小数据集) |
9.62 |
9.13 |
6.71 |
Python > Scala > Java |
| weather_events(中数据集) |
50.56 |
47.72 |
46.34 |
Python > Scala > Java |
| weather_hourly_events(复杂大数据集) |
379.8 |
374.42 |
398.32 |
Scala > Java > Python |
(2)Apache Iceberg存储结构
-
schema组织:按语言分3个独立目录(worldcities_java/scala/python),每个目录含3张表(weather_events、world_cities、weather_hourly_events)。
-
分区策略:
- weather_hourly_events表:按
temperature_dt(日期,一级分区)和country_iso2(国家ISO2,二级分区)分层,子目录嵌套存储(见图3、4)。
-
文件格式:
- 数据文件:Parquet(列存格式,减少IO开销,支持压缩),每个分区目录下含
.parquet数据文件和.parquet.crc校验文件(见图5)。
- 元数据文件:
metadata目录存储表schema、事务历史、版本信息,保障ACID特性。
5. 结论与未来方向
-
核心结论:
- 性能与数据集规模非线性相关:Python适合中小数据集(高-level API高效,JVM开销小);Scala适合复杂ETL(原生Spark语言,优化更充分,比Python快6%)。
- 语言执行特性影响性能:即使配置相同,JVM预热时间、垃圾回收、序列化效率仍导致执行时间差异。
-
未来研究方向:
- 扩展表格式对比:研究Delta Lake、Apache Hudi与Iceberg的性能差异。
- 云原生环境测试:验证不同集群规模、资源分配下的性能稳定性。
- 优化策略迭代:针对不同语言设计定制化Spark配置。
4. 关键问题
问题1:三种编程语言在Apache Spark处理不同规模数据集时的性能差异具体表现如何?造成差异的核心原因是什么?
-
答案:
性能差异随数据集规模变化显著:① 小/中数据集(world_cities、weather_events):Python最快(6.71秒、46.34秒),优于Scala(9.13秒、47.72秒)和Java(9.62秒、50.56秒),原因是Python高-level API简洁,无需JVM启动预热, overhead更低;② 复杂大数据集(weather_hourly_events):Scala最优(374.42秒),优于Java(379.8秒)和Python(398.32秒),原因是Scala是Spark原生语言,支持低-level函数调用,与Catalyst优化器集成更紧密,且避免Python与JVM间的序列化开销(Py4J桥接损耗)。
问题2:本研究中Apache Iceberg的存储设计(如分区、文件格式)对ETL流程性能有哪些关键影响?
-
答案:
Iceberg的存储设计从三方面优化ETL性能:① 分层分区策略:weather_hourly_events表按temperature_dt(日期)+ country_iso2(国家)分区,查询时仅读取目标分区数据(如特定日期+国家),减少IO量;② Parquet列存格式:数据按列存储,ETL转换中仅需加载目标字段(如气温、经纬度),比行存减少50%以上数据传输,且支持高效压缩(降低磁盘占用);③ ACID事务与动态覆盖:通过overwrite-mode=dynamic仅重写更新数据,避免全表重写,同时metadata目录记录版本历史,保障数据一致性,减少重试开销(尤其复杂关联任务)。
问题3:为确保实验结果的公平性与可复现性,本研究在实验环境和Spark配置上做了哪些关键控制?
-
答案:
研究通过“硬件统一、软件版本固定、配置参数一致”保障公平性:① 硬件环境统一:固定使用Windows 10、16GB RAM、AMD Ryzen 5 4600H处理器,JVM堆内存3934MB,12核并行任务,避免硬件差异影响;② 软件版本固定:Spark 3.5.1、Iceberg 1.7.1、Java 11、Scala 2.12.18、Python 3.11,排除版本兼容性导致的性能波动;③ Spark参数一致:所有语言共享相同配置(如master=local[*]、5个executor、自适应查询启用、堆外内存开启),且ETL流程(读CSV、转换、写Iceberg)的逻辑完全一致(仅语言语法差异),确保性能差异仅源于语言特性。
总结
这篇论文没有讲复杂的理论,而是用 “接地气” 的实验解决了大数据开发的实际痛点 ——Spark 语言选型。它的价值不在于提出新算法,而在于用统一、可复现的实验,把 “经验之谈” 变成了 “数据结论”:小 / 中数据集选 Python(兼顾效率和性能),复杂大数据集选 Scala(性能最优),Java 可作为稳定备选。对于需要优化 Spark ETL 性能的开发者来说,这篇论文的结论直接能用,是一篇 “实用型” 的研究。