site.xml的值,而不是在执行spark jar时引用路径

pb3skfrl  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(279)

我有一段代码将表从hive提取到spark,它运行良好,因此我将hive-site.xml文件放在eclipse的resource文件夹中。
接下来,我将代码转换为jar文件,并引用hive-site.xml文件的路径来执行程序。
我为什么可以在内部(在程序本身中)使用hive-site.xml的值来覆盖文件引用部分?
代码如下:

val appConf = ConfigFactory.load()
val conf = new SparkConf().
  setAppName("hivedb").setMaster(appConf.getConfig(args(0)).getString("deploymentMaster"))
val sc = new SparkContext(conf)
val hc = new HiveContext(sc)

val source = hc.sql("SELECT * from sample.source").rdd.map(_.mkString(","))
val destination = hc.sql("select * from sample.destination").rdd.map(_.mkString(","))

hive-site.xml文件值:

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value>
</property>

 <property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveroot</value>   
  </property>

 <property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepassword</value>   
  </property>

 <property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive/${user.name}</value>   
  </property>

</configuration>

我要找的东西如下:

val url = "jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true"
val user = "hiveroot"
val password = "hivepassword"
val src ="/tmp/hive/${user.name}"
val a = hc.read.format("jdbc").options(Map("javax.jdo.option.ConnectionURL" -> url,    
  "user" -> user,
  "password" -> password,
  "sql" -> "sample.source",
  "hive.exec.scratchdir"->src)).load().collect().foreach(println)

在程序中只使用hive-site.xml文件的必需值,而不需要引用该文件。
正如Raktopal bordoloi所建议的

val warehouseLocation = "/usr/hive/warehouse"
val spark = SparkSession.builder().master("local")
.appName("spark session example")
.config("javax.jdo.option.ConnectionURL","jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true")
  .config("javax.jdo.option.ConnectionUserName","hiveroot")
  .config("javax.jdo.option.ConnectionPassword","hivepassword")
  .config("hive.exec.scratchdir","/tmp/hive/${user.name}")
  .config("spark.sql.warehouse.dir", warehouseLocation)
 // .config("hive.metastore.uris", "thrift://localhost:9083")      
  .enableHiveSupport()
  .getOrCreate()

导入spark.implicits.\uimport spark.sql
sql(“select*from sample.source”).collect.foreach(println)
谢谢您!

fhg3lkii

fhg3lkii1#

在Spark2.0中,在创建sparksession之前,可以在sparksession的生成器上设置“spark.sql.warehouse.dir”。它应该在创建配置单元上下文时正确传播。

val spark = SparkSession.builder()
.config("spark.sql.warehouse.dir", "...")
.config("hive.metastore.uris", "thrift://localhost:9083")

当模式是远程的(在上面的例子中),像“javax.jdo.option.connectionurl”这样的配置将不会被使用(因为它们被与数据库对话的远程元存储服务器使用)。
对于spark 1.6,需要将hive-site.xml放在类路径中。

相关问题