Spark集群模式下的Impala JDBC连接问题

Posted

技术标签:

【中文标题】Spark集群模式下的Impala JDBC连接问题【英文标题】:Impala JDBC connection issue in spark cluster mode 【发布时间】:2018-02-26 07:59:18 【问题描述】:

在集群模式下运行 spark 作业时,Impala jdbc 连接抛出异常。 Spark 作业创建 hive 表并使用 JDBC 使 impala 表无效/刷新。相同的作业在 spark 客户端模式下成功执行。

java.sql.SQLException: [Simba][ImpalaJDBCDriver](500164) Error initialized or created transport for authentication: [Simba][ImpalaJDBCDriver](500169) Unable to connect to server: GSS initiate failed. at om.cloudera.hivecommon.api.HiveServer2ClientFactory.createTransport(Unknown Source)
    at com.cloudera.hivecommon.api.HiveServer2ClientFactory.createClient(Unknown Source)
    at com.cloudera.hivecommon.core.HiveJDBCCommonConnection.connect(Unknown Source)
    at com.cloudera.impala.core.ImpalaJDBCConnection.connect(Unknown Source)
    at com.cloudera.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
    at com.cloudera.jdbc.common.AbstractDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)

【问题讨论】:

【参考方案1】:
  protected def getImpalaConnection(impalaJdbcDriver: String, impalaJdbcUrl: String): Connection = 
if (impalaJdbcDriver.length() == 0) return null
try 
  Class.forName(impalaJdbcDriver).newInstance
  UserGroupInformation.getLoginUser.doAs(
    new PrivilegedAction[Connection] 
      override def run(): Connection = DriverManager.getConnection(impalaJdbcUrl)
    
  )
 catch 
  case e: Exception => 
    println(e.toString() + " --> " + e.getStackTraceString)
    throw e
  
 

val   impalaJdbcDriver = "com.cloudera.impala.jdbc41.Driver"

val impalaJdbcUrl = "jdbc:impala://<Impala_Host>:21050/default;AuthMech=1;SSL=1;KrbRealm=HOST.COM;KrbHostFQDN=_HOST;KrbServiceName=impala;REQUEST_POOL=xyz"

println("Start impala connection")

val impalaConnection = getImpalaConnection(impalaJdbcDriver,impalaJdbcUrl)


val result = impalaConnection.createStatement.executeQuery(s"SELECT COUNT(1) FROM testTable")
println("End impala connection")

构建厚罐并使用以下给定的火花提交命令。如果需要,您可以传递其他参数,例如文件、jar。

Spark 提交命令:

spark-submit --master yarn-cluster --keytab /home/testuser/testuser.keytab --principal testuser@host.COM  --queue xyz--class com.dim.UpdateImpala

根据您的 spark 版本进行如下更改

对于 Spark1:UserGroupInformation.getLoginUser

对于 Spark2:UserGroupInformation.getCurrentUser

【讨论】:

感谢您与我们分享您的问题的答案!您能解释一下为什么会出现错误以及您在做什么吗? @eliasah:我在集群(启用了 Kerbores)模式下的 spark 作业中遇到了 Impala JDBC 连接问题。大多数论坛都建议在 spark-submit 命令中传递 keytab 和 principal,但在我的情况下它不起作用。为了解决这个问题,我对 JDBC 连接代码进行了更改,并且成功了。 我没有找我。我要求它可以与社区共享。谢谢你:)

以上是关于Spark集群模式下的Impala JDBC连接问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spark 数据帧写入 impala 数据库

使用Java代码通过JDBC连接只启用Sentry的Impala异常分析

spark、hive、impala、hdfs的常用命令

如何使用java代码通过JDBC连接Impala(附Github源码)

impala-kudu

如何使用 JDBC 在 Spark 中的其他数据库中获取表的创建语句