使用 Oozie 在 Hive 上执行查询时,如何解决“只能使用 kerberos 或 Web 身份验证颁发委托令牌”?

Posted

技术标签:

【中文标题】使用 Oozie 在 Hive 上执行查询时,如何解决“只能使用 kerberos 或 Web 身份验证颁发委托令牌”?【英文标题】:How to fix "Delegation Token can be issued only with kerberos or web authentication" when executing query over Hive using Oozie? 【发布时间】:2017-06-05 19:30:47 【问题描述】:

当我尝试编写通过在 oozie 中使用 hive 上下文查询 hive 获得的数据帧时,我得到以下异常。可能是什么问题

Caused by: org.apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
TungstenExchange hashpartitioning
at org.apache.spark.sql.catalyst.errors.package$.attachTree(package.scala:49)
    at org.apache.spark.sql.execution.Exchange.doExecute(Exchange.scala:247)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130)

Caused by: org.apache.hadoop.ipc.RemoteException(java.io.IOException): Delegation Token can be issued only with kerberos or web authentication
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getDelegationToken(FSNamesystem.java:7496)
    at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getDelegationToken(NameNodeRpcServer.java:548)
    at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getDelegationToken(AuthorizationProviderProxyClientProtocol.java:663)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getDelegationToken(ClientNamenodeProtocolServerSideTranslatorPB.java:981)

【问题讨论】:

认证错误:Token can be issued only with kerberos or web authentication运行Spark程序的用户是否允许访问HDFS? @AKSW:是的,我可以从 spark-submit 运行程序。仅当从 oozie 运行时才会出现此错误。我还在 oozie 的操作中设置 hive 凭据 如果您运行 Hive 操作,“hive 凭据”就可以了。但是 Spark 需要真正的 Kerberos 票证来创建自己的 HDFS/YARN 委托令牌、自己的 Hive 令牌、自己的 HBase 令牌(如果需要)等等。我猜你必须使用 --principal 和 @987654324在 Spark 命令行中使用 @ 参数,并在操作脚本中使用 <file> 元素传递 keytab。 更具体地说:在驱动程序中完成的 Spark 任务(如果在 local 模式下运行,则在执行程序中完成)可以使用 Oozie 提供的任何凭据/令牌;但如果 Spark 在 yarn-client 模式下运行并在不同的 YARN 作业中生成其执行程序,那么它需要一个成熟的 Kerberos 票证。 @SamsonScharfrichter:keytab 存在于本地目录中,而不存在于 hdfs 中。使用文件元素时会产生问题 【参考方案1】:

这是因为 Oozie 在启动 Spark 操作之前已经获得了委托令牌。

解决方案是通过在workflow.xml中的spark action中添加以下内容,让Spark不再获取Delegation token:

<spark-opts>--conf spark.yarn.security.tokens.hive.enabled=false</spark-opts>

【讨论】:

嗨@EricLin 通过shell 执行hive 我们可以做些什么改变你能看看这个问题***.com/questions/70327262/… 对不起,我很久没有和 Hive 和 Oozie 合作了,我的知识已经过时了。【参考方案2】:

上面的分析是正确的,但是解决方案对我不起作用。相反,也可以告诉 spark 忽略 oozie 已经请求的令牌,并且为我做到了:

--conf spark.yarn.security.tokens.hadoopfs.enabled=false
--conf spark.yarn.security.credentials.hadoopfs.enabled=false

【讨论】:

嘿弗兰克,你能帮忙吗:***.com/questions/70327262/…

以上是关于使用 Oozie 在 Hive 上执行查询时,如何解决“只能使用 kerberos 或 Web 身份验证颁发委托令牌”?的主要内容,如果未能解决你的问题,请参考以下文章

2-10 就业课(2.0)-oozie:5通过oozie执行hive的任务

Oozie Spark 使用 kerberos 访问 hive

oozie的shell-action中加入hive脚本命令启动执行shell同时操作hive,抛异常Container killed on request. Exit code is 143 Cont

HUE中Oozie执行Hive脚本

无法从 Oozie 工作流作业的第二次运行启动 Hive 操作

Sqoop - 使用 Oozie 导入 Hive 失败