版权声明:本文为博主原创文章,未经博主允许不得转载。
在使用PySpark开发集群任务时,由于集群资源访问权限的限制,只能在开发机上运行,本地无法自测。
开发机上调试的时候,可通过在开发机上启动spark shell进行交互式调试,但需要把写好的代码按顺序复制进spark shell中才能调试。这样做不仅要把写好的代码再按照spark shell格式整理一遍,对于结构比较复杂的代码,更耗时耗力,而且容易出错。另一方面,由于考虑到要在spark shell中调试,会有意无意把代码的结构写的简单,便于代码复制,即为了便于调试舍弃代码的抽象化、模块化、结构化。
在开发机上虽然可以通过 python pdb 单步调试,但不够直观,效率也不是很高。
自然而然的想到了能不能在本机进行开发机的远程调试。本文列举出三种方式解决远程调试。
一、PyCharm 的 Python Remote Debug
在Python Remote Debug的模式下,PyCharm(IDE)作为服务端(Server)启动调试,开发机则作为客户端(Client)启动。
因此使用 PyCharm 的 Python Remote Debug 进行远程调试,需要在本地开发环境中设定 IP 和端口并启动,PyCharm 会对设定的端口进行监听,等待客户端连接请求。
具体步骤如下:
1. 开发机上安装 pydevd
PyCharm 对于 Python Remote Debug 远程调试提供了pydevd模块,在 PyCharm 安装路径下的debug-eggs文件夹下,pycharm-debug.egg用于Python2,pycharm-debug-py3k.egg则用于Python3。
- 可直接在开发机上 pip install pydevd
- 若无权限可将 pycharm-debug.egg 复制到开发机,把该文件添加到Python引用路径中
如 export PYTHONPATH=$PYTHONPATH:/home/…/pycharm-debug.egg
可启动Python,输入import pydevd
,没报错说明安装成功
开发机安装该库后,就可以调用pydevd.settrace
方法,该方法会指定 IDE 所在机器的 IP 和监听端口号,用于与IDE建立连接;建立连接后,便可在IDE中对开发机中的程序进行单步调试。
2.本地PyCharm配置Python Remote Debug
Python Remote Debug配置如下:
-
【Run】->【Edit Configurations】->【Add New Configuration】->【Python Remote Debug】
-
填写
Local host name
和Port
,其中Local host name
指的是本机开发环境的IP地址,而Port
则随便填写一个10000以上的即可Windows可直接用ipconfig命令查看IPv4地址,对于使用v*n,
Local host name
则为v*n适配器的IPv4地址
由于开发机需要连接至本地开发环境,因此要保证开发机可以访问本地IP,可直接在开发机 ping 本地ip验证 -
配置 Path mappings,Local path 为项目在本地的位置,Remote path为项目在开发机的位置
-
【Apply】and【OK】
3.在开发机需要调试的代码中加入调试监控代码
将配置好的Python Remote Debug中的 Update your script 下方代码插入至开发机的代码中
import pydevd
pydevd.settrace('10.4.×.×', port=11234, stdoutToServer=True, stderrToServer=True)
注意如果在开发机源代码中插入两行调试监控代码,也需要在本地代码的相应位置中插入两行(空行即可),否则远程调试断点会串行。
4.本地 PyCharm 启动 Debug Server
在待远程调试的代码中打好断点
选中配置好的Python Remote Debug,进行 Debug,启动并处于监听状态,在 Console 中显示如下:
Starting debug server at port 11234
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('10.4.×.×', port=11234, stdoutToServer=True, stderrToServer=True)
Waiting for process connection...
5.开发机中运行配置好的Python代码
使用脚本启动应用程序,执行到pydevd.settrace
时,便会与本地开发环境中的PyCharm建立通讯连接
如下图所示,就可以在本地 PyCharm 中打断点单步调试了
可以查看spark dataframe的参数属性
通过Evaluate调试并查看结果
在开发机中,就会等待本地单步调试进度,执行并打印日志
二、使用 PyCharm 远程解释器
参照博文 Pycharm配置远程调试,通过 远程部署配置 和 远程解释器配置 实现远程调试,以下图片摘自这篇文章。
但不论是部署还是解释器配置,都需要远程开发机的账号、密码,由于公司是通过堡垒机登陆开发机,无法使用该方法。
三、IDEA的Remote和使用JVM的Xdebug
如果语言使用Java或Scala,IDE使用IntelliJ IDEA,可以使用使用JVM的Xdebug和IDEA的Remote进行远程调试。
可参照 idea远程调试 spark ,相对较简单。该方式正好与 PyCharm 中的Python Remote Debug模式相反,开发机作为服务端(Server)启动调试,本地IntelliJ IDEA则作为客户端(Client)启动。
但对于Python来说,即使用IDEA编辑Python,使用该方式,虽然可以和开发机调通,但无法实现断点单步调试。
参考文章:
--------------------------文档信息--------------------------
版权声明:本文为博主原创文章,未经博主允许不得转载
署名(BY) :dkjkls(dkj卡洛斯)
文章出处:http://blog.****.net/dkjkls