如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表?
How to Access RDD Tables via Spark SQL as a JDBC Distributed Query Engine?
Whosebug 上的多个帖子的回复包含有关如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表的部分信息。因此,我想问以下问题以获取有关如何执行此操作的完整信息:
在Spark SQL app中,我们需要使用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
除了指定SparkSQL应用的jar和mainclass外,还需要指定其他参数吗?
- 我们还有其他事情需要做吗?
谢谢。
要通过 HiveThriftServer2.startWithContext()
公开 DataFrame 临时表,您可能需要编写 运行 一个简单的应用程序,可能不需要 运行 start-thriftserver.sh
.
针对您的问题:
需要HiveContext
; sqlContext
在 spark-shell
中隐式转换为 HiveContext
写一个简单的应用,例子:
import 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 上启动;
您可以通过使用直线连接到服务器来验证。
在 Java 中,我能够将数据帧公开为临时 tables 并通过直线读取 table 内容(就像常规配置单元 table)
我没有贴出整个程序(假设你已经知道如何创建数据框)
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() -> 包含整个 class 值(从 Hbase 获取的行)
OrgMaster 是一个 java 可序列化的 bean class
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
在另一个终端启动指向这个 thrift 服务的直线,开始使用这个 spark 程序
/opt/hive/hive-1.2/bin/beeline -u jdbc:hive2://<ipaddressofMachineWhereSparkPgmRunninglocally>:10000 -n anyUsername
Show tables -> 命令将显示您在 Spark
中注册的 table
你也可以描述一下
在这个例子中
describe spark_org_master_table;
然后您可以 运行 直接针对此 table 进行常规查询。 (直到你杀死spark程序执行)
Whosebug 上的多个帖子的回复包含有关如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表的部分信息。因此,我想问以下问题以获取有关如何执行此操作的完整信息:
在Spark SQL app中,我们需要使用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
除了指定SparkSQL应用的jar和mainclass外,还需要指定其他参数吗?
- 我们还有其他事情需要做吗?
谢谢。
要通过 HiveThriftServer2.startWithContext()
公开 DataFrame 临时表,您可能需要编写 运行 一个简单的应用程序,可能不需要 运行 start-thriftserver.sh
.
针对您的问题:
-
需要
HiveContext
;sqlContext
在 spark-shell 中隐式转换为 写一个简单的应用,例子:
HiveContext
import 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 上启动; 您可以通过使用直线连接到服务器来验证。
在 Java 中,我能够将数据帧公开为临时 tables 并通过直线读取 table 内容(就像常规配置单元 table)
我没有贴出整个程序(假设你已经知道如何创建数据框)
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() -> 包含整个 class 值(从 Hbase 获取的行)
OrgMaster 是一个 java 可序列化的 bean class
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
在另一个终端启动指向这个 thrift 服务的直线,开始使用这个 spark 程序
/opt/hive/hive-1.2/bin/beeline -u jdbc:hive2://<ipaddressofMachineWhereSparkPgmRunninglocally>:10000 -n anyUsername
Show tables -> 命令将显示您在 Spark
中注册的 table你也可以描述一下
在这个例子中
describe spark_org_master_table;
然后您可以 运行 直接针对此 table 进行常规查询。 (直到你杀死spark程序执行)