Hive Metastore HA with DBTokenStore: Failed to initialize master key

Cette article décrit ma petite aventure autour d’une erreur au démarrage du Hive Metastore. Elle se reproduit dans un environnement précis qui est celui d’une installation sécurisée, entendre avec Kerberos, en haute disponibilité avec le stockage des delegation token dans une base de données. La version de Hive est la 1.2 packagée dans la distribution Hortonworks 2.4.2.

Le stockage des delegation token est définit par la propriété “hive.cluster.delegation.token.store.class”. Les choix disponibles sont Zookeeper, la base de données du Metastore et la mémoire. Autant Cloudera qu’Hortonworks recommande l’utilisation de la base de données soit la valeur “org.apache.hadoop.hive.thrift.DBTokenStore”.

L’erreur en question se produit au lancement du Metastore et porte la signature suivante :

  • il arrive au travers de la méthode DBTokenStore.init
  • pas très sur ou init est appelé
  • mais après une courte recherche, objectStore est instantié dans HiveAuthFactory par rawStore = baseHandler.getMS(); ou baseHandler est HiveMetaStore.HMSHandler
  • dans HiveMetaStore.HMSHandler.getMS, la méthode getMS return une instance de threadLocalMS.get() ou newRawStore() si null
  • cette dernière, newRawStore, s’alimente de la propriété rawStoreClassName
  • cette propriété est initialisée à partir de la configuration rawStoreClassName = hiveConf.getVar(HiveConf.ConfVars.METASTORE_RAW_STORE_IMPL);
  • la valeur par default est declarée dans HiveConf METASTORE_RAW_STORE_IMPL("hive.metastore.rawstore.impl", "org.apache.hadoop.hive.metastore.ObjectStore",...)
  • on revient a la class “ObjectStore”, qui contient bien notre méthode getMasterKey, alors que se passe-t-il donc?En re-parcourant le code source, on constate que HiveAuthFactory, où le rawstore est construit et passé à la fonction “startDelegationTokenSecretManager”, s’applique au HiveServer2. Hum, se pourrait-il qu’il existe un équivalent pour le Metastore ?

    Une recherche avec “startDelegationTokenSecretManager” nous conduit a nouveau sur le HiveMetaStore et là que lit-on :

    Avec baseHandler construit un peu plus haut de la manière suivante :

    La signature de “startDelegationTokenSecretManager” est la suivante:

    N’importe quel object peut être passé en second argument ce qui est logique puisque Hive fait appel aux outils de réflexion.

    S’inspirant de HiveAuthFactory, on constate que le rawStore est lui-meme obtenu du baseHandler. Donc le parametre n’est pas baseHandler mais bien baseHandler.getMS()`

    Ainsi, HiveMetaStore en ligne 6031 devrait ressembler à:

S’agit maintenant de compiler tout ça.

La commande mvn clean package -DskipTests -Phadoop-2 ne passe pas du premier coup. Elle ne passera d’ailleurs jamais. N’étant intéressé que par la compilation de la jar associée au Metastore, prenons l’option de rapidement corriger les erreurs de compilation. Heureusement il n’y en aura qu’une. Elle consiste à supprimer toutes les référence à la classe “CallerContext” dans Hadoop23Shims. Après ça, Maven ne compile pas l’ensemble des projets met va suffisamment loin pour générer la jar du MetaStore.

En terme de déploiement, tout n’est pas si simple non plus. Remplacer la jar en question ne suffit pas car une autre jar chargée précédemment contient elle aussi les classes impactées. Je pris la solution de réécrire la variable d’environnement HADOOP_CLASSPATH en la préfixant par notre jar nouvellement importée. Dans le fichier “/usr/hdp/current/hive-metastore/bin/ext/metastore.sh”, ajouter export HADOOP_CLASSPATH="/usr/hdp/2.4.2.0-258/hive/lib/hive-metastore.jar:$HADOOP_CLASSPATH" avant export HADOOP_OPTS="$HIVE_METASTORE_HADOOP_OPTS $HADOOP_OPTS".

Exécuter la commande hive --service metastore et le MetaStore démarre.

Il semble que ce problème soit toujours présent dans la branche master du Hive Metastore. Toutefois, il n’était pas présent dans la précédente release HDP 2.4.0.

Par |2017-07-24T20:35:46+00:00July 21st, 2016|Uncategorized|0 commentaire

À propos de l'auteur :

Passionné de programmation, de données et d'entrepreneuriat, je participe à façonner Adaltas pour qu'elle soit une équipe d'ingénieurs talentueux partageant leurs savoir-faire et leurs expériences.

Laisser un commentaire