2015-08-13 13 views
7

Tôi đang sử dụng HiveContext với SparkSQL và tôi đang cố gắng kết nối với một kho lưu trữ Hive từ xa, cách duy nhất để thiết lập kho lưu trữ hive là thông qua việc bao gồm tệp hive-site.xml trên classpath (hoặc sao chép nó vào/etc/spark/conf /).Làm thế nào để kết nối với một kho lưu trữ Hive lập trình trong SparkSQL?

Có cách nào để đặt tham số này theo lập trình trong mã java mà không bao gồm tệp hive-site.xml không? Nếu vậy cấu hình Spark sử dụng là gì?

Trả lời

21

Đối Spark 1.x, bạn có thể thiết lập với:

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

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

Hoặc

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

Cập nhật Nếu Hive của bạn được Kerberized:

Hãy thử thiết lập này trước khi tạo các 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

Trong trường hợp của một Kerberized xa cụm Hive các thêm HiveContext cấu hình là gì thiết lập cần thiết? Đoạn mã trên không làm việc cho tôi trong trường hợp này và tôi tự hỏi nếu bạn có một giải pháp. Cảm ơn. –

+0

Vẫn không hoạt động. Cài đặt của tôi: ("hive.metastore.uris "," myValue ") (" login.user "," myValue ") (" 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

Có vẻ như tôi là Spark địa phương của tôi thậm chí không cố gắng kết nối Hive từ xa dựa trên những gì tôi thấy trong nhật ký –

7

Trong spark 2.0 + nó sẽ giống như thế:

Đừng quên thay thế "hive.metastore.uris" với bạn. Điều này giả định rằng bạn có một dịch vụ di trú hive đã bắt đầu (không phải là 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

Tôi cũng gặp phải vấn đề tương tự nhưng đã giải quyết. Chỉ cần thực hiện theo các bước này trong Phiên bản Spark 2.0

Bước 1: Sao chép tệp hive-site.xml từ thư mục conf của thư mục để kích hoạt conf. enter image description here

Bước 2: chỉnh sửa tệp spark-env.sh và định cấu hình trình điều khiển mysql của bạn. (Nếu bạn đang sử dụng Mysql như một metastore hive.) enter image description here

Hoặc thêm trình điều khiển MySQL để Maven/SBT (Nếu sử dụng những)

Bước 3: Khi bạn đang tạo phiên spark thêm enableHiveSupport()

val spark = SparkSession.builder.master ("địa phương"). AppName ("thử nghiệm") .enableHiveSupport() .getOrCreate()

đang

mẫu:

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

Output:

enter image description here

+0

Không phải là' x. write.saveAsTable ("hivetab") 'redundan t? Bạn đã viết các giá trị thông qua 'tải dữ liệu cục bộ inpath' –

Các vấn đề liên quan