【Spark】spark使用jdbc连接带有kerberos认证的hive jdbc

背景

这个需求就是spark不通过spark-hive的方式访问hive数据,而是通过spark读取hive jdbc的方式访问hive数据,因为这个hivekerberos认证,在网上也不是很容易搜索到这样的操作案例。不多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的参数。
至此,整个教程结束。
最后到服务器上跑一把就好了。

总结

如果各位阅读过的大佬,有什么更好建议请在评论区中留言,谢谢大哥们!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spark可以通过使用Hive的元数据来访问Hive表。要在Spark中整合Hive,需要在启动Spark时将Hive的JAR文件添加到Spark的CLASSPATH中。同时,还需要在SparkConf中设置hive.metastore.uris属性,以指定Hive元数据存储的位置。 在进行Kerberos认证时,需要在SparkConf中设置以下属性: - spark.authenticate.enableSasl:启用SASL认证。 - spark.yarn.security.credentials.hive.enabled:启用HiveKerberos认证。 - spark.hadoop.security.authentication:设置Hadoop的认证方式为Kerberos。 - spark.hadoop.security.authorization:启用Hadoop的授权功能。 此外,还需要在启动Spark时指定Kerberos的相关配置,包括Kerberos的keytab文件和principal。 例如,可以使用以下代码启动Spark并进行Kerberos认证: ``` val conf = new SparkConf() .setAppName("Spark Hive Kerberos") .setMaster("yarn") .set("spark.authenticate.enableSasl", "true") .set("spark.yarn.security.credentials.hive.enabled", "true") .set("spark.hadoop.security.authentication", "kerberos") .set("spark.hadoop.security.authorization", "true") .set("spark.executor.extraJavaOptions", "-Djava.security.auth.login.config=/path/to/jaas.conf") .set("spark.driver.extraJavaOptions", "-Djava.security.auth.login.config=/path/to/jaas.conf") UserGroupInformation.setConfiguration(conf) UserGroupInformation.loginUserFromKeytab("[email protected]", "/path/to/user.keytab") val spark = SparkSession.builder() .config(conf) .enableHiveSupport() .getOrCreate() ``` 其中,/path/to/jaas.conf是Kerberos的JAAS配置文件,[email protected]Kerberos的principal,/path/to/user.keytab是Kerberos的keytab文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值