python使用spark sql查询impala_如何在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依赖如下

org.apache.spark

spark-core_2.11

2.2.0.cloudera2

org.apache.spark

spark-sql_2.11

2.2.0.cloudera2

(可左右滑动)

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值