【问题标题】:How PYSPARK environmental setup is executed by YARN in launch_container.shYARN 在 launch_container.sh 中如何执行 PYSPARK 环境设置
【发布时间】:2020-12-05 00:51:10
【问题描述】:

在为 spark 作业分析 yarn launch_container.sh 日志时,我对日志的某些部分感到困惑。 我会在这里一步一步指出这些问题

当您使用 spark-submit 在 YARN 上以集群模式提交具有 --pyfiles 和 --files 的 spark 作业时:

  1. 在 --files 中传递的配置文件,在 --pyfiles 中传递的可执行 python 文件正在上传到用户 hadoop 主目录下创建的 .sparkStaging 目录。 与这些文件一起,来自 $SPARK_HOME/python/lib 的 pyspark.zip 和 py4j-version_number.zip 也被复制 进入用户 hadoop 主目录下创建的 .sparkStaging 目录

  2. 在这个 launch_container.sh 被 yarn 触发之后,这将导出所有需要的环境变量。 如果我们在 .bash_profile 或在 shell 脚本或 spark_env.sh 中构建 spark-submit 作业时明确导出了任何内容,例如 PYSPARK_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.
    
  3. 它正在定义 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?
    
  4. 它还将 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.在这个 yarn 使用 ln -sf 为步骤 1 中的所有文件创建软链接之后

    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_container.sh 是否会在每次容器启动时运行?

【问题讨论】:

    标签: apache-spark hadoop pyspark hadoop-yarn


    【解决方案1】:

    那么在另一个节点启动的容器如何才能使用这个python版本呢?

    首先,当我们提交 Spark 应用程序时,有几种方法可以设置 Spark 应用程序的配置。 如:

    • 设置 spark-defaults.conf
    • 设置环境变量
    • 设置 spark-submit 选项(spark-submit —help 和 —conf)
    • 设置自定义属性文件(—properties-file)
    • 在代码中设置值(在 SparkConf 和 SparkContext API 中公开)
    • 设置 Hadoop 配置(HADOOP_CONF_DIR 和 spark.hadoop.*)

    在我的环境中,Hadoop配置放在/etc/spark/conf/yarn-conf/中,spark-defaults.confspark-env.sh/etc/spark/conf/中。

    作为配置的优先顺序,这是 Spark 将使用的顺序:

    1. 在代码中在 SparkConf 或 SparkContext 上设置的属性
    2. 在运行时传递给 spark-submit、spark-shell 或 pyspark 的参数
    3. 在 /etc/spark/conf/spark-defaults.conf 中设置的属性,一个指定的属性文件
    4. 在脚本中导出或设置的环境变量

    从广义上讲:

    对于适用于所有作业的属性,请使用 spark-defaults.conf, 对于特定于单个或几个应用程序的常量和特定属性,请使用 SparkConf 或 --properties-file, 对于在运行之间更改的属性,请使用命令行参数。

    现在,关于这个问题:

    • 在 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 执行器容器的临时目录,它们看起来像: /yarn/nm/nm-local-dir/container_1603853670569_0001_01_000001。 在这个目录中,我可以找到这个特定容器的launch_container.sh 以及运行这个容器的其他东西。

    这个 PWD 目录在哪里?

    我认为这是 Linux 操作系统中的一个特殊环境变量,所以最好不要修改它,除非你知道它在你的应用程序中是如何工作的。 如上所述,如果您在运行时导出此 PWD 环境,我认为它会像任何其他环境变量一样传递给 Spark。

    我不确定 PYSPARK_PYTHON 环境变量是如何在 Spark 的启动脚本链中使用的,但在这里你可以找到官方文档中的说明,展示了如何在使用 spark-submit 时设置 Python 二进制可执行文件:

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

    至于最后一个问题,是的,YARN 会为每个容器创建一个临时目录,并且launch_container.sh 包含在目录中。

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2021-09-24
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多