解決Spark4.0.0依賴問題

Apache Spark 4.0.0 沖突解決指南

1. 問題背景

在嘗試運行一個基于 Apache Spark 4.0.0 的 Java 應用程序。根據 Spark 4.0.0 的發布說明,該版本默認支持 Scala 2.13 和 JDK 17。在初始設置和運行過程中,遇到了以下主要問題:

  • 依賴沖突 (POM 問題):Maven 項目的 pom.xml 配置不當,導致依賴解析失敗。
  • Java 版本不兼容:盡管 pom.xml 中指定了 JDK 17,但系統默認的 Java 版本 (JDK 21/23) 導致運行時錯誤,包括 java.lang.UnsupportedOperationException: getSubject is supported only if a security manager is allowed
  • Servlet API 兼容性問題:運行應用程序時出現 java.lang.NoClassDefFoundError: jakarta/servlet/SingleThreadModel 錯誤。這是由于 Spark 4.0.0 內部使用了在較新 Servlet API 版本中已棄用或移除的類。

2. 解決方案

為解決上述問題,我們采取了一系列配置和調整措施。

2.1 pom.xml 配置調整

針對依賴和 Java 版本兼容性問題,對 pom.xml 進行了以下關鍵修改:

  • 指定 Java 版本: 確保 Maven 項目使用 JDK 17 進行編譯和運行。

    <!-- ... existing code ... -->
    <properties><java.version>17</java.version><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.target>${java.version}</maven.compiler.target><spark.version>4.0.0</spark.version><scala.compat.version>2.13</scala.compat.version>
    </properties>
    <!-- ... existing code ... -->
    
  • 添加 Spark Core 和 Spark SQL 依賴: 確保 Spark 核心庫和 SQL 模塊正確引入,并設置為 provided 范圍,避免與應用程序的其他依賴沖突。

    <!-- ... existing code ... -->
    <dependencies><!-- ... existing dependencies ... --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_${scala.compat.version}</artifactId><version>${spark.version}</version><scope>provided</scope><exclusions><exclusion><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId></exclusion><exclusion><groupId>org.eclipse.jetty</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_${scala.compat.version}</artifactId><version>${spark.version}</version><scope>provided</scope></dependency><!-- ... existing dependencies ... -->
    </dependencies>
    <!-- ... existing code ... -->
    
  • 解決 Servlet API 兼容性問題: 為了解決 jakarta.servlet.SingleThreadModel 錯誤(Spark 4.0.0 內部仍在使用),我們顯式排除了 spark-core 中的 jakarta.servlet-apiorg.eclipse.jetty 依賴,并手動引入了包含該類的較舊版本的 Servlet API (5.0.0)。

    <!-- ... existing code ... -->
    <dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0</version><scope>compile</scope> <!-- Or runtime, depending on specific need -->
    </dependency>
    <!-- ... existing code ... -->
    

    注意: 這個問題在 Apache Spark Jira (SPARK-51434) 中有記錄,并計劃在 Spark 4.1.0 中修復。手動引入舊版本 Servlet API 是一個臨時性的解決方案。

  • 添加測試依賴: 解決 SparkDemoApplicationTests.java 中的編譯錯誤,引入 Spring Boot 測試依賴。

    <!-- ... existing code ... -->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.5.0</version> <!-- Use an appropriate version --><scope>test</scope>
    </dependency>
    <!-- ... existing code ... -->
    
  • Maven Compiler Plugin 配置: 顯式配置 Maven 編譯器插件使用 JDK 17。

    <!-- ... existing code ... -->
    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version> <!-- Use an appropriate version --><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!-- ... existing plugins ... --></plugins>
    </build>
    <!-- ... existing code ... -->
    
  • Maven Exec Plugin 配置: 配置 exec-maven-plugin 以便直接運行主類,并添加 --add-opens 參數以解決 Java 模塊化系統相關的運行時訪問限制。

    <!-- ... existing code ... -->
    <plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.1.0</version> <!-- Use an appropriate version --><configuration><mainClass>Spark_RDD.RDDCreateExample</mainClass><executable>java</executable><arguments><argument>--add-opens</argument><argument>java.base/java.nio=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/java.nio.channels=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/java.lang=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/java.util=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/java.util.concurrent=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/java.util.concurrent.atomic=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/jdk.internal.misc=ALL-UNNAMED</argument><argument>--add-opens</argument><argument>java.base/sun.nio.ch=ALL-UNNAMED</argument><!-- Optional: For security manager if needed --><!-- <argument>-Djava.security.manager=allow</argument> --></arguments></configuration>
    </plugin>
    <!-- ... existing code ... -->
    
2.2 Java 環境配置

確保系統環境中的 Java 版本與項目要求一致是至關重要的。

  • 設置 JAVA_HOME 環境變量:
    通過在 shell 配置文件(如 ~/.zshrc~/.bashrc)中設置 JAVA_HOME 變量,并將其指向 JDK 17 的安裝路徑,可以確保 Maven 和其他工具使用正確的 Java 版本。

    export JAVA_HOME="/Library/Java/JavaVirtualMachines/openjdk-17.jdk/Contents/Home"
    export PATH="$JAVA_HOME/bin:$PATH"
    

    修改后,請務必執行 source ~/.zshrc (或 ~/.bashrc) 使更改生效。

  • 驗證 Java 和 Maven 版本:
    在終端中運行以下命令,驗證 Java 版本和 Maven 使用的 Java 版本是否正確:

    java -version
    mvn --version
    

    確保 java -version 顯示的是 17.x.x,并且 mvn --version 輸出中 “Java version” 字段也指向 JDK 17。

2.3 Spark UI 禁用 (可選但推薦)

為了規避潛在的 Jetty 或 Servlet API 相關的運行時問題,可以通過 Spark 配置禁用 Spark UI,尤其是在只需要執行批處理任務時。在 RDDCreateExample.java 中添加以下配置:

// ... existing code ...
SparkConf conf = new SparkConf().setAppName("RDD Create").setMaster("local[*]").set("spark.ui.enabled", "false"); // Disable Spark UI
JavaSparkContext sc = new JavaSparkContext(conf);
// ... existing code ...
2.4 Maven Toolchains 嘗試與經驗

在解決 Java 版本問題時,我們曾嘗試使用 Maven Toolchains 來管理不同 JDK 版本。盡管配置了 ~/.m2/toolchains.xml,但遇到了 Cannot find matching toolchain definitionsToolchain JDK[...] is missing required property: vendor 等錯誤。

經驗總結:雖然 Maven Toolchains 是一個強大的工具,但在某些復雜的 Java 環境(特別是 macOS 上 OpenJDK 的安裝路徑和供應商識別)中,配置可能會比較棘手。在這種情況下,直接通過設置 JAVA_HOME 環境變量來管理 Java 版本,通常是更直接和有效的解決方案,特別是對于單一項目或開發環境。清理 Maven 本地倉庫 (rm -rf ~/.m2/repository/*) 有助于清除舊的或損壞的依賴,但在 Toolchains 配置問題中,它并未直接解決根本問題。

3. 最終結果

經過上述一系列的配置和調整,應用程序最終成功運行。日志中顯示 Spark 應用程序使用了 Java version 17.0.15,并且應用程序邏輯正確執行,輸出了預期的結果。

成功運行的關鍵點:

  • pom.xml 中嚴格指定了 JDK 17。
  • 解決了 Spark 4.0.0 與 jakarta.servlet.SingleThreadModel 之間的兼容性問題,通過手動排除和引入特定版本的 Servlet API。
  • 通過設置 JAVA_HOME 確保了整個構建和運行環境都使用了正確的 Java 版本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909655.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是SeaTunnel

SeaTunnel&#xff1a;高性能、分布式數據集成平臺 1. 什么是SeaTunnel&#xff1f; SeaTunnel&#xff08;原名Waterdrop&#xff09;是一個高性能、分布式、可擴展的數據集成平臺&#xff0c;專為大規模數據同步、ETL&#xff08;Extract, Transform, Load&#xff09;和實…

Android 使用OkHttp 下載文件失敗問題定位和修復

一、背景 使用Okhttp下載文件時,存在失敗情況,剛開始以為是網絡問題,后面添加相關日志發現,是在網絡波動比較大的情況下,被判為timeout超時,結束了下載任務。 二、解決方案 有問題的下載配置寫法: 注:這里只是展示配置下載的關鍵代碼 val client OkHttpClient()val request…

【Docker基礎】Docker核心概念:命名空間(Namespace)之PID詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 PID命名空間詳解 2.1 PID命名空間的概念 2.2 PID命名空間的作用 2.3 PID命名空間的工作原理 2.3.1 PID命名空間的創建與銷毀 2.3.2 PID命名空間的層次結構 2.3.3 PID命名空間的進程ID映射 3 PID命…

SSM框架:企業級Java開發利器

SSM框架詳解&#xff1a;Java企業級開發的核心基石 SSM框架是Java企業級開發中最流行的框架組合&#xff0c;由Spring、Spring MVC和MyBatis三大框架整合而成。這個輕量級的框架組合為Java開發者提供了高效、靈活的企業級應用解決方案。 一、SSM框架組成解析 1. Spring框架 …

網絡安全中的人工智能應用

人工智能&#xff08;AI&#xff09;在網絡安全中的應用從根本上改變了企業抵御網絡威脅的方式。它利用先進的機器學習&#xff08;ML&#xff09;算法分析多源海量風險數據&#xff0c;挖掘威脅模式&#xff0c;從而更輕松地快速應對新興風險。AI 能以驚人的速度和準確性幫助發…

Vue + Spring Boot 前后端交互實踐:正確使用 `Content-Type: application/json` 及參數傳遞方式

在前后端分離開發中&#xff0c;前端通過 HTTP 請求與后端進行數據交互是常見的操作。其中&#xff0c;Content-Type 是決定請求體格式的重要字段之一。本文將以一個具體的例子出發&#xff0c;講解如何在 Vue 前端 使用 Axios 發送 JSON 格式請求&#xff0c;并在 Spring Boot…

微服務拆分 SpringCloud

拆分原則 什么時候拆分 大多數小型項目&#xff1a; 一般是先采用單體架構&#xff0c;隨著用戶規模擴大、業務復雜后再逐漸拆分為微服務架構&#xff08;前易后難&#xff09;。確定的大型項目&#xff1a; 資金充足&#xff0c;目標明確&#xff0c;可以直接選擇微服務架構…

DataX Hive寫插件深度解析:從數據寫入到Hive表關聯實戰

引言 在大數據處理流程中&#xff0c;將數據高效寫入Hive表是數據倉庫建設的關鍵環節。DataX作為阿里巴巴開源的數據同步工具&#xff0c;其Hive寫插件&#xff08;Hdfswriter&#xff09;提供了將數據寫入HDFS并與Hive表無縫關聯的能力。本文將系統介紹Hdfswriter的功能特性、…

基于國產USRP搭建十六通道同步采集系統, 耗費200萬 歡迎免費體驗

隨著無線通信、雷達探測和電子偵察等技術的發展&#xff0c;多通道信號同步采集的需求日益突出。我司基于8臺USRP-LW N321設備&#xff0c;構建了一套高精度十六路通道信號同步采集系統&#xff0c;該系統通過并行采集與精確時頻對齊&#xff0c;可為空間譜測向和MIMO系統等關鍵…

《前端編譯工具源映射配置:Webpack與Gulp的深度剖析》

當我們深入探索不同前端編譯工具時&#xff0c;Webpack與Gulp在源映射配置上的差異與特色&#xff0c;如同隱藏在代碼深處的神秘寶藏&#xff0c;等待我們去挖掘、去解讀。 Webpack作為現代前端構建的核心工具&#xff0c;在源映射配置方面展現出了高度的靈活性與可定制性。它…

4. 時間序列預測的自回歸和自動方法

4.1自回歸 自回歸是一種時間序列預測方法&#xff0c;僅依賴于時間序列的先前輸出&#xff1a;該技術假設下一個時間戳的未來觀測值與先前時間戳的觀測值存在線性關系。 在自回歸中&#xff0c;前一個時間戳的輸出值成為預測下一個時間戳的輸入值&#xff0c;并且誤差遵循簡單線…

Android 多屏幕旋轉控制原理與實戰

在嵌入式設備、雙顯示終端或定制系統中&#xff0c;Android 多屏幕控制&#xff08;尤其是屏幕方向旋轉&#xff09;是一個兼具挑戰與價值的功能模塊。本文將深入分析如何識別多個顯示、如何通過系統 API 控制旋轉&#xff0c;并討論為何某些 displayId 無法旋轉。 &#x1f4c…

faiss上的GPU流程,GPU與CPU之間的聯系

GPU使用流程 1、初始化階段 1.1:初始化GPU資源對象 目的: 為GPU上的操作分配和管理資源,例如臨時內存和CUDA流。 操作: 創建StandardGpuResources對象來管理GPU的內存和計算資源。例如: faiss::gpu::StandardGpuResources res; res.setTempMemory(1024 * 1024 * 512); …

在CentOS 7系統安裝PostgreSQL 15時出現`libzstd.so.1`依賴缺失問題

--> 正在處理依賴關系 libzstd.so.1()(64bit)&#xff0c;它被軟件包 postgresql15-server-15.13-1PGDG.rhel7.x86_64 需要---> 軟件包 python3-pip.noarch.0.9.0.3-8.el7 將被 安裝---> 軟件包 python3-setuptools.noarch.0.39.2.0-10.el7 將被 安裝--> 解決依賴關…

走進Coinate|迪拜第二大交易平臺如何構建極速金融引擎

在加密資產交易飛速發展的今天&#xff0c;技術實力已成為交易平臺生存與發展的核心競爭力。與那些高調營銷卻技術薄弱的平臺不同&#xff0c;來自迪拜的頭部交易平臺——Coinate&#xff0c;則始終堅持”以技術立命”的發展路徑。 在迪拜這片充滿創新與資本活力的中東熱土&am…

手機日志是什么?如何調試手機日志

目錄 一、手機日志的類型&#xff1a; 二、如何查看和調試手機日志&#xff08;以 Android 為例&#xff09;&#xff1a; 方法 1&#xff1a;使用 Android Studio ADB&#xff08;推薦&#xff09; 方法 2&#xff1a;使用手機端日志工具&#xff08;免電腦&#xff09; …

篇章八 論壇系統——業務開發——登錄

目錄 1.登錄 1.1 順序圖 1.2 參數要求 1.3 接口規范 1.4 實現流程 1.編寫SQL 2.dao層接口 3.定義Service接口 4.實現Service接口 5.單元測試 6. Controller實現方法對外提供API接口 7.測試API接口 8.實現前端邏輯,完成前后端交互 ?編輯 1.登錄 1.1 順序圖 1.2 參…

AI-Compass前沿速覽:從企業級智能體CoCo到騰訊開源3D建模,Meta視頻預測模型V-JEPA 2、小紅書開源文本大模型

AI 大事件 智譜推出首個企業級超級助手 Agent——CoCo**[1]** 智譜推出首個企業級超級助手 Agent——CoCo&#xff0c;具備交付導向、記憶機制和無縫嵌入三大企業級特性。能全流程輔助工作&#xff0c;根據員工職能和需求主動服務&#xff0c;無縫接入企業資源&#xff0c;提…

element ui el-table嵌套el-table,實現checkbox聯動效果

HTML代碼&#xff1a; <el-table header-row-class-name"my-el-table-header" row-class-name"my-el-table-body" ref"multipleGroupTable" :data"vehicleGroupTableData" tooltip-effect"dark" style"width: 100…

android stdio 關閉所有真機

Android Studio如何關閉所有真機 Android Studio是開發Android應用程序的集成開發環境&#xff0c;通常我們需要使用真機來進行應用程序的調試和測試。但是&#xff0c;在某些情況下&#xff0c;我們可能需要關閉所有已連接的真機。本文將介紹如何在Android Studio中關閉所有真…