Apache spark 使用apachespark查询多个配置单元存储
我有一个spark应用程序,它将成功连接到配置单元并使用spark引擎查询配置单元表 为了构建它,我刚刚将Apache spark 使用apachespark查询多个配置单元存储,apache-spark,hive,spark-hive,Apache Spark,Hive,Spark Hive,我有一个spark应用程序,它将成功连接到配置单元并使用spark引擎查询配置单元表 为了构建它,我刚刚将hive site.xml添加到应用程序的类路径中,spark将读取hive site.xml以连接到它的元存储。spark的邮件列表中建议了这种方法 到目前为止还不错。现在我想连接到两个hive商店,我不认为在我的类路径中添加另一个hive site.xml会有帮助。我参考了不少文章和spark邮件列表,但找不到有人这样做 有人能建议我如何做到这一点吗 谢谢 参考文件: 这在当前版
hive site.xml
添加到应用程序的类路径中,spark将读取hive site.xml
以连接到它的元存储。spark的邮件列表中建议了这种方法
到目前为止还不错。现在我想连接到两个hive商店,我不认为在我的类路径中添加另一个hive site.xml
会有帮助。我参考了不少文章和spark邮件列表,但找不到有人这样做
有人能建议我如何做到这一点吗
谢谢
参考文件:
- 这在当前版本的Spark中似乎不可能实现。在Spark Repo中阅读,似乎可以为许多元存储配置
hive.metastore.uri
,但它似乎仅用于相同元存储之间的冗余,而不是完全不同的元存储
更多信息请点击此处
但是,为了协调一致地处理数据,您可能必须在某个地方聚合数据。或者,您可以为每个商店创建多个Spark上下文
您可以尝试为多个不同的元存储配置
hive.metastore.uri
,但它可能不起作用。如果您决定为每个存储创建多个Spark上下文,请确保设置Spark.driver.allowMultipleContexts
,但这通常是不鼓励的,并且可能会导致意外的结果。我认为,通过使用Spark SQL功能,使用JDBC从远程数据库连接和读取数据,这是可能的
经过彻底的研发,我成功地使用JDBC连接到两个不同的配置单元环境,并将配置单元表作为数据帧加载到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
}
import org.apache.spark.SparkConf
导入org.apache.spark.sql.SQLContext
导入org.apache.spark.SparkContext
对象HiveMultiEnvironment{
def main(参数:数组[字符串]){
var conf=new SparkConf().setAppName(“JDBC”).setMaster(“本地”)
var sc=新的SparkContext(conf)
var sqlContext=新的sqlContext(sc)
//从环境1加载配置单元表(或)子查询
val jdbcDF1=sqlContext.load(“jdbc”,Map(
“url”->“jdbc:hive2://:10000/”,
“数据库表”->”,
“驱动程序”->“org.apache.hive.jdbc.HiveDriver”,
“用户”->”,
“密码”->”)
jdbcDF1.foreach{println}
//从环境2中加载配置单元表(或)子查询
val jdbcDF2=sqlContext.load(“jdbc”,Map(
“url”->“jdbc:hive2://:10000/”,
“数据库表”->“或”,
“驱动程序”->“org.apache.hive.jdbc.HiveDriver”,
“用户”->”,
“密码”->”)
jdbcDF2.foreach{println}
}
//todo:业务逻辑
}
在加载期间,还可以使用SqlContext设置其他参数,例如设置partitionColumn。Spark reference doc中的“JDBC到其他数据库”部分下的详细信息:
从Eclipse生成路径:
我没有尝试过的
对环境1使用HiveContext,对环境2使用SqlContext
希望这将是有用的。只是一个解决方法的想法:配置单元数据驻留在HDFS上无论如何,您可以在文件或目录上创建数据帧吗?我的意思是,
sc.wholeTextFiles('hdfs://host/usr/hive/warehouse/mytable“)
将为您提供配置单元表的内容。当然,你会对元数据失去信心,但它可能会成功。我问了自己同样的问题,搜索了很多,阅读了Spark的一些代码-到目前为止,我几乎相信这是不可能的,至少在同一个SparkContext中是不可能的:(@karthik manchala我试图安装Spark Hive并运行它HortonWorks沙盒,但我遇到了一些错误,你能帮我解决吗。代码库位于:。我在HortonWorks社区发布了一个问题,如果想看看。你想添加一些详细信息吗?也许更新到Spark 2.0.0?这个答案肯定很有帮助。我有tr我以前就遇到过这个问题,jdbc方法的问题是..我无法从dataframe createdStrange中选择特定列,它如何用于分析函数,因为sqlContext不支持配置单元中的分析函数。您能用hivecontext向我解释上述场景吗??