2016-08-24 8 views
1

Ich habe eine Vier-Knoten-Hadoop-Cluster (MAPR) mit jeweils 40 GB Speicher. Ich muss eine Funktion auf eines der Felder des großen Datensatzes anwenden (500 Millionen Zeilen). Der Fluss von meinem Code ist, dass ich die Daten von hive-Tabelle als Funkendatenrahmen gelesen und die gewünschte Funktion auf eine der Spalten gelten wie folgt:Karte Transformation Leistung Funken Datenrahmen vs RDD

schema = StructType([StructField("field1", IntegerType(), False), StructField("field2", StringType(), False),StructField("field3", FloatType(), False)]) 
udfCos = udf(lambda row: function_call(row), schema) 
result = SparkDataFrame.withColumn("temp", udfCos(stringArgument)) 

Die ähnliche RDD-Version könnte wie folgt aussehen:

Ich möchte die Leistung dieses Stück Code verbessern, um sicherzustellen, dass der Code mit maximaler Parallelität und reduzierten Durchsatz läuft - ich brauche Hilfe bei der Verwendung der Spark-Konzepte wie "Neuparallelisierung" Wert in der SparkConf "oder andere Ansätze, im Zusammenhang mit meinem Problem. Jede Hilfe wird geschätzt.

meine Funkenstartparameter:

MASTER="yarn-client" /opt/mapr/spark/spark-1.6.1/bin/pyspark --num-executors 10 --driver-cores 10 --driver-memory 30g --executor-memory 7g --executor-cores 5 --conf spark.driver.maxResultSize="0" --conf spark.default.parallelism="150" 
+0

Für den Anfang nicht Python UDF verwenden. – zero323

+0

Irgendwelche spezifischen Gründe hinter diesem Vorschlag? Ich habe eine Probe getestet, die zu der gleichen Laufzeit für RDD map und udf (mit Standardwerten) führte – Mike

+2

Im Allgemeinen ist dieser Umlauf JVM -> Python -> JVM teuer und relativ langsam und hat einige andere hässliche Eigenschaften (besonders in Spark <2) Also, wenn Sie können, sollten Sie native (JVM) Funktionen Kompositionen gegenüber UDFs bevorzugen. – zero323

Antwort

0

Für Sie Anwendung abstimmen müssen Sie Ihnen einige Dinge

1) wissen müssen Ihre Anwendung überwachen, ob Ihr Cluster unter genutzt wird oder nicht, wie viele Ressourcen verwendet von Ihrer Anwendung, die Sie erstellt haben

Überwachung kann mit verschiedenen Tools z. Ganglia Von Ganglia können Sie CPU, Speicher und Netzwerk-Nutzung finden.

2) Basierend auf Beobachtung über CPU- und Speichernutzung können Sie eine bessere Vorstellung zu bekommen, welche Art von Tuning für Ihre Anwendung benötigt wird

Formular Funkenpunkt Sie

In Funken defaults.conf

Sie können angeben, welche Art von Serialisierung benötigt wird, wie viel Driver Memory und Executor Memory von Ihrer Anwendung benötigt wird, auch wenn Sie den Garbage Collection-Algorithmus ändern können.

Im Folgenden sind einige Beispiel können Sie stimmen dieser Parameter auf Basis Ihrer Anforderungen

spark.serializer     org.apache.spark.serializer.KryoSerializer 
spark.executor.extraJavaOptions -XX:MaxPermSize=2G -XX:+UseG1GC 
spark.driver.extraJavaOptions -XX:MaxPermSize=6G -XX:+UseG1GC 

Nähere Informationen finden http://spark.apache.org/docs/latest/tuning.html