例外:无法在pyspark上打开套接字

时间:2015-08-30 18:11:53

标签: sockets apache-spark 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$2.run(PythonRDD.scala:613)

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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上测试

答案 2 :(得分:0)

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

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

WARN实用程序: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

有效。

我希望它可以通过类似的警告来帮助那些为解决此问题而付出很多努力的人。