> On Feb. 10, 2017, 11:37 p.m., Greg Senia wrote:
> > Ship It!
> 
> Greg Senia wrote:
>     While using doAS this does not work...
>     
>     gint), stock_price_adj_close (type: 
> float)"}}}}]}},"DagId:":"hive_20170210183719_81144261-1a2b-4159-9e62-dc7bad4ebfc7:1","DagName:":""}},"Stage-2":{"Dependency
>  Collection":{}},"Stage-0":{"Move Operator":{"files:":{"hdfs 
> directory:":"true","destination:":"hdfs://tech/apps/hive/warehouse/gss_test_gss_test"}}}}},
>  endTime=Fri Feb 10 18:37:40 EST 2017}}]] after 3 retries. Quitting
>     org.apache.kafka.common.KafkaException: Failed to construct kafka producer
>       at 
> org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:335)
>       at 
> org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:188)
>       at 
> org.apache.atlas.kafka.KafkaNotification.createProducer(KafkaNotification.java:311)
>       at 
> org.apache.atlas.kafka.KafkaNotification.sendInternal(KafkaNotification.java:220)
>       at 
> org.apache.atlas.notification.AbstractNotification.send(AbstractNotification.java:84)
>       at 
> org.apache.atlas.hook.AtlasHook.notifyEntitiesInternal(AtlasHook.java:134)
>       at org.apache.atlas.hook.AtlasHook.notifyEntities(AtlasHook.java:119)
>       at org.apache.atlas.hook.AtlasHook.notifyEntities(AtlasHook.java:172)
>       at org.apache.atlas.hive.hook.HiveHook.access$300(HiveHook.java:85)
>       at org.apache.atlas.hive.hook.HiveHook$3.run(HiveHook.java:224)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at javax.security.auth.Subject.doAs(Subject.java:422)
>       at 
> org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1740)
>       at 
> org.apache.atlas.hive.hook.HiveHook.notifyAsPrivilegedAction(HiveHook.java:233)
>       at org.apache.atlas.hive.hook.HiveHook$2.run(HiveHook.java:206)
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>       at java.lang.Thread.run(Thread.java:745)
>     Caused by: org.apache.kafka.common.KafkaException: 
> javax.security.auth.login.LoginException: Could not login: the client is 
> being asked for a password, but the Kafka client code does not currently 
> support obtaining a password from the user. not available to garner  
> authentication information from the user
>       at 
> org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:86)
>       at 
> org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:71)
>       at 
> org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:83)
>       at 
> org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:277)
>       ... 19 more
>     Caused by: javax.security.auth.login.LoginException: Could not login: the 
> client is being asked for a password, but the Kafka client code does not 
> currently support obtaining a password from the user. not available to garner 
>  authentication information from the user
>       at 
> com.sun.security.auth.module.Krb5LoginModule.promptForPass(Krb5LoginModule.java:940)
>       at 
> com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:760)
>       at 
> com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:617)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:498)
>       at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
>       at 
> javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
>       at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
>       at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at 
> javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
>       at javax.security.auth.login.LoginContext.login(LoginContext.java:587)
>       at 
> org.apache.kafka.common.security.authenticator.AbstractLogin.login(AbstractLogin.java:69)
>       at 
> org.apache.kafka.common.security.kerberos.KerberosLogin.login(KerberosLogin.java:110)
>       at 
> org.apache.kafka.common.security.authenticator.LoginManager.<init>(LoginManager.java:46)
>       at 
> org.apache.kafka.common.security.authenticator.LoginManager.acquireLoginManager(LoginManager.java:68)
>       at 
> org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:78)

Here are changes to make it work correctly as UGI context can have both a 
ticket and a keytab. Check for keytab first if not keytab go onto ticketcache 
if it exists.

diff --git a/notification/src/main/java/org/apache/atlas/hook/AtlasHook.java 
b/notification/src/main/java/org/apache/atlas/hook/AtlasHook.java
index a83db79..9ac88f4 100644
--- a/notification/src/main/java/org/apache/atlas/hook/AtlasHook.java
+++ b/notification/src/main/java/org/apache/atlas/hook/AtlasHook.java
@@ -26,6 +26,7 @@
 import org.apache.atlas.notification.NotificationInterface;
 import org.apache.atlas.notification.NotificationModule;
 import org.apache.atlas.notification.hook.HookNotification;
+import org.apache.atlas.security.InMemoryJAASConfiguration;
 import org.apache.atlas.typesystem.Referenceable;
 import org.apache.atlas.typesystem.json.InstanceSerialization;
 import org.apache.commons.configuration.Configuration;
@@ -76,6 +77,12 @@
         if (logFailedMessages) {
             failedMessagesLogger = new FailedMessagesLogger(failedMessageFile);
             failedMessagesLogger.init();
+        }
+
+        if (!(isLoginKeytabBased())){
+            if (isLoginTicketBased()) {
+                
InMemoryJAASConfiguration.setConfigSectionRedirect("KafkaClient", 
"ticketBased-KafkaClient");
+            }
         }
 
         notificationRetryInterval = 
atlasProperties.getInt(ATLAS_NOTIFICATION_RETRY_INTERVAL, 1000);
@@ -210,4 +217,27 @@
         }
     }
 
+    private static boolean isLoginTicketBased() {
+        boolean ret = false;
+
+        try {
+            ret = UserGroupInformation.isLoginTicketBased();
+        } catch (Exception excp) {
+            LOG.error("error in determining whether to use ticket-cache or 
keytab for KafkaClient JAAS configuration", excp);
+        }
+
+        return ret;
+    }
+    private static boolean isLoginKeytabBased() {
+        boolean ret = false;
+
+        try {
+            ret = UserGroupInformation.isLoginKeytabBased();
+        } catch (Exception excp) {
+            LOG.error("error in determining whether to use ticket-cache or 
keytab for KafkaClient JAAS configuration", excp);
+        }
+
+        return ret;
+    }
+
 }


- Greg


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/56543/#review165205
-----------------------------------------------------------


On Feb. 10, 2017, 2:26 p.m., Nixon Rodrigues wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/56543/
> -----------------------------------------------------------
> 
> (Updated Feb. 10, 2017, 2:26 p.m.)
> 
> 
> Review request for atlas, keval bhatt, Madhan Neethiraj, Suma Shivaprasad, 
> and Vimal Sharma.
> 
> 
> Bugs: ATLAS-1546
>     https://issues.apache.org/jira/browse/ATLAS-1546
> 
> 
> Repository: atlas
> 
> 
> Description
> -------
> 
> In a kerberized environment, Atlas hook uses JAAS configuration section named 
> "KakfaClient" to authenticate with Kafka broker. In a typical Hive deployment 
> this configuration section is set to use the keytab and principal of 
> HiveServer2 process. The hook running in HiveCLI might fail to authenticate 
> with Kafka if the user can't read the configured keytab.
> Given that HiveCLI users would have performed kinit, the hook in HiveCLI 
> should use the ticket-cache generated by kinit. When ticket cache is not 
> available (for example in HiveServer2), the hook should use the configuration 
> provided in KafkaClient JAAS section.
> 
> 
> Atlas Jaas properties
> 
> atlas.jaas.ticketBased-KafkaClient.loginModuleControlFlag=required
> atlas.jaas.ticketBased-KafkaClient.loginModuleName=com.sun.security.auth.module.Krb5LoginModule
> atlas.jaas.ticketBased-KafkaClient.option.useTicketCache=true
> 
> 
> Diffs
> -----
> 
>   
> common/src/main/java/org/apache/atlas/security/InMemoryJAASConfiguration.java 
> ff80eca 
>   
> common/src/test/java/org/apache/atlas/security/InMemoryJAASConfigurationTicketBasedKafkaClientTest.java
>  PRE-CREATION 
>   common/src/test/resources/atlas-jaas.properties 90a5682 
>   notification/src/main/java/org/apache/atlas/hook/AtlasHook.java 0534910 
> 
> Diff: https://reviews.apache.org/r/56543/diff/
> 
> 
> Testing
> -------
> 
> Maven build completed without issue & executed mvn clean install and all the 
> testcases are passing except few.
> Added a new unit testcase for TicketBasedKafkaClient.
> 
> Deployed the new jars ( atlas-common & atlas-notification 
> in??/usr/hdp/current/atlas-client/hook/hive/atlas-hive-plugin-impl/ and 
> tested hive hook on secure and simple env for HiveCli,Beeline clients. 
> Entities on Atlas are created  for tables created in Hive.
> 
> 
> Thanks,
> 
> Nixon Rodrigues
> 
>

Reply via email to