【问题标题】:Accessing Spark SQL RDD tables through the Thrift Server通过 Thrift Server 访问 Spark SQL RDD 表
【发布时间】:2015-01-22 09:40:09
【问题描述】:

我已经向 Spark SQL 注册了一个临时表,如[this section] 中所述:

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

现在我想通过 JDBC 远程访问这个表。我按照[this other section] 中的说明启动 Thrift 服务器。

./sbin/start-thriftserver.sh --master spark://same-master-as-above:7077

但是表格是不可见的。

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

我猜这是因为该表是“临时的”(即与 SqlContext 对象的生命周期相关联)。但是如何制作非临时表呢?

我可以通过 Thrift Server 看到 Hive tables,但我不知道如何公开这样的 RDD。我发现 a comment 表明我不能。

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

【问题讨论】:

  • 你找到了可行的答案吗?
  • 当使用 pyspark 时它不起作用

标签: apache-spark apache-spark-sql


【解决方案1】:

很可能您已经解决了这个问题。 但我最近尝试了一个类似的用例,并想分享我的发现。 要通过 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 是 Hive 和 Spark 附带的简单 JDBC 客户端。启动beeline并将其连接到您的thrift服务器

SPARK_HOME/bin/beeline

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 用户名,密码留空(这是非安全模式,如果需要,你可以使事情更安全)

  • 表“tweets”在“show tables”等中不可见,因为该表未在 hive 元存储中注册,但您可以通过 jdbc 对该表执行所有 sql 查询

  • 您可以使用 Spark 将数据缓存在内存中并通过远程 jdbc/odbc 进行查询。这将产生低延迟响应,对于大约 40 GB 的数据大小,我得到了

一切顺利!

MK

【讨论】:

  • 谢谢,这是很多有用的细节!但缺少的是我不能只从命令行启动 Thriftserver。我有一些希望通过 JDBC 访问的 Spark RDD。所以我需要 Thriftserver 来使用我正在运行的 Spark 应用程序的 SparkContext。我还没有尝试过HiveThriftServer2.startWithContext,但是当我这样做时,你的指示会很有帮助!
  • @user1158559:不,抱歉。事实证明,我们毕竟没有实际的用例,所以我没有进一步研究。
  • 谢谢。只是为了让任何阅读这篇文章的人都知道,我在发布该评论后让它工作了。临时表是每个 SQL 会话的,因此您需要启用 spark.sql.hive.thriftServer.singleSession 以便与您的 SQL 客户端共享它们。 spark.apache.org/docs/latest/…
  • 另见stackoverflow.com/questions/36628918/…无法访问python中创建的临时表
  • 你能解释一下我们应该如何“让事情更安全”吗?即,我们如何在没有 Kerberos 的情况下在 thrift 服务器中进行正确的用户/通过身份验证?
【解决方案2】:

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

这允许 Thrift 服务器直接查看基于 RDD 的临时表,而无需保存表。您也可以在 Spark SQL 中执行 CACHE TABLE XXX AS &lt;query&gt; 并通过 ODBC/JDBC 公开它。

【讨论】:

    【解决方案3】:

    来自SPARK-3675

    邮件列表中的一个常见问题是如何通过 JDBC 从临时表中读取数据。虽然我们应该在 SQL 中尝试并支持其中的大部分内容,但通过 JDBC 查询通用 RDD 也会很好。

    解决方案(在 Spark 1.2.0 中出现)确实是使用 HiveThriftServer2.startWithContext

    【讨论】:

    【解决方案4】:

    临时表背后的一般想法,至少从最初的 RDBMS 意图来看是它的范围非常有限,通常是用户会话,并且超出范围并在会话结束时被清理。

    如果您在一个会话中创建临时表,那么通过 JDBC 或 ODBC 连接到 thriftserver 的另一个会话将无法看到它,这是设计使然。如果您需要一个表在会话之后持续存在,那么根据定义它不是临时的。

    建议“启用 spark.sql.hive.thriftServer.singleSession 以便与您的 SQL 客户端共享它们”的解决方案可行,但有点违背了拥有多会话环境的目的。设置单个会话有效地强制临时表表现为持久表,但如果 hive 元存储重新启动,它们仍然会脱离上下文。

    使用 SqlContext 来创建表很容易,或者使用 saveAsTable() 参见:https://spark.apache.org/docs/1.6.0/sql-programming-guide.html#saving-to-persistent-tables

    编辑,spark 1.3 文档中似乎首先提到了 saveAsTable,但如果您使用的是早期版本,则可以使用 inlineSQL 方法。

    people.write.saveAsTable("people")
    

    这会将 people 表保存在您的默认数据库中。最好先创建一个数据库并指定它:

    people.write.saveAsTable("databaseName.people")
    

    或使用内联 SQL

    sqlContext.sql("CREATE TABLE IF NOT EXISTS people
    as SELECT name FROM people WHERE age >= 13 AND age <= 19")
    

    这两种方法都将在 hive 元存储中注册持久表。 saveAsTable 还可以选择是否要追加或覆盖

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 2018-01-15
      • 2017-03-31
      • 2019-06-08
      • 2015-10-08
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多