web-dev-qa-db-fra.com

Comment se connecter au serveur Hive distant depuis spark

J'exécute spark localement et je souhaite accéder aux tables Hive, qui se trouvent dans le cluster Hadoop distant.

Je peux accéder aux tables Hive en lançant beeline sous SPARK_HOME

[ml@master spark-2.0.0]$./bin/beeline 
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:Hive2://remote_Hive:10000
Connecting to jdbc:Hive2://remote_Hive:10000
Enter username for jdbc:Hive2://remote_Hive:10000: root
Enter password for jdbc:Hive2://remote_Hive:10000: ******
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/ml/spark/spark-2.0.0/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
16/10/12 19:06:39 INFO jdbc.Utils: Supplied authorities: remote_Hive:10000
16/10/12 19:06:39 INFO jdbc.Utils: Resolved authority: remote_Hive:10000
16/10/12 19:06:39 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:Hive2://remote_Hive:10000
Connected to: Apache Hive (version 1.2.1000.2.4.2.0-258)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:Hive2://remote_Hive:10000>

comment puis-je accéder aux tables Hive distantes par programme à partir de spark?

14
April

JDBC n'est pas requis

Spark se connecte directement au métastore Hive, et non via HiveServer2. Pour configurer cela,

  1. Mettez Hive-site.xml Sur votre classpath et spécifiez Hive.metastore.uri À l'emplacement où votre métastore Hive a été hébergé. Voir aussi Comment se connecter à une métastore Hive par programme dans SparkSQL?

  2. Importez org.Apache.spark.sql.Hive.HiveContext, Car il peut effectuer une requête SQL sur des tables Hive.

  3. Définissez val sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc)

  4. Vérifiez sqlContext.sql("show tables") pour voir si cela fonctionne

SparkSQL sur les tables Hive

Conclusion: si vous devez opter pour jdbc

Jetez un oeil connexion d'Apache spark avec Apache Hive à distance.

Veuillez noter que beeline se connecte également via jdbc. à partir de votre journal, il est évident.

[ml @ master spark-2.0.0] $./bin/beeline Beeline version 1.2.1.spark2 par Apache Hive beeline>! connect jdbc: Hive2: // remote_Hive: 10000

Connexion à jdbc: Hive2: // remote_Hive: 10000

Alors s'il vous plaît jetez un oeil à cela article intéressant

  • Méthode 1: tirez la table dans Spark using JDBC
  • Méthode 2: utilisez Spark JdbcRDD avec le pilote JDBC HiveServer2
  • Méthode 3: récupérer un ensemble de données côté client, puis créer RDD manuellement

Actuellement, le pilote HiveServer2 ne nous permet pas d'utiliser les méthodes "Sparkling" 1 et 2, nous ne pouvons compter que sur la méthode 3

Voici un exemple d'extrait de code à travers lequel il peut être atteint

Chargement des données d'un cluster Hadoop (aka "distant") dans un autre (où mon Spark vit aka "domestique") via HiveServer2 JDBC connexion.

import Java.sql.Timestamp
import scala.collection.mutable.MutableList

case class StatsRec (
  first_name: String,
  last_name: String,
  action_dtm: Timestamp,
  size: Long,
  size_p: Long,
  size_d: Long
)

val conn: Connection = DriverManager.getConnection(url, user, password)
val res: ResultSet = conn.createStatement
                   .executeQuery("SELECT * FROM stats_201512301914")
val fetchedRes = MutableList[StatsRec]()
while(res.next()) {
  var rec = StatsRec(res.getString("first_name"), 
     res.getString("last_name"), 
     Timestamp.valueOf(res.getString("action_dtm")), 
     res.getLong("size"), 
     res.getLong("size_p"), 
     res.getLong("size_d"))
  fetchedRes += rec
}
conn.close()
val rddStatsDelta = sc.parallelize(fetchedRes)
rddStatsDelta.cache()




 // Basically we are done. To check loaded data:

println(rddStatsDelta.count)
rddStatsDelta.collect.take(10).foreach(println)
16
Ram Ghadiyaram

Après avoir fourni la configuration Hive-ste.xml à SPARK et après avoir démarré le service Hive Metastore,

Deux choses doivent être configurées dans SPARK Session lors de la connexion à Hive:

  1. Puisque Spark SQL se connecte à Hast metastore en utilisant Thrift, nous devons fournir l'URI du serveur Thrift lors de la création de la session Spark).
  2. Hive Metastore warehouse qui est le répertoire où Spark SQL persiste les tables. Utilisez la propriété 'spark.sql.warehouse.dir' qui correspond à 'Hive.metastore.warehouse .dir '(car cela est déconseillé dans Spark 2.0)

Quelque chose comme:

    SparkSession spark=SparkSession.builder().appName("Spark_SQL_5_Save To Hive").enableHiveSupport().getOrCreate();
    spark.sparkContext().conf().set("spark.sql.warehouse.dir", "/user/Hive/warehouse");
    spark.sparkContext().conf().set("Hive.metastore.uris", "thrift://localhost:9083");

J'espère que cela a été utile !!

0
Amardeep Kohli