Google Colab运行PySpark与flask_ngrok出现JSONDecodeError如何解决?
问题解答
错误原因
该错误确实是PySpark与flask_ngrok抢占同一端口导致的。
PySpark启动SparkContext时默认会占用4040端口启动SparkUI服务,而flask_ngrok依赖的ngrok客户端默认会优先使用4040端口返回隧道配置信息。端口被占用后ngrok返回的响应为空,无法解析为合法JSON,因此抛出对应的JSONDecodeError错误。这也能解释为什么停止SparkContext释放4040端口后,flask_ngrok就能正常运行。
解决方案
不需要停止SparkContext,通过调整Spark配置避免端口冲突即可,可选两种方案:
方案1:修改SparkUI默认端口
初始化SparkConf时,将SparkUI的端口改为其他未被占用的端口即可,修改后的PySpark初始化代码如下:
import pyspark from pyspark import SparkContext, SparkConf from pyspark.sql import SparkSession import os import findspark os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-11-openjdk-amd64" os.environ["SPARK_HOME"] = "/content/drive/<<path to curr dir>>/spark-3.1.2-bin-hadoop2.7" findspark.init() conf = pyspark.SparkConf().setAppName('appName').setMaster('local') \ .set('spark.ui.port', '4050') # 将默认4040端口修改为4050或其他闲置端口 sc = pyspark.SparkContext(conf=conf) spark = SparkSession(sc) spark.conf.set("spark.sql.execution.arrow.enabled", "true") df = spark.createDataFrame(books_df)
方案2:禁用SparkUI
如果不需要使用SparkUI功能,可以直接禁用该服务,从根源避免端口占用:
# 仅需要在初始化SparkConf时增加一行配置即可 conf = pyspark.SparkConf().setAppName('appName').setMaster('local') \ .set('spark.ui.enabled', 'false')
修改完成后无需停止SparkContext,直接运行flask_ngrok相关代码即可正常启动服务,同时可以正常访问之前创建的Spark DataFrame df。
内容的提问来源于stack exchange,提问作者Utkarsh Tandon
相关产品推荐
相关产品推荐

