如何在SparkSQL中以编程方式连接到Hive Metastore?

时间:2015-08-13 06:04:13

标签: hadoop apache-spark hive apache-spark-sql

我正在使用HiveContext和SparkSQL,并且我试图连接到远程Hive Metastore,设置hive Metastore的唯一方法是在类路径中包含hive-site.xml(或者复制它到/ etc / spark / conf /).

有没有办法在不包含hive-site.xml的情况下以编程方式在java代码中设置此参数?如果是这样,使用什么Spark配置?

8 个答案:

答案 0 :(得分:28)

对于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");

更新如果你的Hive是Kerberized

在创建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");

答案 1 :(得分:15)

在火花2.0。+它看起来应该是这样的:

  

不要忘记将“hive.metastore.uris”替换为您的。这个   假设您已经启动了一个hive Metastore服务(不是   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")

答案 2 :(得分:4)

我也面临同样的问题,但已经解决了。只需按照Spark 2.0版本

中的步骤操作即可

第1步:将Hive-conf文件夹中的hive-site.xml文件复制到spark conf。 enter image description here

第2步:编辑spark-env.sh文件并配置您的mysql驱动程序。 (如果您使用Mysql作为hive Metastore。) enter image description here

或者将MySQL驱动程序添加到Maven / SBT(如果使用那些)

Step3:在创建spark会话时添加enableHiveSupport()

  

val spark = SparkSession.builder.master(" local")。appName(" testing") .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

答案 3 :(得分:2)

下面的代码对我有用。我们可以忽略本地Metastore的hive.metastore.uris配置,spark会在本地备用仓库目录中创建配置单元对象。

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

答案 4 :(得分:2)

火花版本:2.0.2

Hive版本:1.2.1

下面的Java代码对我来说可以从Spark连接到Hive Metastore:

import org.apache.spark.sql.SparkSession;

public class SparkHiveTest {

    public static void main(String[] args) {

        SparkSession spark = SparkSession
                  .builder()
                  .appName("Java Spark Hive Example")
                  .config("spark.master", "local")
                  .config("hive.metastore.uris",                
                   "thrift://maxiqtesting123.com:9083")
                  .config("spark.sql.warehouse.dir", "/apps/hive/warehouse")
                  .enableHiveSupport()
                  .getOrCreate();

        spark.sql("SELECT * FROM default.survey_data limit 5").show();
    }
}

答案 5 :(得分:1)

一些类似的问题被标记为重复,这是从Spark连接到Hive,而不使用hive.metastore.uris或单独的旧服务器(9083),而不是将hive-site.xml复制到SPARK_CONF_DIR。

import org.apache.spark.sql.SparkSession
val spark = SparkSession
  .builder()
  .appName("hive-check")
  .config(
    "spark.hadoop.javax.jdo.option.ConnectionURL",
    "JDBC_CONNECT_STRING"
  )
  .config(
    "spark.hadoop.javax.jdo.option.ConnectionDriverName",
    "org.postgresql.Driver"
  )
  .config("spark.sql.warehouse.dir", "/user/hive/warehouse")
  .config("spark.hadoop.javax.jdo.option.ConnectionUserName", "JDBC_USER")
  .config("spark.hadoop.javax.jdo.option.ConnectionPassword", "JDBC_PASSWORD")
  .enableHiveSupport()
  .getOrCreate()
spark.catalog.listDatabases.show(false)

答案 6 :(得分:1)

设置spark.hadoop.metastore.catalog.default = hive对我有用。

答案 7 :(得分:0)

在Hadoop 3中,Spark和Hive的目录是分开的,因此:

对于火花壳(默认情况下.enableHiveSupport()附带),请尝试:

pyspark-shell --conf spark.hadoop.metastore.catalog.default=hive

对于火花提交作业,您可以像这样触发会话:

SparkSession.builder.appName("Test").enableHiveSupport().getOrCreate()

然后在您的spark-submit命令上添加此conf:

--conf spark.hadoop.metastore.catalog.default=hive

但是对于ORC表(更常见的是内部表),建议使用HiveWareHouse Connector。