spark 上傳額外的文件的方法
當pyspark 運行在cluster mode下的時候 driver不能直接獲取到client上的文件 所以要把一些文件上傳上去 pyspark_submmit 在提交的時候有三個參數和上傳文件相關
-
上傳壓縮文件
例如
--archives ./py_276_cityhash_env.zip#HashEnvDir
這個參數的意思是 將壓縮包 zip文件分發到集羣上 將壓縮文件解壓 解壓後的文件全部放在#
後面指定的文件夾下HashEnvDir
這個目錄下面 也就是說在代碼中可以使用HashEnvDir/xxx.txt
來讀取壓縮包中的xxx.txt
文件 多個壓縮文件使用逗號分隔符分割 如果壓縮包裏面有一個跟文件夾root_dir/
那麼解壓後 將變成HashEnvDir/root_dir/
-
上傳一般資源文件
例如
--files ./config.json#my_config.json
這個參數的意思是 將config.json
文件分發到集羣上 之後使用my_config.json
來訪問這個文件#
後面相當於是文件的別名 文件表示使用逗號分隔符分割 -
上傳代碼文件
有時候提交的pyspark python腳本文件不止一個 互相之間要引用 這時要
例如
--py-files ./feature.py
這個參數的意思是 將feature.py
文件分發到集羣上 放在和主腳本在一起的代碼目錄下 這樣就可以引用feature.py中的函數了 文件表示使用逗號分隔符分割
spark 使用特定的python環境的方法
1.以miniconda爲例
2. 安裝好miniconda
3. 使用conda create -n $myenv_name python=3.6
並用python=3.6
來指定對應python環境的版本
4. 在創建好的環境(在miniconda 安裝目錄的env文件夾下面)使用pip 安裝好需要的包
5. 使用zip 命令將 env文件夾下面對應$myenv_name
的文件夾打包 該文件夾包含了所有的 環境所需的文件 打包後 發送到集羣的各臺機器上即可工作
6. 在spark提交命令中 使用 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./HashEnvDir/hash_np_env27/bin/python\
來指定對應的python指定文件 HashEnvDir 是將壓縮包解壓後的目錄. hash_np_env27是$myenv_name
python是對應環境下面的python可執行文件
完整樣例
這個例子同時包含了使用spark-submmit 提交任務時 使用了特定的python環境 以及依賴來自於其他文件的內容等 以及如何上傳壓縮包和代碼文件
SPARK_HOME="/data01/opt/spark-2.2.1-bin-2.7.3"
SUDO_PREF="sudo -u profile"
$SUDO_PREF ${SPARK_HOME}/bin/spark-submit\
--master yarn\
--deploy-mode cluster\
--files ${SPARK_HOME}/conf/hive-site.xml\
--num-executors 50\
--executor-cores 4\
--executor-memory 16G\
--driver-memory 16G\
--queue profile\
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./HashEnvDir/hash_np_env27/bin/python\
--archives /home/sdev/python_env/hash_np_env27.zip#HashEnvDir\
--name "s1_recallkey_d${3}_h${4}_ds${5}"\
./s1_matchtag_recallkey_rand_neg.py\
--input_proc_name $6\
--output_proc_name $7\
--nation $1\
--language $2\
--data_date $3\
--hour $4\
--downsample $5