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

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

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文件

[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文件是否正确

[root@cdh01 ~]# klist -ek fayson.keytab

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

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依赖如下

<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配置文件,内容如下:

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,内容如下:

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作业

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

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美团技术团队

【技术博客】Spark性能优化指南——基础篇

前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、...

5496
来自专栏博客园

Log4Net 配置

core中使用log4net与.Net中有所不同,在Startup类中声明一个ILoggerRepository类型

1762
来自专栏Hadoop实操

如何使用Oozie API接口向非Kerberos环境的CDH集群提交Java作业

前面Fayson介绍了《如何使用Oozie API接口向非Kerberos环境的CDH集群提交Spark作业》,本篇文章主要介绍如何使用Oozie Client...

3647
来自专栏简单聊聊Spark

Spark内核分析之spark作业的三种提交方式

        最近在研究Spark源码,顺便记录一下,供大家学习参考,如有错误,请批评指正。好,废话不多说,这一篇先来讲讲Spark作业提交流程的整体架构。

2261
来自专栏Hadoop实操

Sqoop抽数到Hive表异常分析(之二)

使用Sqoop抽取MySQL数据到Hive表时,抽取语句正常执行在数据Load到Hive表时报“Operation category READ is not s...

1573
来自专栏Spark学习技巧

必会:关于SparkStreaming checkpoint那些事儿

spark Streaming的checkpoint是一个利器,帮助在driver端非代码逻辑错误导致的driver应用失败重启,比如网络,jvm等,当然也仅限...

1412
来自专栏Hadoop实操

如何使用CDSW在CDH集群通过sparklyr提交R的Spark作业

继上一章介绍如何使用R连接Hive与Impala后,Fayson接下来讲讲如何在CDH集群中提交R的Spark作业,Spark自带了R语言的支持,在此就不做介绍...

4286
来自专栏Hadoop实操

Python3环境通过JDBC访问非Kerberos环境的Hive

在前面Fayson介绍了在Python2的环境下《如何使用Python Impyla客户端连接Hive和Impala》,本篇文章Fayson主要介绍在Pytho...

2461
来自专栏牛肉圆粉不加葱

Spark Streaming + Kakfa 编程指北

本文简述如何结合 Spark Streaming 和 Kakfa 来做实时计算。截止目前(2016-03-27)有两种方式:

1094
来自专栏北京马哥教育

Hadoop 2.0中作业日志收集原理以及配置方法

Hadoop 2.0提供了跟1.0类似的作业日志收集组件,从一定程度上可认为直接重用了1.0的代码模块,考虑到YARN已经变为通用资源管理平台,因此,提供一个通...

4306

扫码关注云+社区

领取腾讯云代金券