¿Cómo conectarse a un metastore de Hive mediante progtwigción en SparkSQL?

Estoy usando HiveContext con SparkSQL y estoy tratando de conectarme a un metastore de Hive remoto, la única forma de establecer el metastore de hive es mediante la inclusión de hive-site.xml en el classpath (o copiarlo en / etc / spark / conf /).

¿Hay alguna manera de establecer este parámetro programáticamente en un código java sin incluir el hive-site.xml? Si es así, ¿cuál es la configuración de Spark para usar?

Para Spark 1.x, puede establecer con:

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

O

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

Actualice si su hive está Kerberized :

Intente configurar estos antes de crear 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"); 

En spark 2.0. + Debería verse algo así:

No olvides reemplazar el “hive.metastore.uris” con el tuyo. Esto supone que ya tiene un servicio de metastore de hive iniciado (no un hive).

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

Yo también enfrenté el mismo problema, pero resolví. Solo sigue estos pasos en la versión Spark 2.0

Paso 1: copie el archivo hive-site.xml de la carpeta Hive conf para generar conf. enter image description here

Paso 2: edite el archivo spark-env.sh y configure su controlador mysql. (Si está utilizando Mysql como un metastore de hive). enter image description here

O agregue controladores MySQL a Maven / SBT (si los usa)

Paso 3: cuando está creando una sesión de chispa, agregue enableHiveSupport ()

val spark = SparkSession.builder.master (“local”). appName (“prueba”) .enableHiveSupport () .getOrCreate ()

Código de muestra:

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

Salida:

enter image description here

Debajo del código funcionó para mí. Podemos ignorar la configuración de hive.metastore.uris para hive.metastore.uris local, spark creará localmente objetos hive en el directorio de depósito de repuesto.

 import org.apache.spark.sql.SparkSession; object spark_hive_support1 { def main (args: Array[String]) { val spark = SparkSession .builder() .master("yarn") .appName("Test Hive Support") //.config("hive.metastore.uris", "jdbc:mysql://localhost/metastore") .enableHiveSupport .getOrCreate(); import spark.implicits._ val testdf = Seq(("Word1", 1), ("Word4", 4), ("Word8", 8)).toDF; testdf.show; testdf.write.mode("overwrite").saveAsTable("WordCount"); } }