Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 在Kubernetes上运行Spark以访问kerberized Hadoop集群时,如何解决;“未启用简单身份验证”;遗嘱执行人的错误?_Docker_Apache Spark_Kubernetes_Openshift_Kerberos - Fatal编程技术网

Docker 在Kubernetes上运行Spark以访问kerberized Hadoop集群时,如何解决;“未启用简单身份验证”;遗嘱执行人的错误?

Docker 在Kubernetes上运行Spark以访问kerberized Hadoop集群时,如何解决;“未启用简单身份验证”;遗嘱执行人的错误?,docker,apache-spark,kubernetes,openshift,kerberos,Docker,Apache Spark,Kubernetes,Openshift,Kerberos,我试图在Kubernetes上运行Spark,目的是处理来自Kerberized Hadoop集群的数据。我的应用程序由简单的SparkSQL转换组成。虽然我能够在单个驱动程序pod上成功运行该进程,但在尝试使用任何执行器时,我无法这样做。相反,我得到: org.apache.hadoop.security.AccessControlException:简单 未启用身份验证。可用:[令牌,KERBEROS] 由于Hadoop环境是Kerberized的,所以我在docker映像中提供了一个有效的

我试图在Kubernetes上运行Spark,目的是处理来自Kerberized Hadoop集群的数据。我的应用程序由简单的SparkSQL转换组成。虽然我能够在单个驱动程序pod上成功运行该进程,但在尝试使用任何执行器时,我无法这样做。相反,我得到:

org.apache.hadoop.security.AccessControlException:简单 未启用身份验证。可用:[令牌,KERBEROS]

由于Hadoop环境是Kerberized的,所以我在docker映像中提供了一个有效的keytab、core-site.xml、hive-site.xml、Hadoop-site.xml、mapred-site.xml和warn-site.xml以及一个krb5.conf文件

我使用以下方法设置环境设置:

trait EnvironmentConfiguration {

def configureEnvironment(): Unit = {
  val conf = new Configuration
  conf.set("hadoop.security.authentication", "kerberos")
  conf.set("hadoop.security.authorization", "true")
  conf.set("com.sun.security.auth.module.Krb5LoginModule", "required")
  System.setProperty("java.security.krb5.conf", ConfigurationProperties.kerberosConfLocation)    
  UserGroupInformation.loginUserFromKeytab(ConfigurationProperties.keytabUser, ConfigurationProperties.keytabLocation)
  UserGroupInformation.setConfiguration(conf)
}
我还通过以下方法传递*-site.xml文件:

trait SparkConfiguration {

  def createSparkSession(): SparkSession = {
    val spark = SparkSession.builder
    .appName("MiniSparkK8")
    .enableHiveSupport()
    .master("local[*]")
    .config("spark.sql.hive.metastore.version", ConfigurationProperties.hiveMetastoreVersion)
    .config("spark.executor.memory", ConfigurationProperties.sparkExecutorMemory)
    .config("spark.sql.hive.version", ConfigurationProperties.hiveVersion)
    .config("spark.sql.hive.metastore.jars",ConfigurationProperties.hiveMetastoreJars)
    spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.coreSiteLocation))
    spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.hiveSiteLocation))
    spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.hdfsSiteLocation))
    spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.yarnSiteLocation))
    spark.sparkContext.hadoopConfiguration.addResource(new Path(ConfigurationProperties.mapredSiteLocation))
  }
}
我使用以下spark submit命令运行整个过程:

spark-submit ^
--master k8s://https://kubernetes.example.environment.url:8443 ^
--deploy-mode cluster ^
--name mini-spark-k8 ^
--class org.spark.Driver ^
--conf spark.executor.instances=2 ^
--conf spark.kubernetes.namespace=<company-openshift-namespace> ^
--conf spark.kubernetes.container.image=<company_image_registry.image> ^
--conf spark.kubernetes.driver.pod.name=minisparkk8-cluster ^
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark ^
local:///opt/spark/examples/target/MiniSparkK8-1.0-SNAPSHOT.jar ^
/opt/spark/mini-spark-conf.properties
但这没什么区别


我的问题是:我如何让执行者使用他们图像中的密钥表来验证他们自己?我希望这将使他们能够执行其委托的任务

k8s上的Spark现在不支持kerberos。这可能对你有帮助。

尝试
将您的键签绑定起来,以便提前从KDC获取TGT


例如,您可以首先在容器中运行
kinit

如果您不介意在SQL分析中运行Hive而不是SparkSQL(并且还必须学习Hive),MR3上的Hive提供了在Kubernetes上运行Hive的解决方案,而安全(Kerberized)HDFS用作远程数据源。另外,从Hive3来看,Hive比SparkSQL快得多


首先使用下面的命令从hadoop获取委派令牌

  • 用你的键盘和主体做一个kinit-kt
  • 执行以下命令以将hdfs委派令牌存储在tmp路径中
    spark提交--class org.apache.hadoop.hdfs.tools.DelegationTokenFetcher”“--续订器null/tmp/spark.token
  • 添加此配置时,请执行实际的spark提交。
    --conf spark.executorEnv.HADOOP\u TOKEN\u FILE\u LOCATION=/tmp/spark.TOKEN\

  • 以上是纱线执行器的身份验证方式。对库伯内特的遗嘱执行人也是如此

    @double-beep这是一个答案。该链接支持一个事实,因此包含了相关部分。看来该功能应该可以正常工作。通过比较他们的日志,我注意到我的过程没有创建hadoop秘密。我想知道他们是否正在使用spark 2.4.0的后续版本。谢谢!我在集群模式下工作,因此我也必须将其发送给驱动程序,但在发送键表不起作用的情况下,这种方式也能起作用。kubernetes中的执行者没有使用提供的键表。这就是原因。修复程序将在Spark 3.0中发布,但这可能需要一些时间。我对它进行了更多的研究,并找到了另一种方法来获得我更喜欢的令牌。您可能只想更新您的答案以包含替代选项:hdfs fetchdt--renwer null hdfsdt.token
    --conf spark.kubernetes.kerberos.enabled=true ^
    --conf spark.kubernetes.kerberos.krb5.path=/etc/krb5.conf ^
    --conf spark.kubernetes.kerberos.keytab=/var/keytabs/USER123.keytab ^
    --conf spark.kubernetes.kerberos.principal=USER123@REALM ^