2016-04-14 66 views
0

我使用的火花提交脚本到我的python脚本上传到星火集群,但我得到以下错误:Bluemix:Apache的星火:用于配置驱动程序内存火花提交

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 
> 

我敢肯定由于执行脚本时缺少驱动程序内存,导致发生此错误,因为对于较小的数据集,脚本会成功执行,而对于较大的数据集,则会出现此错误。

读火花提交的文件我已经尝试了所有的配置,增加驾驶员记忆,执行内存等类似下面

/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 

但它似乎是不可能改变的记忆。

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

回答

1

您的Spark作业允许的资源取决于您在供应Bluemix Apache Spark服务实例时选择的计划。因此,您不能根据作业基础选择任意设置(内存,执行者等)。相反,你会得到你的计划规定的最大值。

对于您的特定错误,我们看到的是您的应用程序在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

其他的事情要考虑的是你的程序是否明确设置主到地方,这将有显著资源限制。如:conf = SparkConf().setAppName('myapp').setMaster('local')