Przygotowałem demo:
https://github.com/bartekkalinka/spark-listener-websockets
Napotkałem dwa problemy:
1. Spark listener uruchamiany za pomocą spark-shella nie działa, gdy buduję go za pomocą sbt assembly (zamiast package). Powód: assembly umieszcza w jarze np. scala library, a ta zakłóca chyba classpath Sparka:
spark-shell --conf spark.logConf=true --conf spark.extraListeners=pl.bka.spark.CustomSparkListener --driver-class-path ./target/scala-2.11/spark-listener-assembly_2.11-1.0.jar
java.lang.NoSuchMethodError: scala.collection.immutable.Range.validateRangeBoundaries(Lscala/Function1;)Z
Exception in thread "main" java.lang.RuntimeException: error reading Scala signature of scala.package: scala.collection.immutable.Range.validateRangeBoundaries(Lscala/Function1;)Z
2. Spark listener nie ma maina. Ma go aplikacja sparkowa, w której mógłbym dodać custom spark listenera, ale i tak serwer websocketów powinien działać w sposób ciągły, a nie tylko na czas uruchomienia apki sparkowej (która coś obliczy i się zakończy).
Problem 2 rozwiązałem tak, że utworzyłem osobny projekt ws-broadcast, który emituje komunikaty przez websockets. Problem 1 na razie rozwiązałem tak, że spark listener pisze komunikaty do pliku, a ws-broadcast je stamtąd wyciąga. W planach: ws-broadcast mógłby pobierać komunikaty do wysłania przez REST-a.
Bartek