Apache Livy:通过 REST 查询 Spark SQL:可能吗?

Posted

技术标签:

【中文标题】Apache Livy:通过 REST 查询 Spark SQL:可能吗?【英文标题】:Apache Livy: query Spark SQL via REST: possible? 【发布时间】:2017-08-16 00:08:39 【问题描述】:

Apache Livy 文档很少:是否可以使用 Apache Livy 将 Spark SQL 查询结果集作为 REST 调用返回?调用应用程序是移动的,它不能使用 odbc/jdbc 进行连接。所以 Spark thriftserver 不是一个选择。

【问题讨论】:

是的,可以通过 livy 使用 spark SQL 进行查询,但目前无法发出纯 SQL。 SQL 需要用 Python、scala 或 java 包装。 Livy 结果可以使用 JSON 等相对未记录的特征进行格式化。回到笔记本电脑时,我会提供更好的答案:) 【参考方案1】:

是的,可以通过 Livy 提交 Spark SQL 查询。但是,[当前] 不支持自行提交的查询。它们需要用 Python 或 Scala 代码包装。

下面是两个使用 Python 执行 Spark SQL 查询的示例,通过 requests lib 和 Scala 代码作为要“在 spark”中执行的字符串与 Livy 进行交互:

1) 在 livy (https://github.com/apache/incubator-livy/blob/412ccc8fcf96854fedbe76af8e5a6fec2c542d25/repl/src/test/scala/org/apache/livy/repl/PythonInterpreterSpec.scala#L91) 中使用 %json 魔法

session_url = host + "/sessions/1"
statements_url = session_url + '/statements'
data = 
        'code': textwrap.dedent("""\
        val d = spark.sql("SELECT COUNT(DISTINCT food_item) FROM food_item_tbl")
        val e = d.collect
        %json e
        """)
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
print r.json()

2) 在 livy (https://github.com/apache/incubator-livy/blob/412ccc8fcf96854fedbe76af8e5a6fec2c542d25/repl/src/test/scala/org/apache/livy/repl/PythonInterpreterSpec.scala#L105) 中使用 %table 魔法

session_url = host + "/sessions/21"
statements_url = session_url + '/statements'
data = 
        'code': textwrap.dedent("""\
        val x = List((1, "a", 0.12), (3, "b", 0.63))
        %table x
        """)
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
print r.json()

【讨论】:

【参考方案2】:

如果您使用的是Livy 0.7.0 或更高版本,则实际上不需要魔术字符串。

    创建会话:
curl --location --request POST 'http://<host>:<port>/sessions' \
--header 'Content-Type: application/json' \
--data-raw '
    "kind": "sql",
    "proxyUser": "cooL_user"
'
    运行查询:
curl --location --request POST 'http://<host>:<port>/sessions/<sessionid>/statements' \
--header 'Content-Type: application/json' \
--data-raw '
    "code": "select 1"
'
    定期轮询结果:
curl --location --request GET http://<host>:<port>/sessions/<sessionid>/statements/0 | jq '.output.data.application/json.data' 

就是这样。现在,您可以将此方法与 Bash 之外的任何语言一起使用。已经有一个名为 PyLivy 的 Python 库,它在底层大致遵循了这种方法。

【讨论】:

以上是关于Apache Livy:通过 REST 查询 Spark SQL:可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark和Livy集群

Livy原理详解

为啥 Apache Livy 会话显示应用程序 id 为 NULL?

关于livy的 java api 报错org.apache.livy.shaded.kryo.kryo.KryoException: Unable to find class: com.xxx.wor

使用apache livy导致的结果集不一致问题记录

使用apache livy导致的结果集不一致问题记录