如何在Kerberos环境下使用Spark2通过JDBC访问Impala

2018-07-12 15:49:26 浏览数 (1)

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.文档编写目的


在前面Fayson介绍了在Kerberos和非Kerberos环境下使用JAVA通过JDBC访问Hive和Impala《如何使用java代码通过JDBC连接Hive》和《如何使用java代码通过JDBC连接Impala》,本篇文章Fayson主要介绍如何在Kerberos环境下使用Spark2通过JDBC访问Impala。

  • 内容概述:

1.环境准备

2.Spark2JDBC示例代码及运行

3.总结

  • 测试环境:

1.CM5.14.3/CDH5.14.2

2.SPARK2.2.0

3.操作系统版本为Redhat7.3

4.采用root用户进行操作

5.集群已启用Kerberos

2.环境准备


1.准备访问Impala的Keytab文件,使用xst命令导出keytab文件

代码语言:javascript复制
[root@cdh01 ~]# kadmin.local 
Authenticating as principal hbase/admin@FAYSON.COM with password.
kadmin.local:  xst -norandkey -k fayson.keytab fayson@FAYSON.COM

(可左右滑动)

使用klist命令检查导出的keytab文件是否正确

代码语言:javascript复制
[root@cdh01 ~]# klist -ek fayson.keytab

2.准备jaas-impala.cof文件内容如下:

代码语言:javascript复制
com.sun.security.jgss.krb5.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/data/disk1/spark-jdbc-impala/conf/fayson.keytab"
  principal="fayson@FAYSON.COM"
  doNotPrompt=true;
};

(可左右滑动)

将fayson.keytab和jaas-impala.conf文件拷贝至集群的所有节点统一的/data/disk1/spark-jdbc/conf目录下。

3.下载ImpalaJDBC驱动,将解压出来的ImpalaJDBC41.jar拷贝至集群所有节点/opt/cloudera/parcels/SPARK2/lib/spark2/jars目录下

下载地址如下:

https://www.cloudera.com/downloads/connectors/impala/jdbc/2-6-3.html

注意:需要将依赖包拷贝至集群所有节点。

3.Spark2JDBC示例代码


1.使用maven创建scala语言的spark2demo工程,pom.xml依赖如下

代码语言:javascript复制
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.2.0.cloudera2</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.2.0.cloudera2</version>
</dependency>

(可左右滑动)

2.在resources下创建0290-jdbc.properties配置文件,内容如下:

代码语言:javascript复制
driver=com.cloudera.impala.jdbc41.Driver
url=jdbc:impala://cdh02.fayson.com:21050/default;AuthMech=1;KrbRealm=FAYSON.COM;KrbHostFQDN=cdh02.fayson.com;KrbServiceName=impala
dbtable=user_info

(可左右滑动)

如上参数为spark.jdbc中的参数,参考Spark官网

http://spark.apache.org/docs/2.2.0/sql-programming-guide.html#jdbc-to-other-databases

注意: 0290-jdbc.properties配置文件中的参数要与官网一致,在代码中直接将properties转换为Map传入了spark.options(map)中。

3.创建Spark2ImpalaJDBC.scala类,用户访问Impala,内容如下:

代码语言:javascript复制
package com.cloudera.jdbc

import java.io.{File, FileInputStream}
import java.util.Properties
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

/**
  * package: com.cloudera.jdbc
  * describe: Spark2使用JDBC方式访问Kerberos环境下的Impala
  * 该示例使用到的配置文件有0290-jdbc.properties和jaas-impala.conf
  * creat_user: Fayson 
  * email: htechinfo@163.com
  * creat_date: 2018/6/27
  * creat_time: 下午4:25
  * 公众号:Hadoop实操
  */
object Spark2ImpalaJDBC {

  var confPath: String = System.getProperty("user.dir")   File.separator   "conf"

  def main(args: Array[String]): Unit = {

    //加载配置文件
    val properties = new Properties()
    val file = new File(confPath   File.separator   "0290-jdbc.properties")
    if(!file.exists()) {
      val in = Spark2ImpalaJDBC.getClass.getClassLoader.getResourceAsStream("0290-jdbc.properties")
      properties.load(in);
    } else {
      properties.load(new FileInputStream(file))
    }
    //将加载的properties对象转换为Scala中的MAP对象
    import scala.collection.JavaConverters._
    val map = properties.asScala

    val sparkConf = new SparkConf()
//    sparkConf.set("spark.executor.extraJavaOptions","-Djava.security.auth.login.config=/data/disk1/spark-jdbc-impala/conf/jaas-impala.conf -Djavax.security.auth.useSubjectCredsOnly=false")

    //初始化SparkContext
    val spark = SparkSession
      .builder().config(sparkConf)
      .appName("Spark2-JDBC-Impala-Kerberos")
      .getOrCreate()

    //通过jdbc访问Impala获取一个DataFrame
    val dataframe = spark.read.format("jdbc").options(map).load()
    dataframe.show(10)
  }
}

(可左右滑动)

4.使用mvn命令编译工程,注意由于是scala工程编译时mvn命令要加scala:compile

5.将编译好的spark2-demo-1.0-SNAPSHOT.jar包上传至服务器

0290-jdbc.properties配置文件内容如下:

jaas-impala.conf文件内容如下:

将spark-jdbc-impala目录拷贝至集群的所有节点的/data/disk1目录下

4.示例运行


1.使用spark2-submit命令向集群提交Spark作业

代码语言:javascript复制
spark2-submit --class com.cloudera.jdbc.Spark2ImpalaJDBC 
--master yarn 
--deploy-mode client 
--executor-memory 2g 
--executor-cores 2 
--driver-memory 2g 
--num-executors 2 
--principal fayson@FAYSON.COM 
--keytab /data/disk1/spark-jdbc-impala/conf/fayson.keytab 
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/data/disk1/spark-jdbc-impala/conf/jaas-impala.conf -Djavax.security.auth.useSubjectCredsOnly=false" 
spark2-demo-1.0-SNAPSHOT.jar

(可左右滑动)

通过CM查看作业是否提交成功

作业执行成功

查询出来的数据如下:

5.总结


1.通过JDBC访问Impala需要将Impala的JDBC驱动包加载到部署到集群所有节点的/opt/cloudera/parcels/SPARK2/lib/spark2/jars目录下。

2.Spark2在访问Kerberos环境下的JDBC时需要指定Spark的Executor JVM运行环境参数使Executor加载jass-impala.conf和指定javax.security.auth.useSubjectCredsOnly为false否则在访问Impala时会抛认证失败的异常。

3.在提交Spark作业使用到的jaas-impala.conf和fayson.keytab文件需要在集群的所有节点存在,因为Spark的Executor是随机在集群的节点上运行。

GitHub地址如下:

https://github.com/fayson/cdhproject/blob/master/spark2demo/src/main/scala/com/cloudera/jdbc/Spark2ImpalaJDBC.scala

https://github.com/fayson/cdhproject/blob/master/spark2demo/src/main/resources/jaas-impala.conf

https://github.com/fayson/cdhproject/blob/master/spark2demo/src/main/resources/0290-jdbc.properties

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

0 人点赞