应用程序运行一段时间后Pyspark套接字超时异常

时间:2016-07-17 02:46:27

标签: exception optimization apache-spark pyspark

我正在使用pyspark来估计逻辑回归模型的参数。我使用spark来计算似然和渐变,然后使用scipy的最小化函数进行优化(L-BFGS-B)。

我使用yarn-client模式来运行我的应用程序。我的应用程序可以开始运行没有任何问题。但是,过了一段时间后,它会报告以下错误:

Traceback (most recent call last):
  File "/home/panc/research/MixedLogistic/software/mixedlogistic/mixedlogistic_spark/simulation/20160716-1626/spark_1m_data.py", line 115, in <module>
    res = trainEM2(distData, params0, verbose=True, em_tol=1e-5, opt_method='L-BFGS-B')
  File "/home/panc/research/MixedLogistic/software/mixedlogistic/mixedlogistic_spark/Train2.py", line 166, in trainEM
    options={'disp': False})
  File "/apps/rhel6/Anaconda-2.0.1/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 447, in minimize
    callback=callback, **options)
  File "/apps/rhel6/Anaconda-2.0.1/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 330, in _minimize_lbfgsb
    f, g = func_and_grad(x)
  File "/apps/rhel6/Anaconda-2.0.1/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 278, in func_and_grad
    f = fun(x, *args)
  File "/apps/rhel6/Anaconda-2.0.1/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 289, in function_wrapper
    return function(*(wrapper_args + args))
  File "/home/panc/research/MixedLogistic/software/mixedlogistic/mixedlogistic_spark/Train2.py", line 146, in fun_observedQj
    return dataAndWeightsj_old.map(lambda _: calObservedQj(_[0], _[1], vparamsj, params0)).sum()
  File "/apps/hathi/spark-1.6.2/python/pyspark/rdd.py", line 995, in sum
    return self.mapPartitions(lambda x: [sum(x)]).fold(0, operator.add)
  File "/apps/hathi/spark-1.6.2/python/pyspark/rdd.py", line 869, in fold
    vals = self.mapPartitions(func).collect()
  File "/apps/hathi/spark-1.6.2/python/pyspark/rdd.py", line 772, in collect
    return list(_load_from_socket(port, self._jrdd_deserializer))
  File "/apps/hathi/spark-1.6.2/python/pyspark/rdd.py", line 142, in _load_from_socket
    for item in serializer.load_stream(rf):
  File "/apps/hathi/spark-1.6.2/python/pyspark/serializers.py", line 139, in load_stream
16/07/16 20:59:10 ERROR python.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:409)
    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:645)
    yield self._read_with_length(stream)
  File "/apps/hathi/spark-1.6.2/python/pyspark/serializers.py", line 156, in _read_with_length
    length = read_int(stream)
  File "/apps/hathi/spark-1.6.2/python/pyspark/serializers.py", line 543, in read_int
    length = stream.read(4)
  File "/apps/rhel6/Anaconda-2.0.1/lib/python2.7/socket.py", line 384, in read
    data = self._sock.recv(left)
socket.timeout: timed out

当我将火花日志级别设置为&#34; ALL&#34;时,我也发现python broken pipe错误。

我正在使用Spark 1.6.2和Java 1.8.0_91。知道发生了什么吗?

- 更新 -

我发现这与我在程序中使用的优化例程有关。

我所做的是使用EM算法(作为迭代算法)使用最大似然法估计统计模型。在每次迭代期间,我需要通过解决最小化问题来更新参数。 Spark负责计算我的可能性和梯度,然后将其传递给Scipy的最小化程序,我使用L-BFGS-B方法。这个例程中的某些东西似乎崩溃了我的Spark工作。但我不知道例程的哪一部分是造成这个问题的原因。

另一个观察是,在使用相同的样本和相同的程序时,我改变了分区的数量。当分区数量很小时,我的程序可以完成没有任何问题。但是,当分区数量变大时,程序开始崩溃。

3 个答案:

答案 0 :(得分:0)

检查执行程序日志以获取详细信息。当执行程序死亡或被集群管理器杀死时,我已经看到类似的错误(通常是为了使用比配置容器更多的内存)。

答案 1 :(得分:0)

我有类似的问题,对我来说,这解决了它:

import pyspark as ps

conf = ps.SparkConf().setMaster("yarn-client").setAppName("sparK-mer")
conf.set("spark.executor.heartbeatInterval","3600s")
sc = ps.SparkContext('local[4]', '', conf=conf) # uses 4 cores on your local machine

此处设置其他选项的更多示例: https://gist.github.com/robenalt/5b06415f52009c5035910d91f5b919ad

答案 2 :(得分:0)

在 IBM 的 SPSS Modeler 中使用 Pyspark 扩展节点时,我们遇到了同样的问题。上述所有解决方案(以及在 Internet 上可以找到的其他解决方案)都不起作用。在某些时候,我们发现它总是发生在我和我的同事在同一台机器上同时执行 Pyspark 扩展节点时。 这似乎让 Python 工作人员变得混乱或被杀。唯一的解决办法是不要同时执行 Pyspark 的东西...