如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表?

Posted

技术标签:

【中文标题】如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表?【英文标题】:How to Access RDD Tables via Spark SQL as a JDBC Distributed Query Engine? 【发布时间】:2015-10-08 04:34:00 【问题描述】:

*** 上的一些帖子的回复包含有关如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表的部分信息。因此,我想询问以下问题以获取有关如何执行此操作的完整信息:

    在 Spark SQL 应用中,我们是否需要使用 HiveContext 来注册表?或者我们可以只使用 SQL 上下文吗?

    我们在哪里以及如何使用 HiveThriftServer2.startWithContext?

    当我们运行start-thriftserver.sh

/opt/mapr/spark/spark-1.3.1/sbin/start-thriftserver.sh --master spark://spark-master:7077 --hiveconf hive.server2.thrift.bind.host spark-master --hiveconf hive.server2.trift.port 10001

除了指定 Spark SQL 应用的 jar 和 main 类,我们还需要指定其他参数吗?

    我们还有什么需要做的吗?

谢谢。

【问题讨论】:

请注意,问题不是关于公开 Hive 表的。问题是关于如何通过 thrift-server 公开 Spark SQL 程序的 RDD 表/数据帧。例如,假设我的 Spark SQL 程序提供了自己的 RDD 表/数据帧。并将它们注册为 DataFrame.registerTempTable。它如何将这些 RDD 表/Dataframes 暴露给 Thrift 服务器,以便外部应用程序可以通过 JDBC 访问它们? 【参考方案1】:

要通过HiveThriftServer2.startWithContext()公开DataFrame临时表,您可能需要编写并运行一个简单的应用程序,可能不需要运行start-thriftserver.sh

对于您的问题:

    需要HiveContextsqlContext 在 spark-shell 中隐式转换为 HiveContext

    写一个简单的应用程序,例子:

导入 org.apache.spark.sql.hive.thriftserver._ val hiveContext = new HiveContext(sparkContext) hiveContext.parquetFile(path).registerTempTable("my_table1") HiveThriftServer2.startWithContext(hiveContext)
    无需运行start-thriftserver.sh,而是运行您自己的应用程序,例如:

spark-submit --class com.xxx.MyJdbcApp ./package_with_my_app.jar

    服务器端没有其他内容,应该从默认端口 10000 开始; 您可以通过直线连接到服务器来验证。

【讨论】:

海鹰,你的解决方案有效!我能够通过直线连接以查询已注册的临时表。非常感谢您的帮助。 @michael 我只是想知道为什么这个答案不被接受为所有者?有什么具体原因吗? @RamGhadiyaram 对不起。我错过了你的问题。我接受了这个答案。【参考方案2】:

在 Java 中,我能够将数据框公开为临时表并通过直线读取表内容(就像常规配置单元表一样)

我还没有发布整个程序(假设您已经知道如何创建数据框)

import org.apache.spark.sql.hive.thriftserver.*;

HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(sc.sc());
DataFrame orgDf = sqlContext.createDataFrame(orgPairRdd.values(), OrgMaster.class);

orgPairRdd 是一个 JavaPairRDD,orgPairRdd.values() -> 包含整个类值(从 Hbase 获取的行)

OrgMaster 是一个 java bean 可序列化类

orgDf.registerTempTable("spark_org_master_table");

HiveThriftServer2.startWithContext(sqlContext);

我在本地提交了程序(因为 Hive thrift 服务器没有在该机器的 10000 端口运行)

hadoop_classpath=$(hadoop classpath)
HBASE_CLASSPATH=$(hbase classpath)

spark-1.5.2/bin/spark-submit   --name tempSparkTable     --class packageName.SparkCreateOrgMasterTableFile  --master local[4]   --num-executors 4    --executor-cores 4    --executor-memory 8G   --conf "spark.executor.extraClassPath=$HBASE_CLASSPATH"   --conf "spark.driver.extraClassPath=$HBASE_CLASSPATH"    --conf "spark.executor.extraClassPath=$hadoop_classpath"  --conf  --jars /path/programName-SNAPSHOT-jar-with-dependencies.jar  
    /path/programName-SNAPSHOT.jar

在另一个终端启动直线指向这个使用这个 spark 程序启动的 thrift 服务

/opt/hive/hive-1.2/bin/beeline -u jdbc:hive2://<ipaddressofMachineWhereSparkPgmRunninglocally>:10000 -n anyUsername

显示表格 -> 命令将显示您在 Spark 中注册的表格

你也可以描述一下

在这个例子中

describe spark_org_master_table;

然后您可以在直线中针对此表运行常规查询。 (直到你终止了 spark 程序的执行)

【讨论】:

以上是关于如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表?的主要内容,如果未能解决你的问题,请参考以下文章

Spark上的Hive如何从jdbc读取数据?

Spark 分布式SQL引擎

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

「Spark」Spark SQL Thrift Server运行方式

如何使用Spark SQL 的JDBC server

教程:Apache Spark SQL入门及实践指南!