pyspark环境设置是如何由yarn在launch\u container.sh中执行的

pieyvz9o  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(562)

在分析spark作业的yarn launch\u container.sh日志时,我被日志的某些部分弄糊涂了。我将在这里一步一步地指出这些问题
使用spark submit提交spark job时,在yarn上的集群模式下有--pyfiles和--files:
传入的配置文件--files,传入的可执行python文件--pyfiles正在上载到用户hadoop主目录下创建的.sparkstaging目录中。与这些文件一起,$spark\u home/python/lib中的pyspark.zip和py4j-version\u number.zip也被复制到用户hadoop home目录下创建的.sparkstaging目录中
在这次启动之后,jarn触发了\u container.sh,这将导出所需的所有env变量。如果我们在.bash\u profile中或在shell脚本或spark\u env.sh中构建spark submit作业时显式导出了pyspark\u python之类的内容,则默认值将替换为我们提供的值

This PYSPARK_PYTHON is a path in my edge node. 
 Then how a container launched in another node will be able to use this python version ?

 The default python version in  data nodes of my cluster is 2.7.5. 
 So without setting this pyspark_python , containers are using 2.7.5. 
 But when I will set pyspark_python to 3.5.x , they are using  what I have given.

它正在定义pwd='/data/complete path'

Where this PWD directory resides ? 
 This directory is getting cleaned up after job completion. 
 I have even tried to run the job in one session of putty  
 and kept the /data folder opened in another session of putty to see 
 if any directories are getting created on run time. but couldn't find any?

它还将pythonpath设置为$pwd/pyspark.zip:$pwd/py4j-version.zip

When ever I am doing a python specific  operation 
 in spark code , its using PYSPARK_PYTHON. So for what purpose this PYTHONPATH is being used?

3.完成此步骤后,将为步骤1中的所有文件使用ln-sf创建软链接

soft links are created for for pyspark.zip , py4j-<version>.zip, 
    all python files mentioned in step 1.
    Now these links are again pointing to '/data/different_directories' 
    directory (which I am not sure where they are present).
    I know soft links can be used for accessing remote nodes ,
    but here why the soft links are created ?

最后但并非最不重要的一点,此launch\u container.sh是否将为每个容器启动运行?

nbysray5

nbysray51#

那么,在另一个节点中启动的容器如何能够使用这个python版本呢?
首先,当我们提交spark应用程序时,有几种方法可以设置spark应用程序的配置。例如:
设置spark-defaults.conf
设置环境变量
设置spark提交选项(spark submit-help和-conf)
设置自定义属性文件(-properties file)
在代码中设置值(在sparkconf和sparkcontext API中公开)
设置hadoop配置(hadoop\u conf\u dir和spark.hadoop.*)
在我的环境中,hadoop配置放在 /etc/spark/conf/yarn-conf/ ,和 spark-defaults.conf 以及 spark-env.sh/etc/spark/conf/ .
作为配置的优先顺序,这是spark将使用的顺序:
在代码中的sparkconf或sparkcontext上设置的属性
在运行时传递给spark submit、spark shell或pyspark的参数
在指定的属性文件/etc/spark/conf/spark-defaults.conf中设置的属性
在脚本中导出或设置的环境变量
从广义上讲:
对于应用于所有作业的属性,请使用spark-defaults.conf;对于常量且特定于单个或少数应用程序的属性,请使用sparkconf或--properties文件;对于在运行之间更改的属性,请使用命令行参数。
现在,关于这个问题:
在Spark簇模式下,Spark驱动器在Yarn中的容器中运行,Spark执行器在Yarn中的容器中运行。
在spark的客户机模式下,spark驱动程序在hadoop集群之外运行(没有Yarn),执行器总是在Yarn中。
所以对于你的问题,它主要与Yarn有关。当一个应用程序提交给yarn时,首先会有一个applicationmaster容器,它与nodemanager协作,并负责控制应用程序容器(在您的情况下,它们是spark执行器)。然后nodemanager将为每个spark执行器创建一个本地临时目录,以准备启动容器(这就是 launch_container.sh 有这样一个名字)。我们可以发现本地临时目录的位置是由nodemanager的 ${yarn.nodemanager.local-dirs} 定义于 yarn-site.xml . 我们可以设置 yarn.nodemanager.delete.debug-delay-sec 10分钟后回顾 launch_container.sh 脚本。
在我的环境中 ${yarn.nodemanager.local-dirs}/yarn/nm ,所以在这个目录中,我可以找到spark executor容器的临时目录,它们看起来像: /yarn/nm/nm-local-dir/container_1603853670569_0001_01_000001 . 在这个目录里,我可以找到 launch_container.sh 用于此特定容器和运行此容器的其他物料。
这个pwd目录在哪里?
我认为这是linux操作系统中的一个特殊环境变量,所以最好不要修改它,除非您清楚地知道它在应用程序中是如何工作的。如上所述,如果您在运行时导出这个pwd环境,我认为它和任何其他环境变量一样被传递给spark。
我不太清楚 PYSPARK_PYTHON spark的启动脚本链中使用了环境变量,但在这里您可以在官方文档中找到该指令,该文档演示了如何在使用时设置python二进制可执行文件 spark-submit :

spark-submit --conf spark.pyspark.python=/<PATH>/<TO>/<FILE>

至于最后一个问题,是的,yarn将为每个容器创建一个temp dir launch_container.sh 包含在目录中。

相关问题