Контекст Spark не сериализуем.
Любая реализация ForeachWriter должна быть сериализуемой, потому что каждая задача получит новую сериализованную десериализованную копию предоставленного объекта.Следовательно, настоятельно рекомендуется, чтобы любая инициализация для записи данных (например, открытие соединения или запуск транзакции) была выполнена после вызова метода open (...), что означает, что задача готова к генерации данных.
В своем коде вы пытаетесь использовать искровой контекст в методе процесса,
override def process(record: Row) = {
val stringHashRDD = sc.parallelize(Seq(("lastContact", record(1).toString)))
*sc.toRedisHASH(stringHashRDD, record(0).toString)(redisConfig)*
}
Чтобы отправить данные в Redis, вам нужно создать собственное соединение и открыть его в открытом виде.метод, а затем использовать его в методе процесса.
Посмотрите, как создать пул соединений Redis.https://github.com/RedisLabs/spark-redis/blob/master/src/main/scala/com/redislabs/provider/redis/ConnectionPool.scala