Spark 通过安全的 YARN Hadoop 集群实现安全性

god*_*ane 6 hadoop kerberos hdfs hadoop-yarn apache-spark

我有一个配置了 Kerberos 的 Hadoop 3.0 集群。一切正常,YARN 也已启动。

现在想在上面加上Spark,充分利用Hadoop和安全性。为此,我使用了Spark 2.3二进制分发版并修改了以下内容。

spark-env.sh

YARN_CONF_DIR,设置到我的Hadoop配置文件的文件夹core-site.xmlhdfs-site.xml以及yarn-site.xml所处的位置。

spark-defaults.conf

spark.master                yarn
spark.submit.deployMode     cluster
spark.authenticate          true
spark.yarn.principal        mysparkprincipal
spark.yarn.keytab           mykeytabfile
Run Code Online (Sandbox Code Playgroud)

如果我在使用 YARN 时理解正确,密钥会自动生成,我不需要手动设置spark.authenticate.secret.

我遇到的问题是工人抱怨钥匙:

java.lang.IllegalArgumentException: A secret key must be specified via the spark.authenticate.secret config
Run Code Online (Sandbox Code Playgroud)

我在日志中也没有任何迹象表明 Spark 正在使用 YARN 或尝试对我的 hdfs 卷执行任何操作。这几乎就像 Hadoop 配置文件被完全忽略一样。我已经阅读了有关 Spark 的 YARN 和安全性的文档,但对我来说不是很清楚。

我的问题是:

  • 我如何确定 Spark 正在使用 YARN
  • spark.yarn.access.hadoopFileSystems如果我只使用设置的服务器,是否需要设置YARN_CONF_DIR
  • LOCAL_DIRS最好设置为HDFS,如果是,什么是语法
  • 我需要HADOOP_CONF_DIRYARN_CONF_DIR吗?

编辑/添加:

查看源代码后,异常来自未为 Spark 启用的 SASL,所以我不明白。

我的 Hadoop 启用了 SSL(数据机密性),并且由于我为 Spark 提供了我的服务器配置,如果 Hadoop 的配置启用了它,那么它可能需要 Spark 的 SSL。

到目前为止,我真的对一切都感到困惑。

  • 它说需要使用spark.yarn.appMasterEnv. 但哪一个?他们都?
  • 它还说我需要在类路径上拥有 Hadoop CLIENT 文件,但是 CLIENT 文件中应该存在哪些属性?我想我可以使用spark.hadoop.*属性替换 XML 文件,但是 Spark 知道我的 YARN 集群在哪里所需的属性是什么?
  • 设置spark.authenticate.enableSaslEncryption为 false 似乎没有效果,因为异常仍然是关于SparkSaslClient

例外是:

java.lang.IllegalArgumentException: A secret key must be specified via the spark.authenticate.secret config
    at org.apache.spark.SecurityManager$$anonfun$getSecretKey$4.apply(SecurityManager.scala:510)
    at org.apache.spark.SecurityManager$$anonfun$getSecretKey$4.apply(SecurityManager.scala:510)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.SecurityManager.getSecretKey(SecurityManager.scala:509)
    at org.apache.spark.SecurityManager.getSecretKey(SecurityManager.scala:551)
    at org.apache.spark.network.sasl.SparkSaslClient$ClientCallbackHandler.handle(SparkSaslClient.java:137)
    at com.sun.security.sasl.digest.DigestMD5Client.processChallenge(DigestMD5Client.java:337)
    at com.sun.security.sasl.digest.DigestMD5Client.evaluateChallenge(DigestMD5Client.java:220)
    at org.apache.spark.network.sasl.SparkSaslClient.response(SparkSaslClient.java:98)
    at org.apache.spark.network.sasl.SaslClientBootstrap.doBootstrap(SaslClientBootstrap.java:71)
    at org.apache.spark.network.crypto.AuthClientBootstrap.doSaslAuth(AuthClientBootstrap.java:115)
    at org.apache.spark.network.crypto.AuthClientBootstrap.doBootstrap(AuthClientBootstrap.java:74)
    at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:257)
    at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:187)
    at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:198)
    at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:194)
    at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:190)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)