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 Livy 会话显示应用程序 id 为 NULL?
关于livy的 java api 报错org.apache.livy.shaded.kryo.kryo.KryoException: Unable to find class: com.xxx.wor