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