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

Exception: could not open socket on pyspark

每当我尝试在 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.run(PythonRDD.scala:613)

我检查了 rdd.py _load_from_socket 并意识到它获得了端口,但服务器甚至没有启动或者 sp runJob 可能是问题所在-

port = self._jvm.PythonRDD.runJob(self._jsc.sc(), mappedRDD._jrdd, partitions)

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

我遇到了完全相同的错误,尝试了 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

在 PySpark 1.6.3 和 2.0.2 上测试 JDK 1.8

终于解决了我的问题

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

WARN Utils:66 - 您的主机名,localhost 解析为环回地址:127.0.0.1;使用 172.16.20.244 代替(在接口 en0 上) 2020-09-27 17:26:10 警告 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

成功了。

我希望它能帮助那些有很多痛苦的人用类似的警告解决这个问题。