|
20 | 20 |
|
21 | 21 | package com.dtstack.flink.sql.side.hbase; |
22 | 22 |
|
| 23 | +import com.dtstack.flink.sql.factory.DTThreadFactory; |
| 24 | +import com.dtstack.flink.sql.side.AbstractSideTableInfo; |
23 | 25 | import com.dtstack.flink.sql.side.BaseAsyncReqRow; |
24 | 26 | import com.dtstack.flink.sql.side.FieldInfo; |
25 | 27 | import com.dtstack.flink.sql.side.JoinInfo; |
26 | | -import com.dtstack.flink.sql.side.AbstractSideTableInfo; |
27 | 28 | import com.dtstack.flink.sql.side.hbase.rowkeydealer.AbstractRowKeyModeDealer; |
28 | 29 | import com.dtstack.flink.sql.side.hbase.rowkeydealer.PreRowKeyModeDealerDealer; |
29 | 30 | import com.dtstack.flink.sql.side.hbase.rowkeydealer.RowKeyEqualModeDealer; |
30 | 31 | import com.dtstack.flink.sql.side.hbase.table.HbaseSideTableInfo; |
31 | | -import com.dtstack.flink.sql.factory.DTThreadFactory; |
32 | 32 | import com.dtstack.flink.sql.side.hbase.utils.HbaseConfigUtils; |
| 33 | +import com.dtstack.flink.sql.util.DtFileUtils; |
33 | 34 | import com.stumbleupon.async.Deferred; |
34 | 35 | import org.apache.commons.collections.MapUtils; |
35 | 36 | import org.apache.commons.lang3.StringUtils; |
36 | 37 | import org.apache.flink.api.java.typeutils.RowTypeInfo; |
37 | 38 | import org.apache.flink.configuration.Configuration; |
38 | | -import org.apache.flink.types.Row; |
39 | | -import org.apache.flink.table.dataformat.BaseRow; |
| 39 | +import org.apache.flink.runtime.security.DynamicConfiguration; |
| 40 | +import org.apache.flink.runtime.security.KerberosUtils; |
40 | 41 | import org.apache.flink.streaming.api.functions.async.ResultFuture; |
41 | | -import org.apache.hadoop.security.UserGroupInformation; |
| 42 | +import org.apache.flink.table.dataformat.BaseRow; |
| 43 | +import org.apache.flink.types.Row; |
42 | 44 | import org.apache.hadoop.security.authentication.util.KerberosName; |
43 | 45 | import org.hbase.async.Config; |
44 | 46 | import org.hbase.async.HBaseClient; |
45 | 47 | import org.slf4j.Logger; |
46 | 48 | import org.slf4j.LoggerFactory; |
47 | 49 | import sun.security.krb5.KrbException; |
48 | 50 |
|
| 51 | +import javax.security.auth.login.AppConfigurationEntry; |
49 | 52 | import java.io.File; |
50 | | -import java.security.PrivilegedExceptionAction; |
51 | 53 | import java.util.List; |
52 | 54 | import java.util.Map; |
53 | 55 | import java.util.concurrent.ExecutorService; |
@@ -99,39 +101,34 @@ public void open(Configuration parameters) throws Exception { |
99 | 101 |
|
100 | 102 | ExecutorService executorService =new ThreadPoolExecutor(DEFAULT_POOL_SIZE, DEFAULT_POOL_SIZE, |
101 | 103 | 0L, TimeUnit.MILLISECONDS, |
102 | | - new LinkedBlockingQueue<>(), new DTThreadFactory("hbase-aysnc")); |
| 104 | + new LinkedBlockingQueue<>(), new DTThreadFactory("hbase-async")); |
103 | 105 |
|
104 | 106 | Config config = new Config(); |
105 | 107 | config.overrideConfig(HbaseConfigUtils.KEY_HBASE_ZOOKEEPER_QUORUM, hbaseSideTableInfo.getHost()); |
106 | 108 | config.overrideConfig(HbaseConfigUtils.KEY_HBASE_ZOOKEEPER_ZNODE_QUORUM, hbaseSideTableInfo.getParent()); |
107 | | - HbaseConfigUtils.loadKrb5Conf(hbaseConfig); |
108 | 109 | hbaseConfig.entrySet().forEach(entity -> { |
109 | 110 | config.overrideConfig(entity.getKey(), (String) entity.getValue()); |
110 | 111 | }); |
111 | 112 |
|
112 | | - String principal = null; |
113 | | - String keyTab = null; |
114 | | - if (HbaseConfigUtils.asyncOpenKerberos(hbaseConfig)) { |
115 | | - principal = MapUtils.getString(hbaseConfig, HbaseConfigUtils.KEY_PRINCIPAL); |
116 | | - keyTab = System.getProperty("user.dir") + File.separator + MapUtils.getString(hbaseConfig, HbaseConfigUtils.KEY_KEY_TAB); |
117 | | - String jaasStr = HbaseConfigUtils.buildJaasStr(hbaseConfig, principal, keyTab); |
118 | | - String jaasFilePath = HbaseConfigUtils.creatJassFile(jaasStr); |
119 | | - System.setProperty(HbaseConfigUtils.KEY_JAVA_SECURITY_AUTH_LOGIN_CONF, jaasFilePath); |
120 | | - config.overrideConfig(HbaseConfigUtils.KEY_JAVA_SECURITY_AUTH_LOGIN_CONF, jaasFilePath); |
| 113 | + if (HbaseConfigUtils.isEnableKerberos(hbaseConfig)) { |
| 114 | + HbaseConfigUtils.loadKrb5Conf(hbaseConfig); |
| 115 | + String principal = MapUtils.getString(hbaseConfig, HbaseConfigUtils.KEY_PRINCIPAL); |
| 116 | + HbaseConfigUtils.checkOpt(principal, HbaseConfigUtils.KEY_PRINCIPAL); |
| 117 | + String regionserverPrincipal = MapUtils.getString(hbaseConfig, HbaseConfigUtils.KEY_HBASE_KERBEROS_REGIONSERVER_PRINCIPAL); |
| 118 | + HbaseConfigUtils.checkOpt(regionserverPrincipal, HbaseConfigUtils.KEY_HBASE_KERBEROS_REGIONSERVER_PRINCIPAL); |
| 119 | + String keytab = MapUtils.getString(hbaseConfig, HbaseConfigUtils.KEY_KEY_TAB); |
| 120 | + HbaseConfigUtils.checkOpt(keytab, HbaseConfigUtils.KEY_KEY_TAB); |
| 121 | + String keytabPath = System.getProperty("user.dir") + File.separator + keytab; |
| 122 | + DtFileUtils.checkExists(keytabPath); |
| 123 | + |
| 124 | + LOG.info("Kerberos login with keytab: {} and principal: {}", keytab, principal); |
| 125 | + String name = "HBaseClient"; |
| 126 | + config.overrideConfig("hbase.sasl.clientconfig", name); |
| 127 | + appendJaasConf(name, keytab, principal); |
121 | 128 | refreshConfig(); |
122 | 129 | } |
123 | 130 |
|
124 | | - hBaseClient = null; |
125 | | - if (HbaseConfigUtils.asyncOpenKerberos(hbaseConfig)) { |
126 | | - hBaseClient = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keyTab).doAs(new PrivilegedExceptionAction<HBaseClient>() { |
127 | | - @Override |
128 | | - public HBaseClient run() throws Exception { |
129 | | - return new HBaseClient(config, executorService); |
130 | | - } |
131 | | - }); |
132 | | - } else { |
133 | | - hBaseClient = new HBaseClient(config, executorService); |
134 | | - } |
| 131 | + hBaseClient = new HBaseClient(config, executorService); |
135 | 132 |
|
136 | 133 | try { |
137 | 134 | Deferred deferred = hBaseClient.ensureTableExists(tableName) |
@@ -165,6 +162,16 @@ private void refreshConfig() throws KrbException { |
165 | 162 | // javax.security.auth.login.Configuration.setConfiguration(null); |
166 | 163 | } |
167 | 164 |
|
| 165 | + private void appendJaasConf(String name, String keytab, String principal) { |
| 166 | + javax.security.auth.login.Configuration priorConfig = javax.security.auth.login.Configuration.getConfiguration(); |
| 167 | + // construct a dynamic JAAS configuration |
| 168 | + DynamicConfiguration currentConfig = new DynamicConfiguration(priorConfig); |
| 169 | + // wire up the configured JAAS login contexts to use the krb5 entries |
| 170 | + AppConfigurationEntry krb5Entry = KerberosUtils.keytabEntry(keytab, principal); |
| 171 | + currentConfig.addAppConfigurationEntry(name, krb5Entry); |
| 172 | + javax.security.auth.login.Configuration.setConfiguration(currentConfig); |
| 173 | + } |
| 174 | + |
168 | 175 | @Override |
169 | 176 | public void handleAsyncInvoke(Map<String, Object> inputParams, Row input, ResultFuture<BaseRow> resultFuture) throws Exception { |
170 | 177 | rowKeyMode.asyncGetData(tableName, buildCacheKey(inputParams), input, resultFuture, sideInfo.getSideCache()); |
|
0 commit comments