2016-05-27 3 views
0

Ich benutze Pyspark, um eine größere csv auf einem Low-End-Maschine zu aggregieren und zu gruppieren; 4 GB RAM und 2 CPU-Core. Dies wird gemacht, um die Speichergrenzen für den Prototyp zu überprüfen. Nach der Aggregation muss ich die RDD in Cassandra speichern, die auf einem anderen Rechner läuft.Spark: PySpark Langsamkeit, Speicherproblem beim Schreiben an Cassandra

Ich benutze Datastax Cassandra-Python-Treiber. Zuerst verwendete ich rdd.toLocalIterator und durchlief die RDD und verwendete die Treiber synchrone API session.execute. Ich schaffte es, etwa 100.000 Datensätze in 5 Metern zu schreiben - sehr langsam. Checking this I wie hier python driver cpu bound gefunden erklärt, dass, wenn nload nw Monitor im Cassandra Knoten ausgeführt wird, werden die Daten vom Python-Treiber löschte ist mit einer sehr langsamen Geschwindigkeit, wodurch die Langsamkeit

Also habe ich versucht session.execute_async und ich konnte sehen, die NW-Übertragung mit sehr hoher Geschwindigkeit und die Einführungszeit war auch sehr schnell.

Dies wäre eine glückliche Geschichte gewesen, die Tatsache aber, dass mit session.execute_async, ich laufe jetzt Speicher aus, während auf ein paar mehr Tabellen (mit verschiedenen Primärschlüssel) wird

Da rdd.toLocalIterator Einsetzen des Um Speicher zu benötigen, der einer Partition gleich ist, habe ich den Schreibvorgang mit rdd.foreachPartition(x) auf Spark worker verschoben, aber immer noch nicht genügend Arbeitsspeicher.

Ich bezweifle, dass es nicht die rdd Iteration ist, die dies verursacht, aber die schnelle Serialisierung? von execute_async des Python-Treibers (mit Cython)

Natürlich kann ich auf einen größeren RAM-Knoten verschieben und versuchen; aber es wäre schön, dieses Problem in diesem Knoten zu lösen; vielleicht wird als nächstes auch Multiprocessing versuchen; aber wenn es bessere Vorschläge sind bitte antworten

der Speicherfehler ich von JVM bin immer ist/oder OS OutOfMemory,

6/05/27 05:58:45 INFO MapOutputTrackerMaster: Size of output statuses for 
shuffle 0 is 183 bytes 
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007fdea10cc000, 12288, 0) failed; error='Cannot allocate memory' (errno=12) 
# 
# There is insufficient memory for the Java Runtime Environment to continue. 
# Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory. 
# An error report file with more information is saved as: 
# /home/ec2-user/hs_err_pid3208.log 

Antwort

0

ich die Ausführung in einer Maschine versucht, mit einem größeren RAM - 16 GB; Diesmal kann ich das obige Out-if-Memory-Szenario abwenden;

Allerdings ändere ich diesmal den Einsatz ein bisschen, um in mehrere Tabellen einzufügen;

Also auch mit session.executeAsysc Ich finde, dass der Python-Treiber CPU-gebunden ist (und ich denke, aufgrund GIL nicht in der Lage, alle CPU-Kerne zu nutzen), und was in der NW geht ein Rinnsal.

So kann ich Fall 2 nicht erreichen; Scala Planung jetzt

Fall 1 zu ändern: Sehr weniger Ausgabe an die NW - ist Schreibgeschwindigkeit schnell, aber nichts

Very less output to the NW - Write speed is fast but nothing to write

Fall 2 zu schreiben: Ideal Case - Einsätze werden IO gebunden: Cassandra schreibt sehr schnell

Ideal Case - Inserts being IO bound: Cassandra writes very fast

Verwandte Themen