PySpark中python環境打包和JAR包依賴

在 PySpark 中打包 Python 環境并調度到集群是處理依賴一致性的關鍵步驟。以下是完整的解決方案,包含環境打包、分發和配置方法:

一、環境打包方法

  1. 使用 Conda 打包環境
# 創建 Conda 環境
conda create -n pyspark_env python=3.8
conda activate pyspark_env
conda install numpy pandas pyarrow  # 安裝所需依賴# 導出環境為 YAML 文件
conda env export > environment.yml# 打包環境(Linux/macOS)
conda-pack -n pyspark_env -o pyspark_env.tar.gz
  1. 使用 Virtualenv 打包環境
# 創建虛擬環境
python3 -m venv pyspark_env
source pyspark_env/bin/activate  # Linux/macOS
pyspark_env\Scripts\activate  # Windows# 安裝依賴
pip install numpy pandas pyarrow# 打包環境(需使用第三方工具)
pip install virtualenv-pack
virtualenv-pack -f -o pyspark_env.tar.gz

二、分發環境到集群

方法 1:通過 --archives 參數上傳
在提交作業時,使用 --archives 參數將打包的環境分發到所有節點:

# 將環境包上傳到 HDFS,避免每次提交都重新傳輸:
hdfs dfs -put pyspark_env.tar.gz /path/in/hdfs/spark-submit \--master yarn \--deploy-mode cluster \--py-files helper.py\ # python依賴文件,比如第三方代碼等--archives hdfs:///path/in/hdfs/pyspark_env.tar.gz#environment \your_script.py

三、配置 PySpark 使用打包環境

  1. 設置 Python 解釋器路徑
    在代碼中指定 Executor 使用打包環境中的 Python:
import os
os.environ["PYSPARK_PYTHON"] = "./environment/bin/python"  # 對應 --archives 指定的目錄名
os.environ["PYSPARK_DRIVER_PYTHON"] = "./environment/bin/python"  # Cluster 模式需要,如果是client模式,driver_python配置本地python路徑,比如/opt/conda/bin/python, 需注意本地python和集群打包python的版本一致from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("PackagedEnvApp").getOrCreate()
  1. 編寫pyspark腳本
import os
os.environ["PYSPARK_PYTHON"] = "./environment/bin/python"from pyspark.sql import SparkSession
import pandas as pd  # 使用打包環境中的 pandasspark = SparkSession.builder.appName("PackagedEnvExample").getOrCreate()# 使用 pandas 處理數據
pdf = pd.DataFrame({"col1": [1, 2, 3], "col2": ["a", "b", "c"]})
df = spark.createDataFrame(pdf)
df.show()spark.stop()
  1. 提交作業
spark-submit \--master yarn \--deploy-mode cluster \--archives pyspark_env.tar.gz#environment \example.py
  1. 配置優先級與運行模式詳解
  • 配置優先級規則
    Spark 配置的優先級從高到低如下:

    SparkSession.build.config
    spark-submit --conf參數
    spark-defaults.conf
    系統默認值
  • 關鍵結論:

    • SparkSession.builder.config() 優先級最高,會覆蓋其他配置
    • spark-submit 參數優先級次之
    • 特殊參數例外:–master 和 --deploy-mode 在 spark-submit 中具有最高優先級
  • deploy-mode 配置規則

    設置方式是否生效說明
    spark-submit? 總是生效命令行參數具有最終決定權
    SparkSession 代碼? 當 spark-submit 指定時無效spark-submit 未指定,則代碼配置生效
    spark-defaults?? 最低優先級僅當其他方式未配置時生效

四、替代方案

  1. Docker 容器
    使用 Docker 打包完整環境,通過 Kubernetes 調度:
# Dockerfile 示例
FROM apache/spark-py:v3.3.2
RUN pip install pandas numpy# 構建并推送鏡像
docker build -t my-spark-image:v1 .
docker push myregistry/my-spark-image:v1# 提交作業
spark-submit \--master k8s://https://kubernetes-host:port \--conf spark.kubernetes.container.image=myregistry/my-spark-image:v1 \...
  1. PySpark 內置依賴管理
    通過 --py-files 參數上傳 Python 文件 / 包:
spark-submit \--py-files my_module.zip,another_dep.py \your_script.py

五、Pyspark調用Xgboost或者LightGBM

5.1 調用 XGBoost 模型

  1. 準備依賴
    下載 XGBoost 的 Spark 擴展 jar 包:可以從 XGBoost 的官方 GitHub 發布頁面 或者 Maven 倉庫下載與你使用的 XGBoost 和 Spark 版本兼容的xgboost4j-spark和xgboost4j的 jar 包。例如,如果你使用的是 Spark 3.3.0 和 XGBoost 1.6.2,可以下載對應的版本。
    下載其他依賴:確保scala-library等相關依賴也在合適的版本,因為xgboost4j-spark會依賴它們。
  2. 配置 Spark 提交參數
    在使用spark-submit提交作業時,通過–jars參數指定上述下載的 jar 包路徑。例如:
spark-submit \--master yarn \--deploy-mode cluster \--jars /path/to/xgboost4j-spark-1.6.2.jar,/path/to/xgboost4j-1.6.2.jar,/path/to/scala-library-2.12.10.jar \your_script.py

也可以將這些 jar 包上傳到 HDFS,然后使用 HDFS 路徑:

hdfs dfs -put /path/to/xgboost4j-spark-1.6.2.jar /lib/
hdfs dfs -put /path/to/xgboost4j-1.6.2.jar /lib/
hdfs dfs -put /path/to/scala-library-2.12.10.jar /lib/spark-submit \--master yarn \--deploy-mode cluster \--jars hdfs:///lib/xgboost4j-spark-1.6.2.jar,hdfs:///lib/xgboost4j-1.6.2.jar,hdfs:///lib/scala-library-2.12.10.jar \your_script.py
  1. Python 代碼示例
    在 Python 代碼中,導入相關模塊并使用 XGBoost 的 Spark 接口:
from pyspark.sql import SparkSession
from xgboost.spark import XGBoostClassifierspark = SparkSession.builder \.appName("XGBoostOnSpark") \.getOrCreate()# 假設data是一個包含特征和標簽的DataFrame
data = spark.read.csv("your_data.csv", header=True, inferSchema=True)
feature_cols = [col for col in data.columns if col != "label"]
label_col = "label"# 創建XGBoost分類器
model = XGBoostClassifier(num_round=10, objective="binary:logistic")
# 擬合模型
model.fit(data, label_col=label_col, features_col=feature_cols)

5.2 調用 LightGBM 模型

  1. 準備依賴
    下載 LightGBM 的 Spark 擴展 jar 包:從 LightGBM 的官方 GitHub 發布頁面或者 Maven 倉庫獲取lightgbm4j-spark相關的 jar 包,以及lightgbm4j的 jar 包。注意選擇與你的 Spark 和 LightGBM 版本適配的版本。
    處理其他依賴:同樣要保證scala-library等依賴的兼容性。
  2. 配置 Spark 提交參數
    和 XGBoost 類似,使用spark-submit時通過–jars參數指定 jar 包路徑。例如:
spark-submit \--master yarn \--deploy-mode cluster \--jars /path/to/lightgbm4j-spark-3.3.1.jar,/path/to/lightgbm4j-3.3.1.jar,/path/to/scala-library-2.12.10.jar \your_script.py

或者上傳到 HDFS 后使用 HDFS 路徑:

hdfs dfs -put /path/to/lightgbm4j-spark-3.3.1.jar /lib/
hdfs dfs -put /path/to/lightgbm4j-3.3.1.jar /lib/
hdfs dfs -put /path/to/scala-library-2.12.10.jar /lib/spark-submit \--master yarn \--deploy-mode cluster \--jars hdfs:///lib/lightgbm4j-spark-3.3.1.jar,hdfs:///lib/lightgbm4j-3.3.1.jar,hdfs:///lib/scala-library-2.12.10.jar \your_script.py
  1. Python 代碼示例
    在 Python 代碼中,導入模塊并使用 LightGBM 的 Spark 接口:
from pyspark.sql import SparkSession
from lightgbm4j.spark import LightGBMClassifierspark = SparkSession.builder \.appName("LightGBMOnSpark") \.getOrCreate()# 假設data是一個包含特征和標簽的DataFrame
data = spark.read.csv("your_data.csv", header=True, inferSchema=True)
feature_cols = [col for col in data.columns if col != "label"]
label_col = "label"# 創建LightGBM分類器
params = {"objective": "binary","num_leaves": 31,"learning_rate": 0.05,"feature_fraction": 0.9
}
model = LightGBMClassifier(params=params, num_round=10)
# 擬合模型
model.fit(data, label_col=label_col, features_col=feature_cols)

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

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

相關文章

和鯨社區深度學習基礎訓練營2025年關卡2(1)純numpy

擬分3種實現方法:1.純numpy2.sklearn中的MLPClassifier3.pytorch題目: 在 MNIST 數據集上訓練 MLP 模型并比較不同的激活函數和優化算法任務描述:使用 MNIST 數據集中的前 20,000 個樣本訓練一個多層感知機 (MLP) 模型。你需要比較三種不同的…

Sequential Thinking:AI深度思考的新范式及其與CoT、ReAct的對比分析

引言:AI深度思考的演進與Sequential Thinking的崛起在人工智能技術快速發展的今天,AI模型的思考能力正經歷著從簡單應答到深度推理的革命性轉變。這一演進過程不僅反映了技術本身的進步,更體現了人類對機器智能認知邊界的持續探索。早期的大語…

云原生詳解:構建現代化應用的未來

引言 在數字化轉型的浪潮中,"云原生"已成為技術領域最熱門的話題之一。從初創公司到全球500強企業,都在積極探索云原生技術以提升業務敏捷性和創新能力。本文將全面解析云原生的概念、核心技術、優勢以及實踐路徑,幫助您深入理解這一改變IT格局的技術范式。 什么…

SSE事件流簡單示例

文章目錄1、推送-SseEmitter2、接收-EventSourceListenerSSE(Server-Sent Events,服務器推送事件)是一種基于HTTP的服務器向客戶端實時推送數據的技術標準。1、推送-SseEmitter SseEmitter用于實現服務器向客戶端單向、長連接的實時數據推送…

Elasticsearch RESTful API入門:基礎搜索與查詢DSL

Elasticsearch RESTful API入門:基礎搜索與查詢DSL 本文為Elasticsearch初學者詳細解析RESTful API的核心操作與查詢DSL語法,包含大量實戰示例及最佳實踐。 一、Elasticsearch與RESTful API簡介 Elasticsearch(ES)作為分布式搜索…

(六)復習(OutBox Message)

文章目錄 項目地址一、OutBox Message1.1 OutBox表配置1. OutBoxMessage類2. OutboxMessage表配置3. 給每個模塊生成outboxmessage表1.2 發布OutBox Message1. 修改Intercepotor2. 配置Quartz3. 創建Quatz方法發布領域事件4. 創建Quatz定時任務5. 注冊Quatz服務和配置6. 流程梳…

STM32-ADC內部溫度

在通道16無引腳(測量溫度不準確)跟ADC代碼差不多;不需要使能引腳時鐘;將內部溫度測量打開/*** brief 啟用或禁用溫度傳感器和內部參考電壓功能* param NewState: 新的功能狀態,取值為ENABLE或DISABLE* retval 無* no…

「Linux命令基礎」文本模式系統關閉與重啟

關機重啟基本命令 直接拔掉計算機電源可能損壞內部元件;Linux系統通過命令關閉計算機則是安全流程,讓所有程序有機會保存數據、釋放資源。 關機命令:shutdown Linux系統提供了多種用于關閉或重啟系統的命令,其中 shutdown 是最常用的一種,它可以安全地通知用戶系統即將…

射頻信號(大寬高比)時頻圖目標檢測anchors配置

一、大寬高比目標YOLO檢測參數設置 這是yolov7的一個label的txt文件: 1 0.500 0.201 1.000 0.091 2 0.500 0.402 1.000 0.150 3 0.500 0.604 1.000 0.093 0 0.500 0.804 1.000 0.217 對應的樣本: 長寬比分別是:1/0.09110.98, 1/0.1506.67…

OpenStack 鑒權服務介紹.md

引言 OpenStack是一個開源的云計算管理平臺,其中的Keystone組件承擔了身份認證和授權的關鍵任務。Keystone的主要功能包括管理用戶及其權限、維護OpenStack Services的Endpoint,以及實現認證(Authentication)和鑒權(Au…

Linux_3:進程間通信

IPC1.什么是IPC?Inter Process Communication2.進程間通信常用的幾種方式1,管道通信:有名管道,無名管道2,信號- 系統開銷小3,消息隊列-內核的鏈表4,信號量-計數器5,共享內存6&#x…

【Springboot】Bean解釋

在 Spring Boot 中,Bean 就像是你餐廳里的一名員工。比如,你有一名服務員(Service)、一名廚師(Chef)和一名收銀員(Cashier)。這些員工都是餐廳正常運轉所必需的,他們各自…

axios的post請求,數據為什么要用qs處理?什么時候不用?

為什么使用 qs 處理 POST 數據axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式(Content-Type: application/json)。但某些后端接口(尤其是傳統表單提交)要求數據以 application/x-www-form-urlencoded 格式傳輸&…

【unitrix】 4.21 類型級二進制數基本結構體(types.rs)

一、源碼 這段代碼定義了一個類型級數值系統的 Rust 實現,主要用于在編譯時表示和操作各種數值類型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮點值枚舉 ///// 特殊浮點值(NaN/∞&#x…

UI前端與數字孿生結合實踐案例:智慧零售的庫存管理優化系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言:數字孿生重構零售庫存的 “人 - 貨 - 場” 協同在零售行業利潤率持續承壓的背景…

【Freertos實戰】零基礎制作基于stm32的物聯網溫濕度檢測(教程非常簡易)持續更新中.........

本次記錄采用Freertos的第二個DIY作品,基于Onenet的物聯網溫濕度檢測系統,此次代碼依然是全部開源。通過網盤分享的文件:物聯網溫濕度檢測.rar 鏈接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取碼: qm2e 大家也可以看看…

Matplotlib-多圖布局與網格顯示

Matplotlib-多圖布局與網格顯示一、多圖布局的核心組件二、基礎布局:plt.subplots()快速創建網格1. 均等分網格2. 不等分網格(指定比例)三、進階布局:GridSpec實現復雜嵌套1. 跨行列布局2. 嵌套GridSpec四、實用技巧:布…

GitHub上優秀的開源播放器項目介紹及優劣對比

ExoPlayer 項目地址:https://github.com/google/ExoPlayer 特點: 由Google開發,支持廣泛的視頻格式和流媒體傳輸協議,如DASH、HLS、SmoothStreaming。 提供靈活的媒體源架構和高級特性,如動態自適應流播放。 開發者可以輕松擴展和定制播放器組件,適應特定需求。 優點: 功…

react打包發到線上報錯Minified React error #130

開發過程中遇到一個問題,記錄一下 本地打包發布正常,發測試環境正常,可是通過Jenkins打包發布線上報錯 報錯信息 index-67fbbd81.js:39 Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant130…

微服務項目遠程調用時的負載均衡是如何實現的?

負載均衡概述 負載均衡是微服務架構中的核心組件,用于將請求合理分配到多個服務實例上,提高系統的可用性和性能。負載均衡的分類 負載均衡大致可以分為兩類 1. 服務端負載均衡 實現位置:獨立部署的負載均衡服務器(位于客戶端和服務…