2015-08-13 3 views
7

Ich benutze HiveContext mit SparkSQL und ich versuche eine Verbindung zu einem entfernten Hive-Metastore herzustellen, die einzige Möglichkeit, den Hive-Metastore zu setzen, ist die Aufnahme der hive-site.xml auf dem Klassenpfad (oder Kopieren nach/etc/spark/conf /).Wie man sich in SparkSQL programmatisch mit einem Hive-Metastore verbindet?

Gibt es eine Möglichkeit, diesen Parameter programmgesteuert in einem Java-Code ohne Einbeziehung der hive-site.xml zu setzen? Wenn ja, wie ist die Spark-Konfiguration zu verwenden?

Antwort

21

für Spark 1.x können Sie einstellen, mit:

System.setProperty("hive.metastore.uris", "thrift://METASTORE:9083"); 

final SparkConf conf = new SparkConf(); 
SparkContext sc = new SparkContext(conf); 
HiveContext hiveContext = new HiveContext(sc); 

Oder

final SparkConf conf = new SparkConf(); 
SparkContext sc = new SparkContext(conf); 
HiveContext hiveContext = new HiveContext(sc); 
hiveContext.setConf("hive.metastore.uris", "thrift://METASTORE:9083"); 

Update Wenn Ihr Hive kerberisierte ist:

Versuchen Sie diese Einstellung vor dem HiveContext Erstellen :

System.setProperty("hive.metastore.sasl.enabled", "true"); 
System.setProperty("hive.security.authorization.enabled", "false"); 
System.setProperty("hive.metastore.kerberos.principal", hivePrincipal); 
System.setProperty("hive.metastore.execute.setugi", "true"); 
.
+0

Im Fall einer Kerberized Fernclusterstruktur, was die zusätzlichen HiveContext Config setzen benötigt? Der obige Code funktioniert in diesem Fall nicht für mich und ich frage mich, ob Sie eine Lösung haben. Vielen Dank. –

+0

Funktioniert immer noch nicht. Meine Einstellungen: ("hive.metastore.uris "," myValue ") (" login.user "," meinWert ") (" keytab.file "," myValue ") (" sun.security.krb5.debug "," false ") (" java.security.krb5.conf "," myValue ") (" java.library.path "," myValue ") (" hadoop.home.dir "," myValue ") (" hadoop.security.authentication ") "kerberos") ("hive.metastore.sasl.enabled", "true") ("hive.security.authorization.enabled", "false") ("hive.metastore.kerberos.principal", " myValue ") (" hive.metastore.execute.setugi "," true ") –

+0

Sieht für mich mein lokaler Spark ist nicht einmal versucht, die Remote-Hive basierend auf dem, was ich im Log sehen –

7

In Funken 2.0 + sollte es so aussehen:

Vergessen Sie nicht den "hive.metastore.uris" mit Ihnen zu ersetzen. Dieser geht davon aus, dass Sie bereits einen Hive-Metastreedienst gestartet haben (kein Hiveserver).

val spark = SparkSession 
      .builder() 
      .appName("interfacing spark sql to hive metastore without configuration file") 
      .config("hive.metastore.uris", "thrift://localhost:9083") // replace with your hivemetastore service's thrift url 
      .enableHiveSupport() // don't forget to enable hive support 
      .getOrCreate() 

     import spark.implicits._ 
     import spark.sql 
     // create an arbitrary frame 
     val frame = Seq(("one", 1), ("two", 2), ("three", 3)).toDF("word", "count") 
     // see the frame created 
     frame.show() 
     /** 
     * +-----+-----+ 
     * | word|count| 
     * +-----+-----+ 
     * | one| 1| 
     * | two| 2| 
     * |three| 3| 
     * +-----+-----+ 
     */ 
     // write the frame 
     frame.write.mode("overwrite").saveAsTable("t4") 
1

ich zu gleichen Problem, aber gelöst. Folgen Sie einfach diesen Schritten in Spark 2.0 Version

Schritt1: Kopieren Sie die Datei hive-site.xml aus Hive-Conf-Ordner Spark Conf. enter image description here

Schritt 2: bearbeiten spark-env.sh Datei und konfigurieren Sie Ihre MySQL-Treiber. (Wenn Sie Mysql als hive Metastore verwenden.) enter image description here

Oder fügen Sie MySQL-Treiber Maven/SBT (Wenn diese verwendet wird)

Schritt 3: Wenn Sie Funken Sitzung erstellen hinzufügen enableHiveSupport()

val = spark SparkSession.builder.master ("local"). appName ("Prüfung") .enableHiveSupport() .getOrCreate()

Beispielcode:

package sparkSQL 

/** 
    * Created by venuk on 7/12/16. 
    */ 

import org.apache.spark.sql.SparkSession 

object hivetable { 
    def main(args: Array[String]): Unit = { 
    val spark = SparkSession.builder.master("local[*]").appName("hivetable").enableHiveSupport().getOrCreate() 

    spark.sql("create table hivetab (name string, age int, location string) row format delimited fields terminated by ',' stored as textfile") 
    spark.sql("load data local inpath '/home/hadoop/Desktop/asl' into table hivetab").show() 
    val x = spark.sql("select * from hivetab") 
    x.write.saveAsTable("hivetab") 
    } 
} 

Ausgang:

enter image description here

+0

ist nicht' x. write.saveAsTable ("hivetab") 'redundant t? Sie haben die Werte bereits über 'load data local inpath' geschrieben –

Verwandte Themen