前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Kerberos环境下使用Spark2通过JDBC访问Impala

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

作者头像
Fayson
发布2018-07-12 15:49:26
2.4K0
发布2018-07-12 15:49:26
举报
文章被收录于专栏:Hadoop实操Hadoop实操

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

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实操

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档