我正在使用SparkSQL的HiveContext,並且試圖連接到遠程Hive Metastore,設置Hive Metastore的唯一方法是通過在類路徑中包含hive-site.xml(或將其複製到/ etc /火花/ CONF /)。如何在SparkSQL中以編程方式連接到Hive Metastore?
有沒有一種方法可以在不包含hive-site.xml的情況下以編程方式在java代碼中設置此參數?如果是的話Spark配置使用什麼?
我正在使用SparkSQL的HiveContext,並且試圖連接到遠程Hive Metastore,設置Hive Metastore的唯一方法是通過在類路徑中包含hive-site.xml(或將其複製到/ etc /火花/ CONF /)。如何在SparkSQL中以編程方式連接到Hive Metastore?
有沒有一種方法可以在不包含hive-site.xml的情況下以編程方式在java代碼中設置此參數?如果是的話Spark配置使用什麼?
火花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");
。
在火花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")
我也面臨同樣的問題,但解決了。只需按照Spark 2.0中的步驟操作即可
Step1:將hive-site.xml文件從Hive conf文件夾複製到spark conf。
第2步:編輯spark-env.sh文件並配置您的mysql驅動程序。 (如果你使用MySQL作爲一個蜂巢metastore。)
或者添加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")
}
}
輸出:設置需要
不是'x。 write.saveAsTable(「hivetab」)'冗餘T'你已經通過'load data local inpath'編寫了值 –
在基於Kerberos的遠程配置單元簇哪些附加HiveContext配置的情況下?上述代碼在這種情況下對我不起作用,我想知道您是否有解決方案。謝謝。 –
仍然不起作用。我的設置:(「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「) –
在我看來,我的本地Spark甚至沒有嘗試連接遠程Hive,基於我在日誌中看到的內容 –