[ https://issues.apache.org/jira/browse/DRILL-8279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17579670#comment-17579670 ]
ASF GitHub Bot commented on DRILL-8279: --------------------------------------- jnturton commented on code in PR #2622: URL: https://github.com/apache/drill/pull/2622#discussion_r945557835 ########## contrib/storage-phoenix/README.md: ########## @@ -83,11 +83,11 @@ Tips : Configurations : 1. Enable [Drill User Impersonation](https://drill.apache.org/docs/configuring-user-impersonation/) 2. Enable [PQS Impersonation](https://phoenix.apache.org/server.html#Impersonation) -3. PQS URL: - 1. Provide `host` and `port` and Drill will generate the PQS URL with a doAs parameter of current session user - 2. Provide the `jdbcURL` with a `doAs` url param and `$user` placeholder as a value, for instance: - `jdbc:phoenix:thin:url=http://localhost:8765?doAs=$user`. In case Drill Impersonation is enabled, but `doAs=$user` - is missing the User Exception is thrown. +3. Phoenix URL: + 1. Provide `zkQUorum` and `port` and Drill will create a connection to Phoenix with a doAs of current Review Comment: ```suggestion 1. Provide `zkQuorum` and `port` and Drill will create a connection to Phoenix with a doAs of current ``` ########## contrib/storage-phoenix/pom.xml: ########## @@ -353,6 +381,9 @@ <profiles> <profile> <id>hadoop-2</id> + <properties> + <phoenix.skip.tests>true</phoenix.skip.tests> Review Comment: Is the Phoenix thick driver only compatible with Hadoop 3? ########## contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixDataSource.java: ########## @@ -18,40 +18,42 @@ package org.apache.drill.exec.store.phoenix; import java.io.PrintWriter; +import java.security.PrivilegedExceptionAction; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Map; +import java.util.Optional; import java.util.Properties; +import java.util.function.Supplier; import java.util.logging.Logger; import javax.sql.DataSource; -import org.apache.drill.common.exceptions.UserException; +import org.apache.drill.common.exceptions.DrillRuntimeException; +import org.apache.drill.common.util.function.CheckedSupplier; +import org.apache.drill.exec.util.ImpersonationUtil; import org.apache.drill.shaded.guava.com.google.common.base.Preconditions; +import org.apache.hadoop.security.UserGroupInformation; import org.slf4j.LoggerFactory; /** * Phoenix’s Connection objects are different from most other JDBC Connections * due to the underlying HBase connection. The Phoenix Connection object * is designed to be a thin object that is inexpensive to create. - * + * <p> * If Phoenix Connections are reused, it is possible that the underlying HBase connection * is not always left in a healthy state by the previous user. It is better to * create new Phoenix Connections to ensure that you avoid any potential issues. Review Comment: Reviewer's note: I checked the Phoenix FAQ and believe that these comments remain true of the thick driver. ########## contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixDataSource.java: ########## @@ -138,30 +137,37 @@ public boolean isWrapperFor(Class<?> iface) { @Override public Connection getConnection() throws SQLException { - useDriverClass(); + loadDriverClass(); return getConnection(this.user, null); } @Override public Connection getConnection(String userName, String password) throws SQLException { - useDriverClass(); + loadDriverClass(); logger.debug("Drill/Phoenix connection url: {}", url); - return DriverManager.getConnection(url, useConfProperties()); + CheckedSupplier<Connection, SQLException> action = + () -> DriverManager.getConnection(url, useConfProperties()); + if (impersonationEnabled) { + return doAsRemoteUser(userName, action); + } + return action.getAndThrow(); + } + + private <T> T doAsRemoteUser(String remoteUserName, final Supplier<T> action) { + try { + UserGroupInformation proxyUser = ImpersonationUtil.createProxyUgi(remoteUserName); + return proxyUser.doAs((PrivilegedExceptionAction<T>) action::get); + } catch (Exception e) { + throw new DrillRuntimeException(e); + } } /** - * The thin-client is lightweight and better compatibility. - * Only thin-client is currently supported. - * - * @throws SQLException + * Only thick-client is currently supported doe to shaded Avatica issues with thin client. Review Comment: ```suggestion * Only thick-client is currently supported due to a shaded Avatica conflict created by the thin client. ``` > Use thick Phoenix driver > ------------------------ > > Key: DRILL-8279 > URL: https://issues.apache.org/jira/browse/DRILL-8279 > Project: Apache Drill > Issue Type: Bug > Reporter: Vova Vysotskyi > Assignee: Vova Vysotskyi > Priority: Blocker > > phoenix-queryserver-client shades Avatica classes, so it causes issues when > starting Drill and shaded class from phoenix jars is loaded before, so Drill > wouldn't be able to start correctly. > To avoid that, phoenix thick client can be used, it also will improve query > performance. -- This message was sent by Atlassian Jira (v8.20.10#820010)