Buduję RDD z listy adresów URL, a następnie próbuję pobrać dane z niektórymi asynchronicznymi połączeniami http. Potrzebuję wszystkich wyników przed wykonaniem innych obliczeń. Idealnie, muszę wykonać wywołania http na różnych węzłach w celu skalowania rozważań.Praca z iskrami za pomocą asynchronicznego wywołania HTTP
zrobiłem coś takiego:
//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()
tego dzieła, ale Spark praca nigdy skończyć!
Zastanawiam się, jakie są najlepsze praktyki dotyczące radzenia sobie z Przyszłością przy użyciu Spark (lub Future [RDD]).
Myślę, że ten przypadek użycia wygląda całkiem zwyczajnie, ale nie znalazł jeszcze żadnej odpowiedzi.
poważaniem
Problem polega na tym, że nie powinno dojść do przesunięcia danych między 'request' i' response', więc obie transformacje powinny być wykonywane na tym samym etapie, stąd te same executory i konteksty. – zero323