通过Thrift服务器访问Spark SQL RDD表

Dan*_*bos 19 apache-spark apache-spark-sql

我已经使用Spark SQL注册了一个临时表,如[本节]中所述:

people.registerTempTable("people")
// I can run queries on it all right.
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
Run Code Online (Sandbox Code Playgroud)

现在我想通过JDBC远程访问该表.我按照[其他部分]中的描述启动Thrift服务器.

./sbin/start-thriftserver.sh --master spark://same-master-as-above:7077
Run Code Online (Sandbox Code Playgroud)

但桌子不可见.

0: jdbc:hive2://localhost:10000> show tables;         
+---------+
| result  |
+---------+
+---------+
No rows selected (2.216 seconds)
Run Code Online (Sandbox Code Playgroud)

我想这是因为表是"临时的"(即与SqlContext对象的生命周期相关).但是我如何制作非临时表?

我可以通过Thrift服务器看到Hive表,但我不知道如何公开这样的RDD.我发现了一条评论,暗示我做不到.

或者我应该使用自己的应用程序在我的应用程序中运行Thrift服务器SqlContext?几乎所有的类都是private,并且这个代码不在Maven Central中(据我所知).我应该用HiveThriftServer2.startWithContext吗?它没有文档@DeveloperApi,但可能有用.

M.K*_*M.K 16

很可能你已经解决了这个问题.但我最近尝试了一个类似的用例,并想分享我的发现.要通过JDBC公开Spark数据,您需要执行以下操作:

  • 启动Spark附带的thrift-server(我使用的是1.3.1版),带有Hive的thrift-server也可以工作,但我还没有测试过

    /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

确保您不将"localhost"但服务器的实际ip-address/dnsname赋予"hive.server2.thrift.bind.host",否则您无法从其他主机连接到此thrift服务器

  • beeline是一个简单的JDBC客户端,随Hive和Spark一起提供.直线启动并将其连接到您的节俭服务器

SPARK_HOME /斌/直线

beeline>!connect jdbc:hive2:// spark-master:10001

  • 你可以在这里使用任何hiveql将你想要的数据加载到表中,但是sql将在Spark集群中执行

    使用org.apache.spark.sql.parquet选项创建临时表推文(路径'maprfs:/// path-to-your-parquet-files /');

  • 将表缓存在spark内存中

缓存表推文

  • 就是这样,你的所有数据现在都缓存在spark集群中,你可以通过远程jdbc以低延迟查询它

  • jdbc编码与编写任何hive jdbc代码完全相同,因为thrift服务器理解hiveql并将其转换为spark sql.在这里查看hive jdbc示例:

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLs

对于用户名,您可以在thrift-server机器中提供任何linux用户名并将密码留空(这是非安全模式,如果需要,您可以使事情更安全)

  • 使用"show tables"等不会显示"tweets"表,因为该表未在hive Metastore中注册,但您可以使用jdbc上的表执行所有sql查询

  • 您可以使用Spark来缓存内存中的数据并通过远程jdbc/odbc查询.这将产生低延迟响应,对于大约40 GB的数据大小,我得到<2秒的响应.但是,缓存不适用于真正的大数据,如tera字节.在这种情况下,请避免使用"cache table ..."命令,您仍然可以使用远程jdbc/odbc,但响应不会处于低延迟范围内

祝一切顺利!

MK


小智 4

修改spark-defaults.conf并添加spark.sql.hive.thriftServer.singleSession true.

这允许 Thrift 服务器直接基于 RDD 查看临时表,而无需保存该表。您还可以CACHE TABLE XXX AS <query>在 Spark SQL 中执行操作并通过 ODBC/JDBC 公开它。