Github user vanzin commented on a diff in the pull request:

    https://github.com/apache/spark/pull/9232#discussion_r43160341
  
    --- Diff: 
yarn/src/main/scala/org/apache/spark/deploy/yarn/YarnSparkHadoopUtil.scala ---
    @@ -142,6 +145,117 @@ class YarnSparkHadoopUtil extends SparkHadoopUtil {
         val containerIdString = 
System.getenv(ApplicationConstants.Environment.CONTAINER_ID.name())
         ConverterUtils.toContainerId(containerIdString)
       }
    +
    +  /**
    +   * Obtains token for the Hive metastore, using the current user as the 
principal.
    +   * Some exceptions are caught and downgraded to a log message.
    +   * @param conf hadoop configuration; the Hive configuration will be 
based on this
    +   * @return a token, or `None` if there's no need for a token (no 
metastore URI or principal
    +   *         in the config), or if a binding exception was caught and 
downgraded.
    +   */
    +  def obtainTokenForHiveMetastore(conf: Configuration): 
Option[Token[DelegationTokenIdentifier]] = {
    +    try {
    +      obtainTokenForHiveMetastoreInner(conf, 
UserGroupInformation.getCurrentUser().getUserName)
    +    } catch {
    +      case e: Exception => {
    +        handleTokenIntrospectionFailure("Hive", e)
    +        None
    +      }
    +    }
    +  }
    +
    +  /**
    +   * Handle failures to obtain a token through introspection. Failures to 
load the class are
    +   * not treated as errors: anything else is.
    +   * @param service service name for error messages
    +   * @param thrown exception caught
    +   * @throws Exception if the `thrown` exception isn't one that is to be 
ignored
    +   */
    +  private[yarn] def handleTokenIntrospectionFailure(service: String, 
thrown: Throwable): Unit = {
    +    thrown match {
    +      case e: ClassNotFoundException =>
    +        logInfo(s"$service class not found $e")
    +        logDebug("Hive Class not found", e)
    +      case e: NoClassDefFoundError =>
    +        logDebug(s"$service class not found", e)
    +      case e: InvocationTargetException =>
    +        // problem talking to the metastore or other hive-side exception
    +        logInfo(s"$service method invocation failed", e)
    +        throw if (e.getCause != null) e.getCause else e
    +      case e: ReflectiveOperationException =>
    +        // any other reflection failure log at error and rethrow
    +        logError(s"$service Class operation failed", e)
    +        throw e;
    --- End diff --
    
    I think unwinding just makes the code more confusing. Just handle the 
exceptions you really mean to handle, and let the others propagate as is. 
Errors here should be very uncommon, and the extra info in the stack trace 
won't really make it harder to find the case.
    
    I think it's very unlikely you'll get a `NoClassDefFoundError` if you don't 
get a `ClassDefNotFoundException`. If you do, it's probably an actual error - 
user has added some Hive jars to the path but not others, or something like 
that.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to