Ich erstelle eine RDD aus einer Liste von URLs und versuche dann, Daten mit einem asynchronen http-Aufruf abzurufen. Ich brauche alle Ergebnisse, bevor ich andere Berechnungen anstelle. Im Idealfall muss ich die HTTP-Aufrufe auf verschiedenen Knoten für Skalierungsüberlegungen vornehmen.Spark-Job mit Async-HTTP-Aufruf
Ich habe so etwas wie dies:
//init spark
val sparkContext = new SparkContext(conf)
val datas = Seq[String]("url1", "url2")
//create rdd
val rdd = sparkContext.parallelize[String](datas)
//httpCall return Future[String]
val requests = rdd.map((url: String) => httpCall(url))
//await all results (Future.sequence may be better)
val responses = requests.map(r => Await.result(r, 10.seconds))
//print responses
response.collect().foreach((s: String) => println(s))
//stop spark
sparkContext.stop()
Diese Arbeit, aber Spark-Job beenden nie!
Ich frage mich, was sind die besten Praktiken für den Umgang mit Zukunft mit Spark (oder Future [RDD]).
Ich denke, dass dieser Anwendungsfall ziemlich häufig aussieht, aber noch keine Antwort gefunden hat.
Mit freundlichen Grüßen
Problem ist, es sollte keine Datenbewegung zwischen "Anfragen" und "Antworten" geben, so dass beide Transformationen in der gleichen Phase ausgeführt werden sollten, daher die gleichen Executoren und Kontexte. – zero323