Problème lors de l'utilisation d'un moteur Tez avec Hive, dans une distribution Hortonworks, dans des Jobs Spark

author
Talend Documentation Team
EnrichVersion
6.4
EnrichProdName
Talend Big Data Platform
Talend Big Data
Talend Real-Time Big Data Platform
Talend Data Fabric
task
Création et développement > Création de Jobs > Frameworks de Jobs > Spark Streaming
Création et développement > Création de Jobs > Distributions Hadoop > Hortonworks
Création et développement > Création de Jobs > Frameworks de Jobs > Spark Batch
EnrichPlatform
Studio Talend

Problème lors de l'utilisation d'un moteur Tez avec Hive dans une distribution Hortonworks

La configuration de Hive dans un cluster Hortonworks est spécifique. Cette configuration utilise Tez en tant que moteur Hive et peut conduire à un problème connu, lors de l'exéuction de composants Hive dans le Studio Talend, dans des Jobs Spark.
java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':
at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$reflect(SparkSession.scala:983)
at org.apache.spark.sql.SparkSession.sessionState$lzycompute(SparkSession.scala:110)
at org.apache.spark.sql.SparkSession.sessionState(SparkSession.scala:109)
at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:62)
at org.apache.spark.sql.SparkSession.createDataFrame(SparkSession.scala:552)
at org.apache.spark.sql.SparkSession.createDataFrame(SparkSession.scala:307)
at org.apache.spark.sql.SparkSession.createDataFrame(SparkSession.scala:321)
at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:451)
at dev_v6_001.test_hdp26_hive_0_1.test_hdp26_hive.tRowGenerator_1Process(test_hdp26_hive.java:1152)
at dev_v6_001.test_hdp26_hive_0_1.test_hdp26_hive.run(test_hdp26_hive.java:1597)
at dev_v6_001.test_hdp26_hive_0_1.test_hdp26_hive.runJobInTOS(test_hdp26_hive.java:1387)
at dev_v6_001.test_hdp26_hive_0_1.test_hdp26_hive.main(test_hdp26_hive.java:1272)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.spark.sql.SparkSession$.org$apache$spark$sql$SparkSession$$reflect(SparkSession.scala:980)
... 11 more
Caused by: java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveExternalCatalog':
at org.apache.spark.sql.internal.SharedState$.org$apache$spark$sql$internal$SharedState$$reflect(SharedState.scala:176)
at org.apache.spark.sql.internal.SharedState.<init>(SharedState.scala:86)
at org.apache.spark.sql.SparkSession$$anonfun$sharedState$1.apply(SparkSession.scala:101)
at org.apache.spark.sql.SparkSession$$anonfun$sharedState$1.apply(SparkSession.scala:101)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession.sharedState$lzycompute(SparkSession.scala:101)
at org.apache.spark.sql.SparkSession.sharedState(SparkSession.scala:100)
at org.apache.spark.sql.internal.SessionState.<init>(SessionState.scala:157)
at org.apache.spark.sql.hive.HiveSessionState.<init>(HiveSessionState.scala:32)
... 16 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.spark.sql.internal.SharedState$.org$apache$spark$sql$internal$SharedState$$reflect(SharedState.scala:173)
... 24 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.spark.sql.hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:264)
at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:358)
at org.apache.spark.sql.hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:262)
at org.apache.spark.sql.hive.HiveExternalCatalog.<init>(HiveExternalCatalog.scala:65)
... 29 more
Caused by: java.lang.RuntimeException: org.apache.tez.dag.api.TezUncheckedException: Invalid configuration of tez jars, tez.lib.uris is not defined in the configuration
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:535)
at org.apache.spark.sql.hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:188)
... 37 more
Caused by: org.apache.tez.dag.api.TezUncheckedException: Invalid configuration of tez jars, tez.lib.uris is not defined in the configuration
at org.apache.tez.client.TezClientUtils.setupTezJarsLocalResources(TezClientUtils.java:166)
at org.apache.tez.client.TezClient.getTezJarResources(TezClient.java:831)
at org.apache.tez.client.TezClient.start(TezClient.java:355)
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:184)
at org.apache.hadoop.hive.ql.exec.tez.TezSessionState.open(TezSessionState.java:116)
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:532)
... 38 more

Ce problème connu présenté ci-dessus se produit au cours de l'initialisation de Hive par Spark, durant laquelle Hive recherche une configuration Tez, car Tez est le moteur d'exécution désigné par Hortonworks. Cependant, comme Spark n'attend pas Tez, cette configuration doit être écrasée :

Environnement:

  • Solution Studio Talend avec Big Data nécessitant souscription

  • Jobs Spark

Utiliser un fichier de configuration Hive spécifique à Spark pour résoudre le problème d'utilisation d'un moteur Tez avec Hive pour des Jobs Spark dans une distribution Hortonworks

Hortonworks embarque un fichier spécifique à Spark hive-site.xml pour résoudre ce problème de moteur Tez avec Hive. Vous pouvez utiliser ce fichier afin de définir la connexion à votre cluster Hortonworks dans le Studio.

Ce fichier est stocké dans le dossier de configuration Spark de votre cluster Hortonworks : /etc/spark/conf.

Procédure

  1. Récupérez ce fichier de configuration Hive spécifique à Spark de l'administrateur de votre cluster.
  2. Téléchargez les fichiers de configuration de votre cluster, par exemple, à l'aide d'Ambari.
  3. Parmi ces fichiers, remplacez le fichier /etc/hive/conf/hive-site.xml par ce fichier spécifique à Spark /etc/spark/conf/hive-site.xml.
  4. Définissez la connexion à Hadoop pour votre cluster Hortonworks, dans le Repository, si ce n'est pas encore fait.

    Pour un exemple de définition de ce type de connexion, consultez Create the cluster metadata - Hortonworks 2.4 (en anglais).

  5. Cliquez-droit sur la connexion et, dans le menu contextuel, sélectionnez Edit Hadoop cluster pour ouvrir l'assistant Hadoop cluster connection.
  6. Cliquez sur Next pour ouvrir la seconde étape de l'assistant. Cochez la case Use custom Hadoop configurations.
  7. Cliquez sur le bouton [...] à côté de Use custom Hadoop configurations pour ouvrir l'assistant Hadoop configuration import wizard.
  8. Sélectionnez la version d'Hortonworks que vous utilisez et sélectionnez le bouton radio Import configuration from local files.
  9. Cliquez sur Next et cliquez sur Browse... pour trouver les fichiers de configuration Hive parmi lesquels vous avez placé le fichier spécifique à Spark hive-site.xml au cours d'une précédente étape.
  10. Cliquez sur Finish pour fermer l'assistant et terminer l'import, afin de retourner à l'assistant Hadoop cluster connection.
  11. Cliquez sur Finish pour valider les modifications et, dans la boîte de dialogue, cliquez sur Yes pour accepter la propagation. L'assistant se ferme et le fichier de configuration Hive spécifique à Spark sera utilisé avec cette connexion à Hadoop.

    Cette nouvelle configuration est prise en compte uniquement pour les Jobs utilisant cette connexion.

    Pour un exemple relatif à l'utilisation de ce type de connexion, consultez Write Data to HDFS - Hortonworks (en anglais).

Utiliser le filtre sur les propriétés Hadoop du Studio pour résoudre le problème de moteur Tez avec Hive pour les Jobs Spark dans une distribution Hortonworks

Si vous devez utiliser le fichier original hive-site.xml de votre cluster Hortonworks ou si vous n'avez pas accès aux fichiers de configuration spécifiques à Spark, vous pouvez utiliser le filtre des propriétés fourni dans l'assistant de métadonnées Hadoop dans le Studio pour régler ce problème.

Procédure

  1. Définissez la connexion Hadoop vers votre cluster Hortonworks dans le Repository, si ce n'est pas déjà fait.

    Pour un exemple de définition de ce type de connexion, consultez Create the cluster metadata - Hortonworks 2.4 (en anglais).

  2. Cliquez-droit sur cette connexion et, dans le menu contextuel, sélectionnez Edit Hadoop cluster pour ouvrir l'assistant Hadoop cluster connection.
  3. Cliquez sur Next pour ouvrir l'étape suivante et cochez la case Use custom Hadoop configurations.
  4. Cliquez sur le bouton [...] à côté de Use custom Hadoop configurations pour ouvrir l'assistant Hadoop configuration import wizard.
  5. Sélectionnez la version d'Hortonworks que vous utilisez, puis effectuez l'une des opérations suivantes :
    • Si votre distribution Hortonworks contient une installation d'Ambari, sélectionnez le bouton radio Retrieve configuration from Ambari or Cloudera et cliquez sur Next. Procédez ensuite comme suit :
      1. Dans l'assistant qui s'ouvre, saisissez vos identifiants Ambari dans les champs correspondants et cliquez sur Connect.

        Un nom de cluster est affiché dans la liste déroulante Discovered clusters.

      2. Dans la liste, sélectionnez votre cluster et cliquez sur Fetch afin de récupérer la configuration des services relatifs.

      3. Cliquez sur le bouton [...] à côté de Hadoop property filter pour ouvrir l'assistant.

    • Si votre distribution Hortonworks n'a pas d'installation d'Ambari, vous devez importer les fichiers de configuration Hive depuis un répertoire local. Cela signifie que vous devez contacter l'administrateur de votre cluster pour obtenir les fichiers de configuration Hive ou que vous devez télécharger ces fichiers vous-même.

      Une fois que vous avez les fichiers, procédez comme suit :

      1. Dans l'assistant Hadoop configuration import wizard, sélectionnez le bouton radio Import configuration from local files et cliquez sur Next.

      2. Cliquez sur Browse... pour trouver les fichiers de configuration Hive.

      3. Cliquez sur le bouton [...] à côté de Hadoop property filter pour ouvrir l'assistant.

  6. Cliquez sur le bouton [+] pour ajouter une ligne et saisissez hive.execution.engine dans cette ligne afin de retirer cette propriété de la liste.
  7. Cliquez sur OK pour valider cet ajout et retourner à l'assistant Hadoop configuration import wizard.
  8. Cliquez sur Finish pour fermer l'assistant d'import et terminer l'import afin de retourner à l'assistant Hadoop cluster connection.
  9. Cliquez sur Finish pour valider les modifications et, dans la boîte de dialogue qui s'ouvre, cliquez sur Yes pour accepter la propagation. L'assistant se ferme et le fichier de configuration Hive spécifique à Spark sera utilisé avec cette connexion à Hadoop.

    Cette nouvelle configuration est prise en compte uniquement pour les Jobs utilisant cette connexion.

    Pour un exemple d'utilisation de ce type de connexion, consultez Write Data to HDFS - Hortonworks (en anglais).