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

时间:2017-11-09 13:28:34

标签: hadoop apache-spark yarn ld-preload

我们正在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不接受我提供的相对路径。但我不知道如何提供绝对路径 - 我不知道这些文件放置在节点的本地文件系统上的哪个位置。

1 个答案:

答案 0 :(得分:0)

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

对于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 source code会发现包含环境变量赋值的整个命令行都会受到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