温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
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实操