Apache spark 通过thrift server-java从web浏览器访问Spark RDD

Apache spark 通过thrift server-java从web浏览器访问Spark RDD,apache-spark,thrift,rdd,Apache Spark,Thrift,Rdd,我们已使用Java使用Spark 1.2.1处理数据,并存储在Hive表中。我们希望从web浏览器以RDD的形式访问此数据 我阅读了文档,了解了完成任务的步骤 我无法找到通过thrift server与Spark SQL RDD进行交互的方法。我发现的示例在代码中有一行,我在Spark 1.2.1 java API文档中找不到用于此的类 HiveThriftServer2.startWithContext 在github中,我看到了使用 导入org.apache.spark.sql.hive.t

我们已使用Java使用Spark 1.2.1处理数据,并存储在Hive表中。我们希望从web浏览器以RDD的形式访问此数据

我阅读了文档,了解了完成任务的步骤

我无法找到通过thrift server与Spark SQL RDD进行交互的方法。我发现的示例在代码中有一行,我在Spark 1.2.1 java API文档中找不到用于此的类

HiveThriftServer2.startWithContext

在github中,我看到了使用 导入org.apache.spark.sql.hive.thriftserver,但我在Java API文档中没有看到这一点。不确定我是否遗漏了什么


有人有幸通过thrift从浏览器访问Spark SQL RDD吗?你能发布代码片段吗。我们正在使用Java

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

我已经把大部分工作做好了。让我们剖析它的每一部分:(文章底部的引用)

HiveThriftServer2.startWithContext
在Scala中定义。我从来没有能够使用Py4j从Java或Python访问它,我也不是JVM专家,但我最终选择了Scala。这可能与注释
@DeveloperApi
有关。这就是我在Spark 1.6.1中导入Scala的方式:

import org.apache.spark.sql.hive.thriftserver.HiveThriftServer2
对于阅读本文而不使用配置单元的任何人来说,Spark SQL上下文是不行的,您需要配置单元上下文。但是,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))
现在启动thrift服务器

HiveThriftServer2.startWithContext(hiveContext)

// Yay
接下来,我们需要将RDD作为SQL表提供。首先,我们必须将它们转换为Spark SQL数据帧:

val someDF = hiveContext.createDataFrame(someRDD)
然后,我们需要将它们转换为Spark SQL表。您可以通过将它们持久化到配置单元中,或者使RDD作为临时表可用来实现这一点

保留到配置单元:

// 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
中的表来测试这一点,beeline是一个用于与hive thrift服务器交互的命令行实用程序。它带有火花

最后,您需要一种从浏览器访问hive thrift服务器的方法。多亏了它的优秀开发者,它有一个HTTP模式,所以如果你想构建一个web应用程序,你可以在浏览器的AJAX请求上使用thrift协议。一个更简单的策略可能是创建一个IPython笔记本,并使用
pyhive
连接到thrift服务器

数据帧参考:

singleSession选项拉取请求:

HTTP模式和直线方式:

蜂箱:

HiveThriftServer2 startWithContext定义: