异常:无法在 PySpark 上打开套接字。

5
无论我尝试在pyspark中执行简单的处理,它都无法打开套接字。
>>> myRDD = sc.parallelize(range(6), 3)
>>> sc.runJob(myRDD, lambda part: [x * x for x in part])

以上代码会抛出异常 -

port 53554 , proto 6 , sa ('127.0.0.1', 53554)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Volumes/work/bigdata/spark-custom/python/pyspark/context.py", line 917, in runJob
    return list(_load_from_socket(port, mappedRDD._jrdd_deserializer))
  File "/Volumes/work/bigdata/spark-custom/python/pyspark/rdd.py", line 143, in _load_from_socket
    raise Exception("could not open socket")
Exception: could not open socket

>>> 15/08/30 19:03:05 ERROR PythonRDD: Error while sending iterator
java.net.SocketTimeoutException: Accept timed out
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at org.apache.spark.api.python.PythonRDD$$anon$2.run(PythonRDD.scala:613)

我查看了rdd.py文件中的_load_from_socket函数,并发现它获取了端口,但是服务甚至还没有启动或者sp runJob可能是问题所在-

port = self._jvm.PythonRDD.runJob(self._jsc.sc(), mappedRDD._jrdd, partitions)
3个回答

4

虽然这不是最理想的解决方案,但现在我知道了原因。Pyspark无法使用JDK 1.8(64位)版本创建jvm套接字,所以我只需将我的Java路径设置为jdk 1.7,它就可以工作了。


它对我不起作用。我使用的是Spark 1.5.2和jdk1.7版本。 - prabhugs
1
错误出现在Python驱动程序尝试连接到驱动程序的Scala部分时,在任何Spark操作(计数、缩减等)上。下面对应的行显示超时硬编码为3秒。 https://github.com/apache/spark/blob/master/python/pyspark/rdd.py#L121从技术上讲,目前没有办法配置超时时间,因此Python代码唯一的恢复方式是在应用程序级别代码中捕获异常并重试可配置次数。 - farmi

2

我曾经遇到完全相同的错误,尝试了JDK 1.7,但是没有成功。后来我去编辑/etc/hosts文件并发现其中有以下内容:

127.0.0.1 mbp.local localhost
127.0.0.1 localhost

只需要将带有我的电脑本地名称的那行注释掉,就可以解决问题。

#127.0.0.1 mbp.local localhost
127.0.0.1 localhost

在JDK 1.8下,测试了PySpark 1.6.3和2.0.2。


这个可太有效了... 在生产环境中调试Spark集群时,真的救了我的命!! - Sangram Gaikwad

1

最终,我解决了我的问题。

当我启动pyspark时,我突然意识到有一个警告可能与问题有关。

WARN Utils:66 - 您的主机名localhost解析为环回地址:127.0.0.1;使用172.16.20.244代替(在接口en0上) 2020-09-27 17:26:10 WARN Utils:66 - 如果您需要绑定到另一个地址,请设置SPARK_LOCAL_IP

然后我更改了/etc/hosts文件,将127.0.0.1注释掉并添加了一行新内容以解决环回问题,就像这样:

#127.0.0.1  localhost
#255.255.255.255    broadcasthost
#:::1             localhost
172.16.20.244 localhost

它起作用了。

我希望它能帮助那些在解决类似警告时遇到很多困难的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接