如何调用从 Spark 作业调用的 Web 服务?

BdE*_*eer 5 apache-spark apache-spark-sql spark-structured-streaming

我想调用一个 Web 服务来获取 Spark Structured Streaming 中的一些数据。是否可以?如何?

dre*_*-hh 3

TL)DR 从技术上来说,是的。

然而,对于使用 Web 服务,火花流并不是必需的。Spark Streaming 专为订阅不断发出的数据源的长寿命应用程序而设计。从技术上讲,Web 服务可以通过长轮询或服务器发送的事件来发出事件。(我认为这里不是这种情况,否则你会提到)。要使用 Spark Streaming 中的休息服务,您需要实现自定义数据源

正常的 Spark 工作更有意义。鉴于数据工作量证明了分布式编程的复杂性。然而,这也不是很常见的情况。Spark 用于大数据环境,通过 http 访问数据对于大数据处理来说非常慢。

该服务不会通过 http 使用 REST 服务,而是在分布式队列上发布数据。然后该队列被 Spark 流作业或正常的 Spark 批处理作业消耗。另一种策略是将数据存储到数据库中,然后直接通过 jdbc 数据源使用它。最佳实践是将数据复制到数据湖/数据仓库(如 hive)或直接复制到分布式文件系统(如 hdfs 或 amazon s3)。

从技术上讲,仍然可以在 Spark 中消耗休息服务。默认的 Spark api 也不提供 REST 数据源。然而,还有第 3 方实现

它也可以在没有自定义数据源的正常 Spark 作业中实现。鉴于 Web 服务响应适合主节点上的内存:

蟒蛇代码

data = requests.get('https://my.service.tm/api.json').json
# => [{id: 1, foo: 'bar'}, {id: 2, foo: 'baz' }]
df = spark.createDataFrame(data)
# => [Row(id=1, foo='bar'), Row(id=2, foo='baz')]
Run Code Online (Sandbox Code Playgroud)

如果响应无法容纳在内存中,并且这是一个分页 api,则可以创建 n 个页面的 rdd,然后将页面 id 映射到其响应,并可选择将 rdd 转换为数据帧。