從 5MB 到 1.6GB 數據:Java/Scala/Python 在 Spark 中的性能表現全解析
arXiv:2510.19012 (cross-list from cs.DC)
Comparative analysis of large data processing in Apache Spark using Java, Python and Scala
Ivan Borodii, Illia Fedorovych, Halyna Osukhivska, Diana Velychko, Roman Butsii
Comments: CITI 2025, 3rd International Workshop on Computer 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 Computing (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.com(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.com
|
全球城市地理信息
|
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 性能的開發者來説,這篇論文的結論直接能用,是一篇 “實用型” 的研究。