使用Apache Spark查询多个Hive存储

时间:2015-09-22 10:22:05

标签: apache-spark hive spark-hive

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

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

到目前为止一切顺利。现在我想连接到两个配置单元商店,我不认为在我的类路径中添加另一个hive-site.xml会有所帮助。我提到了很多文章和火花邮件列表,但找不到任何人这样做。

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

感谢。

提到的文件:

2 个答案:

答案 0 :(得分:6)

我认为通过使用Spark SQL功能可以使用JDBC连接和读取远程数据库中的数据,这是可能的。

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

环境详情

的hadoop-2.6.0

Apache的蜂房2.0.0槽

火花1.3.1彬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 To Other Databases 部分下的详细信息: https://spark.apache.org/docs/1.3.0/sql-programming-guide.html

从Eclipse构建路径:

enter image description here

我没有尝试过什么

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

希望这会有用。

答案 1 :(得分:0)

目前的Spark版本似乎无法做到这一点。阅读Spark Repo中的HiveContext code似乎hive.metastore.uris是可以为许多Metastores配置的东西,但它似乎仅用于跨同一个Metastore的冗余,而不是完全不同的Metastore。

此处提供更多信息https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

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

您可以尝试为多个不同的Metastore配置spark.driver.allowMultipleContexts,但它可能无法正常工作。如果您决定为每个商店创建多个Spark上下文,请确保设置<div class="ui error message"> <i class="close icon"></i> <div class="header"> Your manual overrides are extremely limited in duration! </div> <span class="reason">You're wasting your time, Captain.</span> </div> ,但通常不鼓励这样做,并可能导致意外结果。