spark 写入 redis 和 org.apache.spark.SparkException: Task not serializable
2015-06-23 14:30
513 查看
spark将数据写入redis时调用以下代码会报 org.apache.spark.SparkException: Task not serializable
原因是:在spark,rdd的方法里比如这里的map,方法里的数据会被序列化,并且分发到executors 去执行。这就需要rdd方法里的所有元素是可被序列化的这里的redis连接是不可被序列化的,所以会报Task not serializable异常
解决这个问题的方法是在executors中创建连接对象,这里介绍两种方法
1)rdd.mapPartitions 这个方法允许一次处理整个partitons的数据,在此方法中创建连接:
2)用可序列化的单例模式来管理连接,让连接用lazy的方式创建
这里主要是给出在处理rdd数据时,获得redis连接的方法,同样的,操作其他数据库道理是一样的,这里是以redis为例
import com.redis.RedisClient val r = new RedisClient("192.168.1.101", 6379) val perhit = rdd.map(x => { val arr = x.split(" ") val k = arr(0).toInt val v = arr(1).toInt r.rpush(k, v) (k, v) })
原因是:在spark,rdd的方法里比如这里的map,方法里的数据会被序列化,并且分发到executors 去执行。这就需要rdd方法里的所有元素是可被序列化的这里的redis连接是不可被序列化的,所以会报Task not serializable异常
解决这个问题的方法是在executors中创建连接对象,这里介绍两种方法
1)rdd.mapPartitions 这个方法允许一次处理整个partitons的数据,在此方法中创建连接:
val rdd = rdd.mapPartitions{partition => val r = new RedisClient("192.168.1.101", 6379) val res = partition.map{ x => ... val refStr = r.rpush(...) } r.close res }
2)用可序列化的单例模式来管理连接,让连接用lazy的方式创建
object RedisConnection extends Serializable { lazy val conn: RedisClient = new RedisClient("192.168.1.101", 6379) } val rdd = rdd.map{x => ... ... val refStr = RedisConnection.conn.rpush(...) }
这里主要是给出在处理rdd数据时,获得redis连接的方法,同样的,操作其他数据库道理是一样的,这里是以redis为例
相关文章推荐
- 使用 Redis 实现分布式系统轻量级协调技术
- python redis
- Redis String 类型和 Hash 类型学习笔记与总结
- Redis 3.0 源码注释
- Redis list 类型学习笔记与总结
- Redis的Python客户端redis-py安装使用说明文档
- Redis数据库的应用场景介绍
- Redis的LRU机制介绍
- Redis2.8配置文件中文详解
- redis2.8配置文件中文翻译版
- Redis中主键失效的原理及实现机制剖析
- 利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)
- Redis操作字符串(字符串最大值为512M)
- Ubuntu 安装 Redis
- Redis实现分布式锁全局锁—Redis客户端Redisson中分布式锁RLock实现
- Redis String命令
- 利用Redis设计秒杀原理
- redis文档翻译_key设置过期时间
- Redis同步机制
- redis调整内核参数