2015-08-13 31 views
7

我正在使用SparkSQL的HiveContext,並且試圖連接到遠程Hive Metastore,設置Hive Metastore的唯一方法是通過在類路徑中包含hive-site.xml(或將其複製到/ etc /火花/ CONF /)。如何在SparkSQL中以編程方式連接到Hive Metastore?

有沒有一種方法可以在不包含hive-site.xml的情況下以編程方式在java代碼中設置此參數?如果是的話Spark配置使用什麼?

回答

21

火花1.x中,你可以設置:

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

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

或者

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

更新如果你的蜂巢基於Kerberos

嘗試創建HiveContext之前設置這些:

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

在基於Kerberos的遠程配置單元簇哪些附加HiveContext配置的情況下?上述代碼在這種情況下對我不起作用,我想知道您是否有解決方案。謝謝。 –

+0

仍然不起作用。我的設置:(「hive.metastore。(「sun.security.krb5.debug」,「false」) (「uris」,「myValue」) (「login.user」,「myValue」) (「keytab.file」,「myValue」) (「hadoop.home.dir」,「myValue」) (「hadoop.security.authentication」 ,「kiveberos」) (「hive.metastore.sasl.enabled」,「true」) (「hive.security.authorization.enabled」,「false」) (「hive.metastore.kerberos.principal」,「 myValue「) (」hive.metastore.execute.setugi「,」true「) –

+0

在我看來,我的本地Spark甚至沒有嘗試連接遠程Hive,基於我在日誌中看到的內容 –

7

在火花2.0 +它應該是這個樣子的是:

不要忘記與你,以取代「hive.metastore.uris」。此 假定您已經啓動了一個配置單元Metastore服務(不是 配置單元服務器)。

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

我也面臨同樣的問題,但解決了。只需按照Spark 2.0中的步驟操作即可

Step1:將hive-site.xml文件從Hive conf文件夾複製到spark conf。 enter image description here

第2步:編輯spark-env.sh文件並配置您的mysql驅動程序。 (如果你使用MySQL作爲一個蜂巢metastore。) enter image description here

或者添加MySQL驅動程序的Maven/SBT(如果使用的)

第三步:當您創建火花會話中添加enableHiveSupport()

VAL火花= SparkSession.builder.master( 「本地」)。APPNAME( 「測試」).enableHiveSupport() .getOrCreate()

樣品的編號:

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") 
    } 
} 

輸出:設置需要

enter image description here

+0

不是'x。 write.saveAsTable(「hivetab」)'冗餘T'你已經通過'load data local inpath'編寫了值 –