Oozie Spark 使用 kerberos 访问 hive

Posted

技术标签:

【中文标题】Oozie Spark 使用 kerberos 访问 hive【英文标题】:Oozie Spark access to hive with kerberos 【发布时间】:2018-09-26 18:31:08 【问题描述】:

当我在 oozie 中执行 spark 过程时,出现以下错误。找不到数据库。

2018-09-26 15:27:23,576 INFO [main] org.apache.spark.deploy.yarn.Client: 
     client token: Token  kind: YARN_CLIENT_TOKEN, service:  
     diagnostics: User class threw exception: org.apache.spark.sql.catalyst.analysis.NoSuchDatabaseException: Database 'zdm_datos_externos' not found;
     ApplicationMaster host: 10.74.234.6
     ApplicationMaster RPC port: 0
     queue: default
     queue user: administrador
     start time: 1537986410475
     final status: FAILED
     tracking URL: https://BR-PC-CentOS-02:26001/proxy/application_1537467570666_4127/
     user: administrador

这是我的火花配置

    String warehouseLocation = new File("spark-warehouse").getAbsolutePath();
    SparkSession spark = SparkSession
            .builder()
            .appName("Java Spark Hive Example")
            .master("yarn")
            .config("spark.sql.warehouse.dir", warehouseLocation)
            .config("spark.driver.maxResultSize", "3g")
            .config("spark.debug.maxToStringFields", "10000")
            .config("spark.sql.crossJoin.enabled", "true")
            .enableHiveSupport()
            .getOrCreate();
    spark.conf().set("spark.driver.maxResultSize", "3g");

元存储,当前连接数:1 2018-09-26 17:31:42,598 WARN [main] hive.metastore:set_ugi() 不成功,可能原因:新客户端 与旧服务器交谈。继续没有它。 org.apache.thrift.transport.TTransportException 在 org.apache.thrift.transport.TiostreamTransport.read(TIOStreamTransport.java:132) 在 org.apache.thrift.transport.TTransport.readAll(TTransport.java:86) 在 org.apache.thrift.protocol.TBinaryProtocol.readStringBody(TBinaryProtocol.java:380) 在 org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:230) 在 org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:77) 在 org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_set_ugi(ThriftHiveMetastore.java:3748) 在 org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.set_ugi(ThriftHiveMetastore.java:3734) 在 org.apache.hadoop.hive.metastore.HiveMetaStoreClient.open(HiveMetaStoreClient.java:557) 在 org.apache.hadoop.hive.metastore.HiveMetaStoreClient.(HiveMetaStoreClient.java:249) 在 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.(SessionHiveMetaStoreClient.java:74) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1533) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.(RetryingMetaStoreClient.java:86) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132) 在 org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104) 在 org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3157) 在 org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3176) 在 org.apache.hadoop.hive.ql.metadata.Hive.getAllFunctions(Hive.java:3409) 在 org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:178) 在 org.apache.hadoop.hive.ql.metadata.Hive.(Hive.java:170) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider$$anonfun$obtainCredentials$1.apply$mcV$sp(HiveCredentialProvider.scala:91) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider$$anonfun$obtainCredentials$1.apply(HiveCredentialProvider.scala:90) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider$$anonfun$obtainCredentials$1.apply(HiveCredentialProvider.scala:90) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider$$anon$1.run(HiveCredentialProvider.scala:124) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1778) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider.doAsRealUser(HiveCredentialProvider.scala:123) 在 org.apache.spark.deploy.yarn.security.HiveCredentialProvider.obtainCredentials(HiveCredentialProvider.scala:90) 在 org.apache.spark.deploy.yarn.security.ConfigurableCredentialManager$$anonfun$obtainCredentials$2.apply(ConfigurableCredentialManager.scala:82) 在 org.apache.spark.deploy.yarn.security.ConfigurableCredentialManager$$anonfun$obtainCredentials$2.apply(ConfigurableCredentialManager.scala:80) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 在 scala.collection.Iterator$class.foreach(Ite​​rator.scala:893) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1336) 在 scala.collection.MapLike$DefaultValuesIterable.foreach(MapLike.scala:206) 在 scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 在 scala.collection.AbstractTraversable.flatMap(Traversable.scala:104) 在 org.apache.spark.deploy.yarn.security.ConfigurableCredentialManager.obtainCredentials(ConfigurableCredentialManager.scala:80) 在 org.apache.spark.deploy.yarn.Client.prepareLocalResources(Client.scala:430) 在 org.apache.spark.deploy.yarn.Client.createContainerLaunchContext(Client.scala:915) 在 org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:195) 在 org.apache.spark.deploy.yarn.Client.run(Client.scala:1205) 在 org.apache.spark.deploy.yarn.Client$.main(Client.scala:1261) 在 org.apache.spark.deploy.yarn.Client.main(Client.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:761) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:190) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:215) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:129) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 在 org.apache.oozie.action.hadoop.SparkMain.runSpark(SparkMain.java:113) 在 org.apache.oozie.action.hadoop.SparkMain.run(SparkMain.java:104) 在 org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:47) 在 org.apache.oozie.action.hadoop.SparkMain.main(SparkMain.java:38) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:238) 在 org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 在 org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 在 org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:187) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422)

【问题讨论】:

您是否使用<file> 指令将hive-site.xml 转储到容器的工作目录? 当我这样做时,会产生错误。错误:工作流提交失败。 【参考方案1】:

您使用的是什么版本的 Spark?您是否在 sparkSession 上启用了 Hive 支持?

sparkBuilder.enableHiveSupport().appName(appName).getOrCreate()

【讨论】:

以上是关于Oozie Spark 使用 kerberos 访问 hive的主要内容,如果未能解决你的问题,请参考以下文章

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

使用自定义 spark 版本启动 Oozie 作业

使用火花动作在 Oozie 中的 python Spark 作业

Oozie Spark on YARN requirement failed

在 Oozie-Spark 动作中添加多个罐子

大数据篇:oozie与spark2整合进行资源调度