Bluemix:Apache Spark:为spark-submit配置驱动程序内存

时间:2016-04-14 12:17:16

标签: apache-spark ibm-cloud

我使用spark-submit脚本将我的python脚本上传到Spark Cluster,但是收到以下错误:

Traceback (most recent call last):
  File "/gpfs/fs01/user/sf6d-7c3a9c08343577-05540e1c503a/data/workdir/spark-driver-cc30d6d8-1518-45b1-a4a7-8421deaa3482/2_do_extract.py", line 139, in do_extraction
    r = resRDD.collect()
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/pyspark.zip/pyspark/rdd.py", line 771, in collect
    port = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/pyspark.zip/pyspark/traceback_utils.py", line 78, in __exit__
    self._context._jsc.setCallSite(None)
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 811, in __call__
    answer = self.gateway_client.send_command(command)
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 624, in send_command
    connection = self._get_connection()
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 579, in _get_connection
    connection = self._create_connection()
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 585, in _create_connection
    connection.start()
  File "/usr/local/src/spark160master/spark-1.6.0-bin-2.6.0/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 697, in start
    raise Py4JNetworkError(msg, e)
Py4JNetworkError: An error occurred while trying to connect to the Java server
> 

我确信由于执行脚本时缺少驱动程序内存而发生此错误,因为对于较小尺寸的数据集,脚本成功执行,而对于较大的数据集,我会收到此错误。

阅读spark-submit文档我已经尝试了所有配置来增加驱动程序内存,执行程序内存等,如下所示

/bin/sh spark-submit.sh --vcap vcap.json my_python_script.py --master https://169.54.219.20 --deploy-mode cluster --driver-memory 5g --executor-memory 5g --driver-maxResultSize 5g --worker-memory 5g

但似乎无法改变记忆。

请向我解释如何设置这些变量,因为即使是适度的内存使用也会失败。

1 个答案:

答案 0 :(得分:1)

您的spark作业所允许的资源由您在配置Bluemix Apache Spark服务实例时选择的计划决定。因此,您无法在每spark-submit个作业的基础上选择任意设置(内存,执行程序等)。相反,你将得到你的计划所要求的最大值。

对于您的特定错误,我们看到您的应用程序在RDD.collect()中断,根据定义:“在驱动程序中将数据集的所有元素作为数组返回。这通常在过滤器或其他返回足够小的数据子集的操作。“ spark文档描述:“可以使用collect()方法首先将RDD带到驱动程序节点。这可能会导致驱动程序内存不足,因为collect()会将整个RDD提取到单机。(http://spark.apache.org/docs/latest/programming-guide.html)。为了克服驱动程序中有限的堆大小,应用程序可以使用RDD.toLocalIterator()来返回包含此RDD中所有元素的迭代器。迭代器将占用尽可能多的内存此RDD中最大的分区。详细信息http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD.toLocalIterator

要考虑的另一件事是您的程序是否明确地将master设置为local,这将具有显着的资源限制。例如.. conf = SparkConf().setAppName('myapp').setMaster('local')