背景
这个需求就是spark不通过spark-hive的方式访问hive数据,而是通过spark读取hive jdbc的方式访问hive数据,因为这个hive有kerberos认证,在网上也不是很容易搜索到这样的操作案例。不多bb,直接上教程。
准备工作
准备一个hive-jaas.conf内容如下:
com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="xxx.keytab"
principal="xxx@XXX.XXX.COM"
doNotPrompt=true;
};
这里的头的xxx替换成你环境中对应的配置就行了
测试代码如下:
public class App {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder().master("local").getOrCreate();
JdbcDialects.registerDialect(new HiveDialect());
Properties properties = new Properties();
properties.setProperty("driver", "org.apache.hive.jdbc.HiveDriver");
Dataset<Row> jdbcDF = spark.read().jdbc("jdbc:hive2://your_hive_server2_address:10000/database;principal=hive/_HOST@XXX.COM;auth=Kerberos", "database.table", properties);
jdbcDF.show();
spark.stop();
}
}
这个代码的作用就是使用spark jdbc API通过hive jdbc去连接hive读取hive中的一张表,然后执行展示。
这里要注意下这个jdbc的连接地址和后面跟随的参数:
jdbc:hive2://your_hive_server2_address:10000/database;principal=hive/_HOST@XXX.COM;auth=Kerberos
里头your_hive_server2_address写成你的环境里对应的地址。
后面的principal 也是配置成你的环境中对应的principal
这里头有一个HiveDialect是因为我测试的时候,发现在spark jdbc生成查询语句的时候查询语句会是select 'database.column1',database.column2'....这样的查询sql,程序是会报错的。如果有这样的问题的话,需要注册一个自定义的Spark jdbc的方言
- HiveDialect 代码类如下:
public class HiveDialect extends JdbcDialect {
@Override
public boolean canHandle(String url) {
return url.startsWith("jdbc:hive2") || url.contains("hive");
}
@Override
public String quoteIdentifier(String colName) {
colName=colName.split("\\.")[1];
return "`" + colName + "`";
}
}
代码差不多写完了。最后使用maven打包上传到服务器上,包括那个hive-jaas.conf文件,还要额外上传 krb5.conf,xxx.keytab文件上去。
提交命令:
spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-memory 2G \
--driver-cores 2 \
--num-executors 2 \
--executor-memory 2G \
--executor-cores 2 \
--files file:///opt/xxx.keytab,file:///opt/krb5.conf,file:///opt/hive-jaas.conf \
--conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=hive-jaas.conf -Djavax.security.auth.useSubjectCredsOnly=false -Djava.security.krb5.conf=krb5.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=hive-jaas.conf -Djavax.security.auth.useSubjectCredsOnly=false -Djava.security.krb5.conf=krb5.conf" \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.yarn.maxAppAttempts=1 \
--name spark_read_jdbc_with_hive \
--class com.example.App \
example-spark-read-hive-jdbc-1.0-SNAPSHOT.jar
注意里头的--files 参数和--conf的参数。
至此,整个教程结束。
最后到服务器上跑一把就好了。
总结
如果各位阅读过的大佬,有什么更好建议请在评论区中留言,谢谢大哥们!

本文提供了一个教程,详细说明如何使用Spark通过HiveJDBC而不依赖spark-hive的方式访问Hive数据,特别是在存在Kerberos认证的环境中。主要内容包括编写hive-jaas.conf配置文件,创建处理Hive方言的自定义SparkJDBC类,以及使用SparkSubmit命令进行集群部署时的参数设置。
1727

被折叠的 条评论
为什么被折叠?



