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"
Für den Anfang nicht Python UDF verwenden. – zero323
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
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