site.xml的情况下将spark sql连接到远程hive元存储(通过thrift协议)?

ncgqoxb0  于 2021-05-27  发布在  Hadoop
关注(0)|答案(8)|浏览(366)

我将hivecontext与sparksql结合使用,并尝试连接到远程配置单元元存储,设置配置单元元存储的唯一方法是在类路径中包含hive-site.xml(或将其复制到/etc/spark/conf/)。
有没有一种方法可以在不包含hive-site.xml的java代码中以编程方式设置此参数?如果是的话,使用什么样的spark配置?

x4shl7ld

x4shl7ld1#

一些类似的问题被标记为重复,这是从spark连接到hive而不使用 hive.metastore.uris 或者分离thrift服务器(9083),并且不将hive-site.xml复制到spark\ u conf\ u目录。

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

yzxexxkh2#

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

lyr7nygr3#

下面的代码对我有用。我们可以忽略 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");
  }
}
ruarlubt

ruarlubt4#

在spark 2.0中,+应该是这样的:
别忘了用你的替换“hive.metastore.uris”。这假设您已经启动了一个配置单元元存储服务(不是配置单元服务器)。

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

qyuhtwio5#

我也面临同样的问题,但解决了。在spark 2.0版本中只需执行以下步骤
步骤1:将hive-site.xml文件从hive conf文件夹复制到spark conf。

第二步:编辑spark-env.sh文件并配置mysql驱动程序(如果您使用mysql作为配置单元元存储。)

或者向maven/sbt添加mysql驱动程序(如果使用这些驱动程序的话)
步骤3:创建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")
  }
}

输出:

hfyxw5xn

hfyxw5xn6#

spark版本:2.0.2
配置单元版本:1.2.1
下面是我从spark连接到hive元存储的java代码:

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://abc123.com:9083")
                  .config("spark.sql.warehouse.dir", "/apps/hive/warehouse")
                  .enableHiveSupport()
                  .getOrCreate();

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

ukdjmx9f7#

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

tzcvj98z

tzcvj98z8#

在hadoop 3中,spark和hive目录是分开的,因此:
对于Spark壳(随附 .enableHiveSupport() 默认情况下)只需尝试:

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

对于spark提交作业,创建如下spark会话:

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

然后在spark submit命令中添加以下conf:

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

但是对于orc表(以及更一般的内部表),建议使用hivewarehouse连接器。

相关问题