Databricks运行Spark Structured Streaming控制台无输出问题咨询
问题原因
- 核心配置错误:
localhost地址不匹配
Databricks是分布式运行环境,流计算任务会调度到集群的Driver/Executor节点执行,代码中配置的host="localhost"会让计算节点尝试连接自身的9999端口。如果你在本地电脑启动socket发数据、或者启动socket服务的节点和流任务实际运行节点不一致,任务会一直卡在建立socket连接的阶段,读不到任何数据,自然不会触发计算、产生输出。 countdf.show()抛出异常属于API规则限制
流式DataFrame不支持直接调用批处理场景的show()、count()这类行动算子,所有流式查询必须通过writeStream.start()启动执行,这个报错不属于运行故障,是Structured Streaming的正常API使用约束。- console接收器输出位置不符合预期
Databricks Notebook的单元格默认不会捕获console接收器的打印内容,就算任务正常运行读到数据,输出也会写入Driver节点的stdout日志,不会直接展示在Notebook页面上。
排查解决步骤
- 修正socket服务部署位置与host配置
不要在本地电脑启动socket测试服务,直接打开Databricks集群的Web Terminal,在终端执行nc -lk 9999启动9999端口的测试服务;之后在同一终端执行hostname命令拿到当前Driver节点的完整主机名,把代码里的host参数从localhost改成这个主机名,避免节点连接到错误地址。 - 清理异常检查点
之前失败的任务会在检查点目录写入错误的偏移量和状态信息,重启任务前先执行以下代码清空检查点,避免状态异常导致任务不工作:dbutils.fs.rm("/tmp/streaming", True) - 调整输出方式降低调试成本
如果不想翻Driver日志查找console输出,可以把输出接收器改成memory格式,直接在Notebook里就能查询计算结果,修改后的流启动代码参考:
启动任务后在Web Terminal的nc窗口输入测试单词,等待1-2秒执行checkpointDir = "/tmp/streaming" streamingQuery = (countdf .writeStream .format("memory") .queryName("word_count_res") .outputMode("complete") .trigger(processingTime="1 second") .option("checkpointLocation", checkpointDir) .start())spark.sql("select * from word_count_res").show(truncate=False)就能直接看到词频统计结果。 - 校验任务运行状态
任务启动后可随时执行streamingQuery.status查看运行状态:如果状态显示Connecting to host,优先排查socket服务是否正常启动、host/端口配置是否正确、节点间9999端口是否被安全策略拦截;如果显示Processing new data但看不到结果,优先排查输出接收器配置和结果查看位置是否正确。
内容的提问来源于stack exchange,提问作者Kevin Lee
相关产品推荐
相关产品推荐

