spark-submit 命令使用詳解

spark-submit 命令使用詳解

spark-submit 用戶打包 Spark 應用程序並部署到 Spark 支持的集羣管理氣上,命令語法如下:

spark-submit [options] <python file> [app arguments]

app arguments 是傳遞給應用程序的參數,常用的命令行參數如下所示:

  • –master: 設置主節點 URL 的參數。支持:
    • local: 本地機器。
    • spark://host:port:遠程 Spark 單機集羣。
    • yarn:yarn 集羣
  • –deploy-mode:允許選擇是否在本地(使用 client 選項)啓動 Spark 驅動程序,或者在集羣內(使用 cluster 選項)的其中一臺工作機器上啓動。默認值是 client。
  • –name:應用程序名稱,也可在程序內設置。
  • –py-files:.py, .egg 或者 .zip 文件的逗號分隔列表,包括 Python 應用程序。這些文件將分發給每個執行節點。
  • –files:逗號分隔的文件列表,這些文件將分發給每個執行節點。
  • –conf:動態地改變應用程序的配置。
  • –driver-memory:指定應用程序在驅動節點上分配多少內存的參數,類似與 10000M, 2G。默認值是 1024M。
  • –executor-memory:指定每個執行節點上爲應用程序分配的內存,默認 1G。
  • –num-executors:指定執行器節點數。
  • –help:展示幫助信息和退出。

以下均是在 yarn 集羣提交的任務。

1、默認設置: 會將所有日誌和系統輸出結果輸出到 spark-submit 的 client 上

spark-submit --master yarn code1.py

code1.py

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Test_Code1').enableHiveSupport().getOrCreate()

spark.sql("select count(*) from default.test_table").show()

2、設置 Executor 的日誌級別,Executor 執行的細節(WARN 以下級別的日誌)不會輸出到 client 中

spark-submit --master yarn code2.py

code2.py

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Test_Code1').enableHiveSupport().getOrCreate()

sc = spark.sparkContext
sc.setLogLevel("WARN")

spark.sql("select count(*) from default.test_table").show()

3、使用 cluster 模式

spark-submit --master yarn --deploy-mode cluster code1.py

–deploy-mode 可選 cluster 或 client,cluster 模式下,在 spark-submit 的 client 服務器上不會輸出日誌和系統輸出,僅輸出如下語句。只能在 Hadoop 集羣上才能看到執行細節和輸出

2019-09-06 00:00:00 INFO  Client:54 - Application report for application_1556516318747_25363 (state: RUNNING)

4、自定義依賴的模塊或讀取文件

spark-submit --master yarn --files file1.txt --py-files code4.py code3.py 

code3.py

from code4 import code4func
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Test_Code1').enableHiveSupport().getOrCreate()

sc = spark.sparkContext
sc.setLogLevel("WARN")

table = code4func()
with open("file1.txt", 'rt') as rf:
    db = rf.readline().strip()

spark.sql("select count(*) from {}.{}".format(db, table)).show()

code4.py

def code4func():
    return "test_table"

file1.txt

default

自定義的 package 可以打包成 egg 文件上傳(該部分代碼參考 《PySpark 實戰》P:178)。例如有一個自定義創建的 package:

additionalCode/
├── setup.py
└── utilities
    ├── __init__.py
    ├── base.py
    ├── converters
    │   ├── __init__.py
    │   ├── base.py
    │   └── distance.py
    └── geoCalc.py

創建一個 egg 文件:

python setup.py bdist_egg

生成了 dist 文件夾下的 PySparkUtilities-0.1.dev0-py3.6.egg 文件

提交作業:

spark-submit --master yarn --py-files additionalCode/dist/PySparkUtilities-0.1.dev0-py3.6.egg calculatingGeoDistance.py

5、配置集羣資源

當執行的 job 需要更多資源時,可以自定義配置使用的資源。

spark-submit --master yarn --driver-memory 15g \
    --num-executors 10 --executor-cores 4 --executor-memory 15G \
    --conf "spark.executor.memoryOverhead=15G" \
    code1.py

或在程序內設置

spark-submit code5.py

code5.py

import pyspark
from pyspark.sql import SparkSession

conf1 = pyspark.SparkConf().setAll([
            ('spark.executor.memory', '15g'),
            ('spark.executor.memoryOverhead', '16g'),
            ('spark.executor.cores', '4'),
            ('spark.num.executors', '10'),
            ('spark.driver.memory', '16g')])

spark = SparkSession.builder.appName('Test_Code1').enableHiveSupport().config(conf=conf1).getOrCreate()

spark.sql("select count(*) from default.test_table").show()

6、使用 Python 虛擬環境

當使用 cluster 或應用某些第三方包的時候,在 Executor 中會出現 ImportError 的錯誤,導致 job 執行失敗,如下提交方式會報錯:

spark-submit --master yarn --deploy-mode cluster code6.py

報錯信息:

Traceback (most recent call last):
  File "code6.py", line 2, in <module>
    import numpy as np
ImportError: No module named numpy

這是由於節點中的 python 環境沒有安裝相應的依賴包,此時需要創建一個 python 虛擬環境並安裝所有的依賴包。

創建虛擬環境 python-env,打包爲 venv.zip:

virtualenv python-env

venv.zip 部分目錄結構如下所示:

venv.zip
└──python-env/
    ├── bin
    │   └── python
    ├── include
    ├── lib
    └── lib64

spark-submit 命令:

spark-submit --master yarn  --deploy-mode cluster \
    --archives ./venv.zip#env \
    --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=env/python-env/bin/python \
    code6.py

code6.py

from pyspark.sql import SparkSession
import numpy as np

spark = SparkSession.builder.appName('Test_Code1').enableHiveSupport().getOrCreate()

sc = spark.sparkContext
sc.setLogLevel("WARN")

arr = np.array([1, 2, 3])
print(arr)

spark.sql("select count(*) from default.test_table").show()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章