使用 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