【问题标题】:See progress while "iterating" over Dataframe在 Dataframe 上“迭代”时查看进度
【发布时间】:2020-01-18 11:25:41
【问题描述】:

我想知道是否有更好的方法来查看 Pyspark 是否正在取得进展(在写入 PL/SQL DB 时)。 目前,当我的代码运行时,我看到的唯一输出是:

使用 Spark 的默认 log4j 配置文件:org/apache/spark/log4j-defaults.properties 将默认日志级别设置为“WARN”。 要调整日志记录级别,请使用 sc.setLogLevel(newLevel)。对于 SparkR,使用 setLogLevel(newLevel)。 19/09/17 16:33:17 WARN JdbcUtils:不支持请求的隔离级别 1;回退到默认隔离级别 2
【第三阶段:==============================> (1 + 1) / 2]

这将在 1 分钟到 1 小时内保持不变,具体取决于数据框的大小。通常我会使用 progessbar2 或自己制作一个计数器。但是 Spark 的工作方式不同,并且不会“迭代”经典方式,所以我不能用 progressbar2 库包装 udf。

问题是,很难看出我的程序是否只是在大型数据帧上运行,或者有人忘记了提交到 SQL DB。因为,当 Pyspark 等待提交时,它看起来是一样的。所以你可能已经猜到了,我在那里浪费了很多时间。

df_c = df_a.withColumn("new_col", my_udf(df_b["some_col"]))

很高兴看到 pyspark 在执行此步骤时取得了一些进展。

【问题讨论】:

  • 我不能 100% 确定您的问题是什么。您似乎正在尝试将数据框写入 PSQL DB。如果您的数据库上已经有一个锁定请求,您可以尝试在任何火花操作之前终止空闲请求(未提交的请求)(请参阅stackoverflow.com/a/45548966/9435099)(如果相关)。否则,spark 将永远“松弛”,等待 DB 锁结束。如果可以的话,尽量避免使用 UDF,因为它会破坏 pyspark 的性能(或在 scala 中实现你的 udf)
  • spark 将永远“松懈”,是的,这正是我想要防止的。除了观察 pyspark 的进展之外,我还没有看到另一种方式来判断是否是这种情况。这主要是由我们中的一个人忘记承诺造成的。
  • 在写入 postgresql 之前,只需终止或回滚具有空闲状态的现有请求。那么你写作不会有任何问题。并且没有办法从你的 spark 日志中知道发生了什么,因为一切都在 spark 端正常工作:它只是在等待表锁在写入之前被删除。

标签: dataframe apache-spark plsql pyspark progress-bar


【解决方案1】:

您可以在Spark-UI 上查看您的 Spark 集群当前正在做什么。在这里,您可以检查 Spark 任务是否正在完成或一切是否挂起。 Spark UI 的默认 URL 是http://<driver-node>:4040

如果您需要更结构化的数据(例如用于自动化处理),您可以使用 Spark-UI 的 REST-Interface

【讨论】:

  • 感谢您的提示,Spark 浏览器界面确实很有帮助,但如果 PySpark 明确告诉我它正在等待其他用户的提交,那就太好了。
  • 我不知道 jdbc 客户端(PySpark 或任何其他客户端)如何判断数据库是否正忙于检索数据,或者查询是否被另一个事务阻止。也许您可以尝试使用queryTimeout
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多