Spark Konteks tidak serial.
Setiap implementasi ForeachWriter harus serializable karena setiap tugas akan mendapatkan salinan serial-deserialized baru dari objek yang disediakan. Oleh karena itu, sangat disarankan agar setiap inisialisasi untuk menulis data (misalnya membuka koneksi atau memulai transaksi) dilakukan setelah metode open(...) dipanggil, yang menandakan bahwa tugas siap untuk menghasilkan data.
Dalam kode Anda, Anda mencoba menggunakan konteks percikan dalam metode proses,
override def process(record: Row) = {
val stringHashRDD = sc.parallelize(Seq(("lastContact", record(1).toString)))
*sc.toRedisHASH(stringHashRDD, record(0).toString)(redisConfig)*
}
Untuk mengirim data ke redis, Anda perlu membuat koneksi Anda sendiri dan membukanya dalam metode terbuka, lalu menggunakannya dalam metode proses.
Lihatlah cara membuat kumpulan koneksi redis. https://github.com/RedisLabs/spark-redis/blob/master/src/main/scala/com/redislabs/provider/redis/ConnectionPool.scala