O Spark Context não é serializável.
Qualquer implementação de ForeachWriter deve ser serializável porque cada tarefa obterá uma nova cópia serializada-desserializada do objeto fornecido. Portanto, é altamente recomendável que qualquer inicialização para escrever dados (por exemplo, abrir uma conexão ou iniciar uma transação) seja feita após a chamada do método open(...), o que significa que a tarefa está pronta para gerar dados.
No seu código, você está tentando usar o contexto spark no método do processo,
override def process(record: Row) = {
val stringHashRDD = sc.parallelize(Seq(("lastContact", record(1).toString)))
*sc.toRedisHASH(stringHashRDD, record(0).toString)(redisConfig)*
}
Para enviar dados para o redis, você precisa criar sua própria conexão e abri-la no método open e depois usá-la no método process.
Dê uma olhada em como criar um pool de conexões redis. https://github.com/RedisLabs/spark-redis/blob/master/src/main/scala/com/redislabs/provider/redis/ConnectionPool.scala