Spark Shell本地模式读取CSV文件超时失败求助
解决Spark Shell本地模式读取CSV时的连接超时问题
首先看你抛出的异常,核心是java.io.IOException: 无法连接到 /192.168.1.112:51351,这个问题我之前也碰到过,一般出在Executor与Driver的网络通信失败或者依赖包在线下载超时这两个场景,给你几个针对性的解决方案:
方案一:强制指定Driver绑定本地IP,避免网络寻址问题
本地模式下Spark有时候会自动绑定到内网IP(比如你这里的192.168.1.112),如果防火墙限制了端口通信或者IP寻址有问题,就会触发超时。你可以启动Spark Shell时手动指定Driver绑定localhost:
spark-shell --packages com.databricks:spark-csv_2.11:1.5.0 --conf spark.driver.host=localhost
然后再执行你的CSV读取代码,大概率能解决连接问题。
方案二:跳过在线依赖下载,手动添加本地Jar包
如果你的网络访问Maven中央仓库不稳定,--packages参数会触发Spark自动下载依赖包,这个过程很容易超时。你可以:
- 手动下载
spark-csv_2.11:1.5.0及其依赖(比如commons-csv、univocity-parsers)到本地 - 把这些Jar包复制到Spark安装目录的
jars文件夹下(比如$SPARK_HOME/jars) - 直接启动Spark Shell,不需要加
--packages参数:
spark-shell
这样Spark会直接加载本地的Jar包,避免了在线下载的超时问题。
方案三:使用Spark原生CSV读取器(推荐)
注意:Spark 2.0及以上版本已经原生支持CSV数据源,完全不需要引入第三方的spark-csv包!你之前的代码其实可以直接运行,不需要加--packages参数。
直接启动普通的Spark Shell:
spark-shell
然后执行你的读取语句:
val flightData2015 = spark.read.option("inferSchema", "true").option("header","true").csv("/Users/me/Desktop/2015-summary.csv")
这个方案最简洁,还能避免第三方依赖带来的兼容性和下载问题。
额外排查点
- 检查端口51351是否被其他进程占用,可以用
lsof -i :51351(Mac/Linux)或者netstat -ano | findstr :51351(Windows)查看 - 临时关闭防火墙,测试是否是防火墙拦截了Spark的内部通信
内容的提问来源于stack exchange,提问作者Sarath Sasikumar
相关产品推荐
相关产品推荐

