spark redis 中碰到java.net.SocketTimeoutException: Read timed out问题的解决

最近在写入redis的时候,程序跑着跑着会发现碰到这样的问题。

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
    at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
    at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
    at redis.clients.jedis.Protocol.process(Protocol.java:151)
    at redis.clients.jedis.Protocol.read(Protocol.java:215)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:276)
    at redis.clients.jedis.Connection.getMultiBulkReply(Connection.java:269)
    at redis.clients.jedis.Jedis.lrange(Jedis.java:935)
    at com.redislabs.provider.redis.rdd.RedisListRDD$$anonfun$getLIST$1$$anonfun$3.apply(RedisRDD.scala:98)
    at com.redislabs.provider.redis.rdd.RedisListRDD$$anonfun$getLIST$1$$anonfun$3.apply(RedisRDD.scala:98)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
    at scala.collection.mutable.ArrayOps$ofRef.flatMap(ArrayOps.scala:186)

由于spark采用的是jedis来连接的,因此也就说明是jedis的问题。

针对这一问题,之前直接都是利用

val client = new Jedis(ip, port)的方法,嵌套在dataframe.foreach()中的方式。

由于之前部署是流式的数据处理,所以每次处理间隔都非常短,因此没有任何问题。但是这回为了查看一个数据想缓存到spark的时候,发现了这个BUG。也才具体发现以前程序设置的不合理的地方。

还好,Jedis提供了这种解决方法。

  • public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port, final int timeout)
  • public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port, int timeout, final String password, final int database)
  • public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port, int timeout, final String password, final int database, final String clientName)

采用这种池化的概念,可以来设置里面的timeout参数,默认是2000。

根据大概程序写入redis的数据量和时长来设置即可。

由于本来写入的数据量大概有7亿多条记录,为了方便,拆分了400个小片断分开写入,再用上述默认设置,也能够通过。

代码片断可以如下:

Jediscommands jediscommands;
JedisPool jedisPool;
JedisPoolConfig config = new JedisPoolConfig()

String ip = "***"
int port = 6379
long timeOut = 2000
String auth = "***"
JedisPool jedisPool = new JedisPool(config,ip,port,timeOut,auth)

Jedis jedis = jedisPool.getResource();

当前,也只可以对JedisPoolConfig进行设置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老码农专栏

原 荐 一场版本升级引发的性能血案 - 之数

24630
来自专栏小尘哥的专栏

小程序(3):授权登录

判断是否授权,如果没有,则显示授权按钮。注意上面的open-type="getUserInfo",这个会自动调起授权框。看一下js

47640
来自专栏nimomeng的自我进阶

OC优化指南

a) Reusing UITableViewCell:利用cellWithTableView:cellIdentifier:nibName: b)...

17010
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十四天 基础加强-JDBC案例【悟空教程】

`pname` varchar(50) DEFAULT NULL, #商品名称

15640
来自专栏Java架构师历程

Struts2的工作原理

在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处?

11840
来自专栏blackheart的专栏

[信息安全] 4.一次性密码 && 身份认证三要素

在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其...

34160
来自专栏xingoo, 一个梦想做发明家的程序员

Spark源码分析之Spark-submit和Spark-class

有了前面spark-shell的经验,看这两个脚本就容易多啦。前面总结的Spark-shell的分析可以参考: Spark源码分析之Spark Shell(上...

22350
来自专栏desperate633

浅谈对MVC模式的理解(通过一个servlet实例)创建一个简单的啤酒顾问servlet程序总结

通过将一个servlet程序进行改版,加入MVC的设计思想,浅谈对MVC模式的理解与运用

9230
来自专栏FreeBuf

如何在CTF中少走弯路(基础篇)

自己并不是专业的赛棍也没有打过很多比赛,这篇文章是自己在CTF中对于杂项这块知识学习的小结,希望可以对初入CTF的同学有所帮助,在CTF中少走弯路从而更快的提升...

1.6K40
来自专栏along的开发之旅

图解JSP运行原理和过程

下面代码通过注解来处理/hello的请求, 并在代码中将请求转发到上述hello.jsp.

13610

扫码关注云+社区

领取腾讯云代金券