在分析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是否将为每个容器启动运行?
1条答案
按热度按时间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
:至于最后一个问题,是的,yarn将为每个容器创建一个temp dir
launch_container.sh
包含在目录中。