问题描述:
使用Spark,把处理的结果在向redis
写入数据时,抛出如下异常:
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 4.0 failed 1 times, most recent failure: Lost task 0.0 in stage 4.0 (TID 6, localhost, executor driver): redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out:
问题成因:
后来经过测试,发现,是因为 在创建redis
连接的时候,在属性上直接定义了连接,因为 redis是单例
的,并不支持并发;同时,单例类属性上的单一连接,被多个线程使用,肯定是不可以的。
解决:
使每个线程都获取一条连接
//定义redis写入的单例类。
package com.baizhi
import redis.clients.jedis.{
Jedis, JedisPool, JedisPoolConfig}
object RedisSink {
//JedisPoolConfig -> JedisPool -> jedis
private var jedisPool = createJedisPool(