【问题标题】:Spark: How to debug pandas-UDF in VS CodeSpark:如何在 VS Code 中调试 pandas-UDF
【发布时间】:2021-04-03 13:40:56
【问题描述】:

我正在寻找一种在 vscode 和 Pycharm 社区版本中调试 spark pandas UDF 的方法(在 UDF 中放置断点并停止)。在 UDF 中放置断点的那一刻,调试器不会停止。

在下面的参考文献中描述了本地模式和分布式模式。

我正在尝试至少在本地模式下进行调试。 Pycharm/VS Code 应该有一种方法可以通过“附加到本地进程”来调试本地 enc。只是我不知道怎么做。

目前我找不到任何答案如何将 pyspark 调试器附加到 VS Code 中 UDF 内的本地进程(我的开发者)。

我在 Pycharm 中仅找到以下示例。

  1. 附加到本地进程How can PySpark be called in debug mode?

当我尝试附加到进程时,我在 Pycharm 中收到以下消息。在 VS Code 中,我收到无法附加进程的消息。

Attaching to a process with PID=33,692
/home/usr_name/anaconda3/envs/yf/bin/python3.8 /snap/pycharm-community/223/plugins/python-ce/helpers/pydev/pydevd_attach_to_process/attach_pydevd.py --port 40717 --pid 33692
WARNING: The 'kernel.yama.ptrace_scope' parameter value is not 0, attach to process may not work correctly.
         Please run 'sudo sysctl kernel.yama.ptrace_scope=0' to change the value temporary
     or add the 'kernel.yama.ptrace_scope = 0' line to /etc/sysctl.d/10-ptrace.conf to set it permanently.

Process finished with exit code 0
Server stopped.
  1. pyspark_xray https://github.com/bradyjiang/pyspark_xray 使用这个包,可以调试在worker上运行的rdds,但是我无法调整包来调试UDFs

示例代码,断点不会在 UDF pandas_function(url_json) 中停止:

import pandas as pd
import pyspark
from pyspark.sql import Row
from pyspark.sql.types import StructType, StructField, IntegerType,StringType
spark = pyspark.sql.SparkSession.builder.appName("test") \
    .master('local[*]') \
    .getOrCreate()
sc = spark.sparkContext

# Create initial dataframe respond_sdf
d_list = [('api_1',"{'api': ['api_1', 'api_1', 'api_1'],'A': [1,2,3], 'B': [4,5,6] }"),
            (' api_2', "{'api': ['api_2', 'api_2', 'api_2'],'A': [7,8,9], 'B': [10,11,12] }")]

schema = StructType([
  StructField('url', StringType(), True),
  StructField('content', StringType(), True)
  ])

jsons = sc.parallelize(rdd_list)
respond_sdf = spark.createDataFrame(jsons, schema)

# Pandas UDF 
def pandas_function(url_json):
# Here I want to place breakpoint
    df = pd.DataFrame(eval(url_json['content'][0]))
    return df

# Pnadas UDF transformation applied to respond_sdf
respond_sdf.groupby(F.monotonically_increasing_id()).applyInPandas(pandas_function, schema=schema).show()

【问题讨论】:

  • 如果调试器设置过于繁琐,可以将打印语句放在UDF中
  • @mck 感谢您提供信息,目前我正在将 pyspark 日志打印到文件并将变量从 iside UDF 保存到 pickle 只是为了获得准确的状态,但这很痛苦。我想通过在 UDF 内停止并在 VS Code 调试控制台中执行各种命令来加快调试速度,从而使用 VS Code 进行平滑调试
  • 鉴于 spark 的工作原理,这可能具有挑战性,如您的链接问题中所述。也许您可以在您的问题中描述您在遵循该答案时遇到了什么问题?
  • 我可以建议你丹的一件事,首先将你的数据采样到一个可管理的块中,它太大而无法立即放入内存中,你应该收集或将其转换为熊猫dataframe ,现在您可以尝试运行该函数,您将在您的数据帧上作为 udf 运行,因为它在本机 python 调试中可以工作。

标签: pandas apache-spark visual-studio-code pyspark pycharm


【解决方案1】:

这个例子演示了如何使用优秀的pyspark_exray库来单步执行传入Dataframe.mapInPandas函数的UDF函数

https://github.com/bradyjiang/pyspark_xray/blob/master/demo_app02/driver.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2019-10-10
    • 2017-10-02
    • 2021-05-10
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多