如何使用Spark SQL 的JDBC server

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Spark SQL 的JDBC server相关的知识,希望对你有一定的参考价值。

参考技术A   运行环境
集群环境:CDH5.3.0
具体JAR版本如下:
spark版本:1.2.0-cdh5.3.0
hive版本:0.13.1-cdh5.3.0
hadoop版本:2.5.0-cdh5.3.0
启动
JDBC
server
cd
/etc/spark/conf
ln
-s
/etc/hive/conf/hive-site.xml
hive-site.xml
cd
/opt/cloudera/parcels/CDH/lib/spark/
chmod-
-R
777
logs/
cd
/opt/cloudera/parcels/CDH/lib/spark/sbin
./start-thriftserver.sh
--master
yarn
--hiveconf
hive.server2.thrift.port=10008
Connecting
to
the
JDBC
server
with
Beeline
cd
/opt/cloudera/parcels/CDH/lib/spark/bin
beeline
-u
jdbc:hive2://hadoop04:10000
[root@hadoop04
bin]#
beeline
-u
jdbc:hive2://hadoop04:10000
scan
complete
in
2ms
Connecting
to
jdbc:hive2://hadoop04:10000
Connected
to:
Spark
SQL
(version
1.2.0)
Driver:
Hive
JDBC
(version
0.13.1-cdh5.3.0)
Transaction
isolation:
TRANSACTION_REPEATABLE_READ
Beeline
version
0.13.1-cdh5.3.0
by
Apache
Hive
0:
jdbc:hive2://hadoop04:10000>
Working
with
Beeline
Within
the
Beeline
client,
you
can
use
standard
HiveQL
commands
to
create,
list,
and
query
tables.
You
can
find
the
full
details
of
HiveQL
in
the
Hive
Language
Manual,but
here,
we
show
a
few
common
operations.
CREATE
TABLE
IF
NOT
EXISTS
mytable
(key
INT,
value
STRING)
ROW
FORMAT
DELIMITED
FIELDS
TERMINATED
BY
',';
create
table
mytable(name
string,addr
string,status
string)
row
format
delimited
fields
terminated
by
'#'
#加载本地文件
load
data
local
inpath
'/external/tmp/data.txt'
into
table
mytable
#加载hdfs文件
load
data
inpath
'hdfs://ju51nn/external/tmp/data.txt'
into
table
mytable;
describe
mytable;
explain
select
*
from
mytable
where
name
=
'张三'
select
*
from
mytable
where
name
=
'张三'
cache
table
mytable
select
count(*)
total,count(distinct
addr)
num1,count(distinct
status)
num2
from
mytable
where
addr='gz';
uncache
table
mytable
使用数据示例
张三#广州#学生
李四#贵州#教师
王五#武汉#讲师
赵六#成都#学生
lisa#广州#学生
lily#gz#studene
Standalone
Spark
SQL
Shell
Spark
SQL
also
supports
a
simple
shell
you
can
use
as
a
single
process:
spark-sql
它主要用于本地的开发环境,在共享集群环境中,请使用JDBC
SERVER
cd
/opt/cloudera/parcels/CDH/lib/spark/bin
./spark-sql

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

【中文标题】如何通过 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 server的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在火花中使用 sql server 2012 jdbc jar

使用 JDBC(例如 Squirrel SQL)用 Spark SQL 查询 Cassandra

Spark SQL为JDBC查询生成错误的上限和下限

Spark SQL - 使用 SQL 语句使用 JDBC 加载数据,而不是表名

SPARK_sql加载,hive以及jdbc使用