我有一个spark应用程序,它将成功连接到hive并使用spark引擎查询hive表。
为了构建这个,我只是将hive-site.xml
添加到应用程序的类路径中,spark将读取hive-site.xml
以连接到它的Metastore。这个方法在spark的邮件列表中被提出。
到目前为止一切顺利。现在我想连接到两个配置单元商店,我不认为在我的类路径中添加另一个hive-site.xml
会有所帮助。我提到了很多文章和火花邮件列表,但找不到任何人这样做。
有人可以建议我如何实现这个目标吗?
感谢。
提到的文件:
答案 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构建路径:
我没有尝试过什么
对环境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>
,但通常不鼓励这样做,并可能导致意外结果。