【发布时间】:2021-09-11 10:42:49
【问题描述】:
我有一个使用线程(实际上是 Spark)和 Redis(Jedis)的 Scala 程序。我为我的 Redis 操作定义了一个object,其中我有一个用于连接的Lazy val。我需要每个线程打开到 Redis 的连接并并行使用它。
连接对象:
object redisOp{
lazy val r = new Jedis("127.0.0.1",6379,30)
def find(u: Long): Option[Long] = Option(r.get(s"p$u")).flatMap(p => if (p.toLong == u) Some(u) else find(p.toLong))
// and other functions
}
当我将它与一个线程一起使用时,它运行良好。但是当多个线程使用它时,我得到了错误。起初,我在每个线程中都得到了Unknown replay: 4,其中“4”是一个随机字符(redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply:)。
然后从redis-cli 开始,我尝试设置config set timeout 30000 和30000,因为我还在日志中看到了redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream 和有时redis.clients.jedis.exceptions.JedisDataException: ERR Protocol error: invalid multibulk length。现在在某些运行中(当切换到 2 个线程而不是 4 个线程时),程序永远卡在一个阶段而没有错误!我检查了 Spark-UI 以检查执行程序的日志,但找不到任何有用的信息:https://pastebin.com/iJMeBD0D
我认为问题在于定义和使用与 Redis 的连接。另外,如果需要,请告诉我关闭连接的正确方法。
【问题讨论】:
-
恕我直言,您应该创建一个新问题(仅包含更新的部分),而不是更新问题。
标签: multithreading scala apache-spark redis jedis