将LD_PRELOAD与Apache Spark(或YARN)一起使用



我们在Apache Hadoop YARN上运行Spark作业。我特别需要在这些工作上使用"LD_PRELOAD技巧"。(在任何人恐慌之前,它不是为了生产运行;这是自动化作业测试的一部分)。

我知道如何使用作业提交其他文件,并且知道如何在节点上设置环境变量,因此将这些设置添加到spark-defaults.conf几乎提供了一个解决方案:

spark.files=/home/todd/pwn_connect.so
spark.yarn.appMasterEnv.LD_PRELOAD=pwn_connect.so
spark.executorEnv.LD_PRELOAD=pwn_connect.so

但是我在容器日志中收到此错误:

ERROR: ld.so: object 'pwn_connect.so' from LD_PRELOAD cannot be preloaded: ignored.

问题似乎是LD_PRELOAD不接受我提供的相对路径。但是我不知道如何提供绝对路径 - 我不知道这些文件被放置在节点的本地文件系统上的位置。

首先,在 YARN 上运行时不使用spark.files,它应该是spark.yarn.dist.files的。请注意,如果向spark-submit提供--files参数,这将被覆盖。

对于LD_PRELOAD,有两种解决方案可以工作:

  1. 可以使用相对路径;它们需要以./为前缀:

    spark.yarn.dist.files=/home/todd/pwn_connect.so
    spark.yarn.appMasterEnv.LD_PRELOAD=./pwn_connect.so
    spark.executorEnv.LD_PRELOAD=./pwn_connect.so
    

    (没有./的相对路径在LD_LIBRARY_PATH中搜索,而不是在当前工作目录中搜索)。

  2. 如果首选绝对路径,则检查 Spark 源代码会发现包括环境变量赋值在内的整个命令行都会受到 shell 的扩展,因此表达式$PWD将扩展到当前工作目录:

    spark.yarn.dist.files=/home/todd/pwn_connect.so
    spark.yarn.appMasterEnv.LD_PRELOAD=$PWD/pwn_connect.so
    spark.executorEnv.LD_PRELOAD=$PWD/pwn_connect.so
    

我有一年半的类似问题,尝试了几种方法,都没有奏效; 直到我看到这条评论。谢谢。

--conf spark.yarn.dist.files=/usr/lib64/libopenblas64.so 
--conf spark.yarn.appMasterEnv.LD_PRELOAD=./libopenblas64.so 
--conf spark.executorEnv.LD_PRELOAD=./libopenblas64.so 

相关内容

  • 没有找到相关文章

最新更新