BdE*_*eer 5 apache-spark apache-spark-sql spark-structured-streaming
我想调用一个 Web 服务来获取 Spark Structured Streaming 中的一些数据。是否可以?如何?
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 转换为数据帧。
| 归档时间: |
|
| 查看次数: |
3107 次 |
| 最近记录: |