通过thrift服务器从java浏览器访问Spark RDD - java

时间:2015-04-24 06:46:15

标签: apache-spark thrift rdd

我们使用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。

2 个答案:

答案 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);