35

我有一个 spark 应用程序,它将成功连接到 hive 并使用 spark 引擎查询 hive 表。

为了构建这个,我刚刚添加hive-site.xml到应用程序的类路径中,spark 将读取hive-site.xml连接到它的元存储。这个方法是在 spark 的邮件列表中提出的。

到现在为止还挺好。现在我想连接到两个蜂巢商店,我不认为hive-site.xml在我的类路径中添加另一个会有帮助。我参考了很多文章和 spark 邮件列表,但找不到这样做的人。

有人可以建议我如何实现这一目标吗?

谢谢。

参考的文件:

4

2 回答 2

7

我认为这可以通过利用 Spark SQL 使用 JDBC 从远程数据库连接和读取数据的能力来实现。

经过详尽的研发,我成功地能够使用 JDBC 连接到两个不同的 Hive 环境,并将 Hive 表作为 DataFrames 加载到 Spark 中以进行进一步处理。

环境细节

hadoop-2.6.0

apache-hive-2.0.0-bin

spark-1.3.1-bin-hadoop2.6

代码示例 HiveMultiEnvironment.scala

import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext
object HiveMultiEnvironment {
  def main(args: Array[String]) {
    var conf = new SparkConf().setAppName("JDBC").setMaster("local")
    var sc = new SparkContext(conf)
    var sqlContext = new SQLContext(sc)

    // load hive table (or) sub-query from Environment 1

    val jdbcDF1 = sqlContext.load("jdbc", Map(
      "url" -> "jdbc:hive2://<host1>:10000/<db>",
      "dbtable" -> "<db.tablename or subquery>",
      "driver" -> "org.apache.hive.jdbc.HiveDriver",
      "user" -> "<username>",
      "password" -> "<password>"))
    jdbcDF1.foreach { println }
      
    // load hive table (or) sub-query from Environment 2

    val jdbcDF2 = sqlContext.load("jdbc", Map(
      "url" -> "jdbc:hive2://<host2>:10000/<db>",
      "dbtable" -> "<db.tablename> or <subquery>",
      "driver" -> "org.apache.hive.jdbc.HiveDriver",
      "user" -> "<username>",
      "password" -> "<password>"))
    jdbcDF2.foreach { println }
  }
  // todo: business logic
}

其他参数也可以在加载过程中使用 SqlContext 设置,例如设置 partitionColumn。在 Spark 参考文档中 的“JDBC 到其他数据库”部分中可以找到详细信息: https ://spark.apache.org/docs/1.3.0/sql-programming-guide.html

从 Eclipse 构建路径:

在此处输入图像描述

我没试过的

环境 1 使用 HiveContext,环境 2 使用 SqlContext

希望这会有用。

于 2016-08-07T09:45:16.997 回答
1

这在当前版本的 Spark 中似乎是不可能的。阅读Spark Repo 中的HiveContext 代码hive.metastore.uris,似乎可以为许多 Metastore 进行配置,但它似乎仅用于同一 Metastore 之间的冗余,而不是完全不同的 Metastore。

更多信息在这里https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

但是您可能必须在某处聚合数据才能统一处理。或者,您可以为每个商店创建多个 Spark 上下文。

您可以尝试hive.metastore.uris为多个不同的元存储配置 ,但它可能不起作用。如果您确实决定为每个商店创建多个 Spark 上下文而不是确保您已设置spark.driver.allowMultipleContexts,但通常不鼓励这样做,并且可能会导致意外结果。

于 2016-05-03T16:48:17.033 回答