【问题标题】:HTTP API call within apache spark filter methodapache spark过滤器方法中的HTTP API调用
【发布时间】:2019-04-17 05:21:58
【问题描述】:

我有一个 Spark 数据框,我需要根据条件进行过滤。

条件是: 数据框中有一列"keyword",我需要调用一个API 传递这个keyword 列值。将对所有 keyword 列值执行此操作。 API 将发回一个我需要与阈值匹配的数字。如果它更大,则需要返回 true 否则为 false。

我为此写了一个 UDF,如下所示..

    val filteredDf = df.filter(apiUdf(col("keyword_text")) === true))

    val apiUdf = udf((topic: String) => {..
     .....
     HTTP API call .. 
     parse the result ... 
     find out the number from the API resposne.. 
     and then compare it with some threshold value and return true/false

这里的问题是我打开和关闭 HTTP 连接的次数与我拥有多个关键字的次数一样多。有人可以告诉我如何优化这一点,以及这里的 UDF 方法是否可以?

【问题讨论】:

  • 您是否考虑过改用mapPartitions
  • @shay__ 你的意思是使用 mapPartitions 而不是过滤器?
  • 不,而不是 udf。类似df.mapPartitions(... send http ...).filter(... by response ...)

标签: apache-spark apache-spark-sql


【解决方案1】:

Spark UDFs 旨在处理实现复杂逻辑以返回值/秒。

在分布式数据处理中,调用外部 URL 并不是好的设计/方法执行器。

  • 其缩放问题与数据大小和次数有关 连接打开/关闭。
  • 此外,在大多数生产环境中,执行器节点都是 没有接触过互联网。

我会建议

  1. 保存/收集所有 col("keyword_text")
  2. 为每个关键字调用 HTTP API(不是 spark udf)并获得响应
  3. 将数据保存为 some_id、keyword_text、api_result

现在使用 df1(some_id、keyword_text、api_result)

您可以加入 df 和 f1 并使用 api_result 进行过滤。

我不确定,如果 HTTP API 接受批量/批量请求(通常大多数都会这样做),您可以考虑这种方法。

【讨论】:

  • 我完全同意您不能从 UDF 调用 API,因为大多数 Executor 节点不会暴露在 Internet 上。尝试使用 id、text_keyword 和 api 输出创建在边缘节点上运行的数据集。加入数据框,然后再次填充结果
  • 您没有抓住重点,OP 发送 HTTP 请求(可能是内部服务?)没有问题,问题在于保持连接处于活动状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多