【问题标题】:How to provide the values of Hive-site.xml Internally instead of refering to the path on execution of Spark Jar如何在内部提供 Hive-site.xml 的值,而不是引用 Spark Jar 的执行路径
【发布时间】:2017-06-15 15:30:23
【问题描述】:

我有一段代码可以从 Hive 获取表到 spark 并且它工作正常,因为我将 Hive-site.xml 文件放在 Eclipse 的资源文件夹中。

接下来我将代码转换为 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 文件所需的值,无需引用该文件。

根据 Raktotpal 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._ 导入 spark.sql

sql("select * from sample.source").collect.foreach(println)

谢谢!

【问题讨论】:

  • 您打算如何在不参考文件的情况下从文件中获取数据?

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


【解决方案1】:

在 Spark 2.0 中,您可以在创建 SparkSession 之前在 SparkSession 的构建器上设置“spark.sql.warehouse.dir”。它应该在创建 Hive-Context 时正确传播。

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 放在类路径中。

【讨论】:

  • 谢谢你 Raktotpal Bordoloi,它工作正常没有任何问题,你又救了我:) 但它没有在 conf .config("hive.metastore.uris", "thrift:// localhost:9083") 在实例化 'org.apache.spark.sql.hive.HiveSessionState' 时抛出类似错误之类的错误。
  • 我有一个问题,请看一下 1.现在我在 localhost 中运行,所以如果我在远程有 Metastore,我可以轻松删除它。
  • 你的 hiverserver 版本是多少?如果你在 hiverser2 上运行;你应该把conf像conf .config("hive.metastore.uris", "hive2://localhost:9083")
  • 我正在尝试访问位于远程计算机同一网络中的 hive2 中的表。在线程“main”java.lang.IllegalArgumentException 中得到这些错误异常:实例化“org.apache.spark.sql.hive.HiveSessionState”时出错。我这样用过 .config("hive.metastore.uris", "hive2://remoteservername:9083")
  • 很抱歉; hiveserver1 或 hiveserver2 是不同于 Metastore 服务的服务。
猜你喜欢
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多