Ich habe einen 10-Knoten-Cluster mit dem ec2-Skript im Standalone-Modus für Spark gestartet. Ich greife auf Daten in s3-Buckets innerhalb der PySpark-Shell zu, aber wenn ich Transformationen auf der RDD durchführe, wird immer nur ein Knoten verwendet. Zum Beispiel wird die unten in Daten aus dem CommonCorpus lesen:Wie können alle Spark-Knoten im Cluster vollständig genutzt werden?
bucket = ("s3n://@aws-publicdatasets/common-crawl/crawl-data/CC-MAIN-2014-23/"
"/segments/1404776400583.60/warc/CC-MAIN-20140707234000-00000-ip-10"
"-180-212-248.ec2.internal.warc.gz")
data = sc.textFile(bucket)
data.count()
Als ich das laufen, nur eine meiner 10-Slaves die Daten verarbeitet. Ich weiß das, weil nur ein Slave (213) Protokolle von der Aktivität hat, wenn er von der Spark-Webkonsole aus betrachtet wird. Wenn ich die Aktivität in Ganglia betrachte, ist derselbe Knoten (213) der einzige Slave mit einer Spike in der Mem-Nutzung, wenn die Aktivität ausgeführt wurde.
Außerdem habe ich genau die gleiche Leistung, wenn ich das gleiche Skript mit einem ec2-Cluster von nur einem Slave ausführen. Ich benutze Spark 1.1.0 und jede Hilfe oder Beratung wird sehr geschätzt.
Ich denke, Sie haben ein ziemlich typisches Problem mit gziped Dateien getroffen, in denen sie nicht parallel geladen werden können, so dass Spark Ihnen standardmäßig eine RDD mit 1 Partition gibt und somit nur 1 Task auf dieser RDD ausgeführt werden kann Zeit. Versuchen Sie, Ihre RDD wie folgt neu zu partitionieren: 'data = sc.textFile (bucket) .repartition (sc.defaultParallelism * 3)' –
Das scheint es zu sein. Warum hast du dich dazu entschieden, mit 3 zu multiplizieren? War das nur ein Beispiel oder war es zweckmäßig? Als ich mit 3 multiplizierte, schien es alle Knoten zu aktivieren. –
Der Spark Tuning Guide empfiehlt [2-3 Aufgaben pro Kern] (http://spark.apache.org/docs/1.1.1/tuning.html#level-of-parallelism). 'sc.defaultParalellism' gibt Ihnen die Anzahl der Kerne in Ihrem Cluster. –