我们使用Spark 1.2.1
和Java处理我们的数据并存储在Hive表中。我们希望从Web浏览器访问此数据作为RDD。
我阅读了文档,并了解了完成任务的步骤。
我无法通过thrift服务器找到与Spark SQL RDDs
交互的方式。我发现的示例在代码中有一些后缀,我在Spark 1.2.1 java API文档中找不到这个类。
HiveThriftServer2.startWithContext
在github中,我看到了scala示例 导入org.apache.spark.sql.hive.thriftserver,但我在Java API文档中没有看到这一点。不确定我是否遗漏了什么。
有人通过thrift从浏览器访问Spark SQL RDD有幸吗?你可以发布代码片段吗?我们正在使用Java。
答案 0 :(得分:1)
我已经完成了大部分工作。让我们剖析它的每一部分:(帖子底部的参考文献)
HiveThriftServer2.startWithContext
在Scala中定义。我无法使用Py4j从Java或Python访问它,也不是JVM专家,但我最终切换到了Scala。这可能与注释@DeveloperApi
有关。这就是我在Spark 1.6.1中导入Scala的方法:
import org.apache.spark.sql.hive.thriftserver.HiveThriftServer2
对于阅读此内容而不使用Hive的任何人,Spark SQL上下文都不会这样做,您需要一个hive上下文。但是,HiveContext构造函数需要Java spark上下文,而不是scala上下文。
import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.sql.hive.HiveContext
var hiveContext = new HiveContext(JavaSparkContext.toSparkContext(sc))
现在启动节俭服务器
HiveThriftServer2.startWithContext(hiveContext)
// Yay
接下来,我们需要将RDD作为SQL表提供。首先,我们必须将它们转换为Spark SQL DataFrames:
val someDF = hiveContext.createDataFrame(someRDD)
然后,我们需要将它们转换为Spark SQL表。您可以将它们保存到Hive,或者将RDD作为临时表提供。
坚持到Hive:
// Deprecated since Spark 1.4, to be removed in Spark 2.0:
someDF.saveAsTable("someTable")
// Up-to-date at time of writing
someDF.write().saveAsTable("someTable")
或者,使用临时表:
// Use the Data Frame as a Temporary Table
// Introduced in Spark 1.3.0
someDF.registerTempTable("someTable")
注意 - 临时表与SQL会话隔离。
Spark的hive thrift服务器默认是多会话的
在1.6版本中(每个连接一个会话)。因此,
让客户访问您已注册的临时表,
您需要将选项spark.sql.hive.thriftServer.singleSession
设置为true
您可以通过查询beeline
中的表来进行测试,这是一个用于与hive thrift服务器交互的命令行实用程序。它附带Spark。
最后,您需要一种从浏览器访问配置单元服务器的方法。由于它有很棒的开发人员,它有一个HTTP模式,所以如果你想构建一个Web应用程序,你可以使用thrift协议而不是来自浏览器的AJAX请求。一个更简单的策略可能是创建一个IPython笔记本,并使用pyhive
连接到thrift服务器。
数据框参考: https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/sql/DataFrame.html
singleSession选项拉取请求: https://mail-archives.apache.org/mod_mbox/spark-commits/201511.mbox/%3Cc2bd1313f7ca4e618ec89badbd8f9f31@git.apache.org%3E
HTTP模式和beeline howto: https://spark.apache.org/docs/latest/sql-programming-guide.html#distributed-sql-engine
Pyhive: https://github.com/dropbox/PyHive
HiveThriftServer2 startWithContext定义: https://github.com/apache/spark/blob/6b1a6180e7bd45b0a0ec47de9f7c7956543f4dfa/sql/hive-thriftserver/src/main/scala/org/apache/spark/sql/hive/thriftserver/HiveThriftServer2.scala#L56-73
答案 1 :(得分:0)
Thrift是JDBC / ODBC服务器
您可以通过JDBC / ODBC连接与它连接,并通过HiveDriver访问内容
您可以不从中获取RDD,因为HiveContext
不可用
您所说的是Java不具备的实验性功能。
作为一种解决方法,您可以重新解析结果并为您的客户创建结构 例如:
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static String hiveConnectionString = "jdbc:hive2://YourHiveServer:Port";
private static String tableName = "SOME_TABLE";
Class c = Class.forName(driverName);
Connection con = DriverManager.getConnection(hiveConnectionString, "user", "pwd");
Statement stmt = con.createStatement();
String sql = "select * from "+tableName;
ResultSet res = stmt.executeQuery(sql);
parseResultsToObjects(res);