Best practice zum erstellen SparkSession-Objekt in Scala zu verwenden, sowohl in unittest und Funken Einreichen
Ich habe versucht, schreiben Sie ein transform-Methode von DataFrame zu DataFrame.
Und außerdem möchte ich es testen, indem scalatest.
Wie Sie wissen, in Spark 2.x mit Scala-API können Sie erstellen SparkSession Objekt wie folgt:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.bulider
.config("spark.master", "local[2]")
.getOrCreate()
Dieser code funktioniert gut mit unit-tests.
Aber, wenn ich diesen code ausführen mit der Funke zu übermitteln, die cluster-Optionen hat nicht funktioniert.
Zum Beispiel,
spark-submit --master yarn --deploy-mode client --num-executors 10 ...
schafft keinen Vollstrecker.
Habe ich festgestellt, dass die Funke-Argumente vorbringen werden angewendet, wenn ich Sie entfernen config("master", "local[2]")
Teil der oben genannten code.
Aber, ohne die master-Einstellung der unit-test-code hat nicht funktioniert.
Habe ich versucht zu splitten spark (SparkSession) Objekt-generation Teil auf test-und main.
Aber es gibt so viele code-Blöcke braucht, spark, zum Beispiel import spark.implicit,_
und spark.createDataFrame(rdd, schema)
.
Ist es bewährte Praxis zu schreiben, einen code zu erstellen spark-Objekt beide zu test und zu laufen spark-Einreichen?
- Warum kannst du nicht verwenden
.config("master", "yarn-client")
in scala? - Da ich ausführen möchten, testen Sie im lokalen Modus (in meinen laptop) und führen Sie den code in verschiedene Umwelt, die angegeben werden können, die durch spark-senden-Optionen.
- Ich verstehe nicht das Problem, dann. Natürlich müssen Sie schreiben Sie Anweisungen importieren, wieder in Ihre unit-test-code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Weg zu schaffen, ist eine Eigenschaft, die bietet die SparkContext/SparkSession, und verwenden Sie diese in den test-Fällen, etwa so:
Und Ihr test-header-Klasse sieht dann so aus zum Beispiel:
class TestWithSparkTest extends BaseSpec with SparkTestContext with Matchers{
Machte ich eine version, bei der Funke richtig geschlossen, nachdem tests.
Spark-submit-Befehl mit dem parameter --master-Garn ist die Einstellung Garn master.
Und dies wird sein Konflikt mit Ihrem code-master("x"), auch mit, wie master("Garn").
Wenn Sie verwenden möchten, importieren sparkSession.implicits._ wie toDF ,toDS oder andere func,
Sie können nur einen lokalen sparkSession variable erstellt wie unten:
val spark = SparkSession.generator().appName("YourName").getOrCreate()
ohne Einstellung master("x") Zündkerzen-submit --master-Garn, nicht in lokalen Maschine.
I Tipp : verwenden Sie keine globalen sparkSession in Ihrem code. Das kann dazu führen, dass einige Fehler oder Ausnahmen.
hoffe, dies hilft Ihnen.
viel Glück!
Wie zu definieren, ein Objekt, in dem die Methode erstellt eine singleton-Instanz von SparkSession, wie
MySparkSession.get()
, und übergeben Sie es als Parameter in jeder unit-tests.In der main-Methode, Sie können erstellen einen separate SparkSession Instanz, die können unterschiedliche Konfigurationen.