2016-04-14 9 views
0

ich den Funken einreichen Skript bin mit meinem Python-Skript zum Spark Cluster laden, aber ich erhalte die folgende Fehlermeldung:Bluemix: Apache Spark: Konfigurieren Treiber Speicher für funken vorlegen

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 
> 

Ich bin sicher, Dieser Fehler tritt auf, weil beim Ausführen des Skripts kein Treiberspeicher zur Verfügung steht, da bei einem kleineren Dataset das Skript erfolgreich ausgeführt wird und bei einem größeren Dataset dieser Fehler auftritt.

Lesen der Funken einreichen Dokumentation Ich habe alle Konfigurationen versucht, den Treiber-Speicher, Testamentsvollstrecker Speicher usw. wie folgt

/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 

zu erhöhen, aber es scheint unmöglich zu sein, um den Speicher zu ändern.

Bitte erklären Sie mir, wie kann ich solche Variablen setzen, weil selbst moderate Speicherverbrauch fehlschlägt.

Antwort

1

Die Ressourcen, die Ihre Spark-Jobs zulassen, richten sich nach dem Plan, den Sie bei der Bereitstellung einer Bluemix Apache Spark-Dienstinstanz auswählen. Folglich können Sie keine willkürlichen Einstellungen (Speicher, Executoren usw.) auf einer Job-Basis unter spark-submit auswählen. Stattdessen erhalten Sie das Maximum, das Ihr Plan diktiert.

Für Ihren speziellen Fehler sehen wir, dass Ihre Anwendung in RDD.collect() bricht, was definitionsgemäß lautet: "Geben Sie alle Elemente des Datasets als Array im Treiberprogramm zurück ein Filter oder eine andere Operation, die eine ausreichend kleine Teilmenge der Daten zurückgibt. " Die Dokumentation von spark beschreibt: "Man kann die Methode collect() verwenden, um die RDD zuerst zum Treiberknoten zu bringen. Dies kann jedoch dazu führen, dass der Treiber nicht mehr genügend Arbeitsspeicher hat, weil collect() die gesamte RDD an a (http://spark.apache.org/docs/latest/programming-guide.html). Um die begrenzte Größe des Heapspeichers im Treiber zu umgehen, verwendet die Anwendung möglicherweise RDD.toLocalIterator(), um einen Iterator zurückzugeben, der alle Elemente in diesem RDD enthält. Der Iterator verbraucht so viel Speicher wie die größte Partition in diese RDD. hier die Details http://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD.toLocalIterator.

Die andere Sache zu prüfen ist, ob Ihr Programm explizit Master auf lokale setzt, die erhebliche Ressourcenbeschränkungen haben. zB. conf = SparkConf().setAppName('myapp').setMaster('local')

Verwandte Themen