Hi all

I see UGI credentials (ex sparkCookie) shared from driver to executor is being 
lost on driver side in yarn mode. Below is the analysis on start of 
thriftserver,

Step 1. SparkSubmit create submit env which does a loginUserFromKeytab
  "main@1" prio=5 tid=0x1 nid=NA runnable
    java.lang.Thread.State: RUNNABLE
                  at 
org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:1041)
                  - locked <0x582> (a java.lang.Class)
                  at 
org.apache.spark.deploy.SparkSubmit$.prepareSubmitEnvironment(SparkSubmit.scala:336)
                  at 
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:156)
                  at 
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:122)
                  at 
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala:-1)

Step 2. HiveThriftServer does SparkSQLEnv.init which will Create SparkContext, 
and hence calls createDriverEnv which will generate secret key and add to UGI 
by Step 1 as credentials
                "main@1" prio=5 tid=0x1 nid=NA runnable
                java.lang.Thread.State: RUNNABLE
                                at 
org.apache.spark.SecurityManager.generateSecretKey(SecurityManager.scala:429)
                                at 
org.apache.spark.SecurityManager.<init>(SecurityManager.scala:228)
                                at 
org.apache.spark.SparkEnv$.create(SparkEnv.scala:237)
                                at 
org.apache.spark.SparkEnv$.createDriverEnv(SparkEnv.scala:175)
                                at 
org.apache.spark.SparkContext.createSparkEnv(SparkContext.scala:258)
                                at 
org.apache.spark.SparkContext.<init>(SparkContext.scala:433)
                                at 
org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2521)
                                - locked <0x10a5> (a java.lang.Object)
                                at 
org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:923)
                                at 
org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:915)
                                at scala.Option.getOrElse(Option.scala:121)
                                at 
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:915)
                                - locked <0x1091> (a 
org.apache.spark.sql.SparkSession$Builder)
                                - locked <0x10a6> (a 
org.apache.spark.sql.SparkSession$)
                                at 
org.apache.spark.sql.hive.thriftserver.SparkSQLEnv$.init(SparkSQLEnv.scala:48)
                                at 
org.apache.spark.sql.hive.thriftserver.a$.main(HiveThriftServer2.scala:86)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.main(HiveThriftServer2.scala:-1)
                                at 
sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
                                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 
org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:798)
                                at 
org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:183)
                                at 
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:208)
                                at 
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:122)
                                at 
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala:-1)


Step 3. Next Application is submitted which will create container launch 
context using UGI passed from Step 2
                "main@1" prio=5 tid=0x1 nid=NA runnable
                java.lang.Thread.State: RUNNABLE
                                at 
org.apache.spark.SecurityManager.generateSecretKey(SecurityManager.scala:429)
                                at 
org.apache.spark.SecurityManager.<init>(SecurityManager.scala:228)
                                at 
org.apache.spark.deploy.yarn.Client.createContainerLaunchContext(Client.scala:999)
                                at 
org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:194)
                                at 
org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:56)
                                at 
org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:173)
                                at 
org.apache.spark.SparkContext.<init>(SparkContext.scala:510)
                                at 
org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2521)
                                - locked <0x10a5> (a java.lang.Object)
                                at 
org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:923)
                                at 
org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:915)
                                at scala.Option.getOrElse(Option.scala:121)
                                at 
org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:915)
                                - locked <0x1091> (a 
org.apache.spark.sql.SparkSession$Builder)
                                - locked <0x10a6> (a 
org.apache.spark.sql.SparkSession$)
                                at 
org.apache.spark.sql.hive.thriftserver.SparkSQLEnv$.init(SparkSQLEnv.scala:48)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2$.main(HiveThriftServer2.scala:86)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.main(HiveThriftServer2.scala:-1)
                                at 
sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
                                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 
org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:798)
                                at 
org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:183)
                                at 
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:208)
                                at 
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:122)
                                at 
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala:-1)

Step 4. Lastly initCompositeService will invoke SparkSQLCLIService which does a 
loginUserFromKeytab again which will override UGI created by Step 1
                "main@1" prio=5 tid=0x1 nid=NA runnable
                java.lang.Thread.State: RUNNABLE
                                at 
org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:1041)
                                - locked <0x582> (a java.lang.Class)
                                at 
org.apache.hive.service.auth.HiveAuthFactory.loginFromKeytab(HiveAuthFactory.java:199)
                                at 
org.apache.spark.sql.hive.thriftserver.SparkSQLCLIService.init(SparkSQLCLIService.scala:53)
                                at 
org.apache.spark.sql.hive.thriftserver.ReflectedCompositeService$$anonfun$initCompositeService$1.apply(SparkSQLCLIService.scala:79)
                                at 
org.apache.spark.sql.hive.thriftserver.ReflectedCompositeService$$anonfun$initCompositeService$1.apply(SparkSQLCLIService.scala:79)
                                at 
scala.collection.Iterator$class.foreach(Iterator.scala:893)
                                at 
scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
                                at 
scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
                                at 
scala.collection.AbstractIterable.foreach(Iterable.scala:54)
                                at 
org.apache.spark.sql.hive.thriftserver.ReflectedCompositeService$class.initCompositeService(SparkSQLCLIService.scala:79)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.initCompositeService(HiveThriftServer2.scala:283)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.init(HiveThriftServer2.scala:303)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2$.main(HiveThriftServer2.scala:99)
                                at 
org.apache.spark.sql.hive.thriftserver.HiveThriftServer2.main(HiveThriftServer2.scala:-1)
                                at 
sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
                                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 
org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:798)
                                at 
org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:183)
                                at 
org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:208)
                                at 
org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:122)
                                at 
org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala:-1)

Is this the right behavior? as it looks like UGI created on JDBCServer startup 
which is passed to containerLaunchContext becomes stale.? please correct me if 
i am wrong

Regards
Ajith

Reply via email to