【问题标题】:Spark/Phoenix with Kerberos on YARNSpark/Phoenix 在 YARN 上使用 Kerberos
【发布时间】:2016-11-08 10:27:36
【问题描述】:

我有一个运行在非 Kerberos 集群上的 Spark (1.4.1) 应用程序,我将它复制到另一个运行 Kerberos 的实例。该应用程序从 HDFS 获取数据并将其放入 Phoenix。

但是,它不起作用:

    ERROR ipc.AbstractRpcClient: SASL authentication failed. The most likely cause is missing or invalid credentials. Consider 'kinit'.
    javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
            at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
            at org.apache.hadoop.hbase.security.HBaseSaslRpcClient.saslConnect(HBaseSaslRpcClient.java:179)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupSaslConnection(RpcClientImpl.java:611)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.access$600(RpcClientImpl.java:156)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:737)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection$2.run(RpcClientImpl.java:734)
            at java.security.AccessController.doPrivileged(Native Method)
            at javax.security.auth.Subject.doAs(Subject.java:422)
            at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.setupIOstreams(RpcClientImpl.java:734)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.writeRequest(RpcClientImpl.java:887)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl$Connection.tracedWriteRequest(RpcClientImpl.java:856)
            at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1200)
            at org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213)
            at org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287)
            at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingStub.isMasterRunning(MasterProtos.java:50918)
            at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$MasterServiceStubMaker.isMasterRunning(ConnectionManager.java:1564)
            at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(ConnectionManager.java:1502)
            at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStub(ConnectionManager.java:1524)
            at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(ConnectionManager.java:1553)
            at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.getKeepAliveMasterService(ConnectionManager.java:1704)
            at org.apache.hadoop.hbase.client.MasterCallable.prepare(MasterCallable.java:38)
            at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:124)
            at org.apache.hadoop.hbase.client.HBaseAdmin.executeCallable(HBaseAdmin.java:3917)
            at org.apache.hadoop.hbase.client.HBaseAdmin.getTableDescriptor(HBaseAdmin.java:441)
            at org.apache.hadoop.hbase.client.HBaseAdmin.getTableDescriptor(HBaseAdmin.java:463)
            at org.apache.phoenix.query.ConnectionQueryServicesImpl.ensureTableCreated(ConnectionQueryServicesImpl.java:815)
            at org.apache.phoenix.query.ConnectionQueryServicesImpl.createTable(ConnectionQueryServicesImpl.java:1215)
            at org.apache.phoenix.query.DelegateConnectionQueryServices.createTable(DelegateConnectionQueryServices.java:112)
            at org.apache.phoenix.schema.MetaDataClient.createTableInternal(MetaDataClient.java:1902)
            at org.apache.phoenix.schema.MetaDataClient.createTable(MetaDataClient.java:744)
            at org.apache.phoenix.compile.CreateTableCompiler$2.execute(CreateTableCompiler.java:186)
            at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:304)
            at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:296)
            at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
            at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:294)
            at org.apache.phoenix.jdbc.PhoenixStatement.executeUpdate(PhoenixStatement.java:1243)
            at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:1893)
            at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:1862)
            at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:77)
            at org.apache.phoenix.query.ConnectionQueryServicesImpl.init(ConnectionQueryServicesImpl.java:1862)
            at org.apache.phoenix.jdbc.PhoenixDriver.getConnectionQueryServices(PhoenixDriver.java:180)
            at org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.connect(PhoenixEmbeddedDriver.java:132)
            at org.apache.phoenix.jdbc.PhoenixDriver.connect(PhoenixDriver.java:151)
            at java.sql.DriverManager.getConnection(DriverManager.java:664)
            at java.sql.DriverManager.getConnection(DriverManager.java:208)
            at org.apache.phoenix.mapreduce.util.ConnectionUtil.getConnection(ConnectionUtil.java:99)
            at org.apache.phoenix.mapreduce.util.ConnectionUtil.getInputConnection(ConnectionUtil.java:57)
            at org.apache.phoenix.mapreduce.util.ConnectionUtil.getInputConnection(ConnectionUtil.java:45)
            at org.apache.phoenix.mapreduce.util.PhoenixConfigurationUtil.getSelectColumnMetadataList(PhoenixConfigurationUtil.java:263)
            at org.apache.phoenix.spark.PhoenixRDD.toDataFrame(PhoenixRDD.scala:109)
            at org.apache.phoenix.spark.SparkSqlContextFunctions.phoenixTableAsDataFrame(SparkSqlContextFunctions.scala:37)
            at com.bosch.asc.utils.HBaseUtils$.scanPhoenix(HBaseUtils.scala:123)
            at com.bosch.asc.SMTProcess.addLookup(SMTProcess.scala:1125)
            at com.bosch.asc.SMTProcess.saveMountTraceLogToPhoenix(SMTProcess.scala:1039)
            at com.bosch.asc.SMTProcess.runETL(SMTProcess.scala:87)
            at com.bosch.asc.SMTProcessMonitor$delayedInit$body.apply(SMTProcessMonitor.scala:20)
            at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
            at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
            at scala.App$$anonfun$main$1.apply(App.scala:71)
            at scala.App$$anonfun$main$1.apply(App.scala:71)
            at scala.collection.immutable.List.foreach(List.scala:318)
            at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
            at scala.App$class.main(App.scala:71)
            at com.bosch.asc.SMTProcessMonitor$.main(SMTProcessMonitor.scala:5)
            at com.bosch.asc.SMTProcessMonitor.main(SMTProcessMonitor.scala)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:486)
    Caused by: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
            at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)
            at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
            at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)
            at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
            at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
            at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
            at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)
            ... 70 more

我已经添加了

export _JAVA_OPTIONS="-Djava.security.krb5.conf=/etc/hadoop/krb5.conf"

在我的 Spark 提交脚本中,但无济于事。我是否必须更改代码本身才能进行身份验证?我之前假设票证只是在应用程序之间共享,代码本身并没有改变。

如果有帮助:在 shell 中,我在执行时看不到 spark.authenticate 选项集:

sc.getConf.getAll.foreach(println)

见:http://spark.apache.org/docs/latest/security.html

我对 Kerberos 的经验很少,因此非常感谢任何帮助。

【问题讨论】:

  • 启用 Kerberos 调试信息:export HADOOP_JAAS_DEBUG=true 加上 -Dsun.security.krb5.debug=true
  • 您是否在“本地”模式下运行 Spark?否则,执行程序可能在它们运行的​​主机上没有有效的 Kerberos 票证,您必须自己管理 Hadoop 身份验证,参见。 stackoverflow.com/questions/35332026/…
  • 不,它在 YARN 上以集群模式运行。
  • 启用调试后,我看到生成了一堆 Kerberos 票证,但我仍然收到相同的错误以及由 org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.io.IOException: Could not set up IO Streams to ... 引起的 yarn.ApplicationMaster: User class threw exception: org.apache.phoenix.exception.PhoenixIOException: Failed after attempts=35。我还发现this link 似乎 Kerberos 需要修改连接字符串。所以没有kinit?

标签: apache-spark kerberos hadoop-yarn phoenix


【解决方案1】:

假设您的集群已正确使用 kerberized,请使用以下命令初始化您的凭据:

kinit -kt /path/to/keytab/file user/domain@realm

【讨论】:

  • 我这样做了,但我仍然收到相同的信息。 Phoenix(使用 Phoenix/Spark 库)似乎不接受该票。我什至在 Spark 中添加了 keytabprincipal 参数。
【解决方案2】:

我认为原因是在 4.4 上,Phoenix/Spark 库不处理 Kerberos 主体和密钥表:https://issues.apache.org/jira/browse/PHOENIX-2817

我尝试从现有 Phoenix 表中读取数据,但发现没有找到合适的驱动程序,并且 jdbc 连接字符串不包含 keytab 和主体(即使 hbase-site.xml 已正确添加且 HBase 配置我传递给 Phoenix 有这些值)如下所示:https://phoenix.apache.org/index.html#Connection

【讨论】:

  • 在阅读该 JIRA 的讨论主题时,很明显 Kerberos 是一个症状,真正的问题是 Phoenix 如何处理 ZooKeeper(它有自己的方式处理 Kerberos).
  • 那么...您是否尝试过 JIRA 线程底部建议的解决方法?或者您是否考虑升级到更新版本的 Phoenix?
  • 您尝试了哪一个 - 解决方法还是升级?
  • 我无法升级,因为那不在我手中。解决方法对我不起作用。
  • 好吧,看来你碰壁了:-/
【解决方案3】:

在多次出现错误后我遇到了同样的问题,我能够解决这个问题,请点击下面的链接以获得答案+解释 Spark Streaming and Phoenix Kerberos issue

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2016-11-17
    • 2017-09-01
    相关资源
    最近更新 更多