package com.primeton.dsp.datarelease.data.bdata;
import com.primeton.dsp.datarelease.server.model.DspHiveResource;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Set;
/**
*
* Hive Kerberos 认证方式获得连接
*
*
*
*
* Created by zhaopx.
* User: zhaopx
* Date: 2020/4/22
* Time: 18:02
*
*
*
* @author zhaopx
*/
@Slf4j
public class Krb5HiveConnectionServiceImpl implements HiveConnectionService {
/**
* Hive 数据源
*/
final DspHiveResource hiveResource;
String hiveUrl;
public Krb5HiveConnectionServiceImpl(DspHiveResource hiveResource) {
this.hiveResource = hiveResource;
}
@Override
public boolean doAuth() {
//KrbUser = "hadoop/cdh-node1@HADOOP.COM";
// 认证传过来
AuthPrincipalCreator authPrincipalCreator = AuthPrincipalCreator.useDataReleaseConf(hiveResource.getAuthBasePath());
Set principals = authPrincipalCreator.listPrincipals();
log.info("find existed principals: {}", principals);
AuthPrincipal kerberosPrincipal = authPrincipalCreator.getKerberosPrincipal(hiveResource.getHiveDbUser());
String userKeytab = kerberosPrincipal.getUserKeytabFile().getAbsolutePath();
String krb5File = kerberosPrincipal.getKrb5File().getAbsolutePath();
String krbUser = kerberosPrincipal.getPrincipal();
StringBuffer buffer = new StringBuffer(hiveResource.getHiveUrl());
buffer.append(";principal=").append(krbUser);
hiveUrl = buffer.toString();
log.info("HIVE_URL : " + hiveUrl);
// 分别加载 core、hdfs、hive site 文件
Configuration conf = new Configuration();
try {
if (kerberosPrincipal.getCoreSite() != null) {
conf.addResource(kerberosPrincipal.getCoreSite().toURL());
log.info("add config: {}", kerberosPrincipal.getCoreSite().getAbsolutePath());
}
if (kerberosPrincipal.getHdfsSite() != null) {
conf.addResource(kerberosPrincipal.getHdfsSite().toURL());
log.info("add config: {}", kerberosPrincipal.getHdfsSite().getAbsolutePath());
}
if (kerberosPrincipal.getHiveSite() != null) {
conf.addResource(kerberosPrincipal.getHiveSite().toURL());
log.info("add config: {}", kerberosPrincipal.getHiveSite().getAbsolutePath());
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
// Kerberos 认证
KerberosUtil.loginKerberos(conf, krbUser, userKeytab, krb5File);
log.info("hive kerberos 认证通过。");
return true;
}
@Override
public Connection getConnection() throws SQLException {
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
} catch (ClassNotFoundException e) {
throw new SQLException("找不到Hive驱动:org.apache.hive.jdbc.HiveDriver.", e);
}
return DriverManager.getConnection(hiveUrl, "", "");
}
}