[转载]Spark-Task not serializable错误解析
Spark-Task not serializable错误解析
在学习SparkStreaming的时候偶然出现的一个问题,先看下面一段代码:
import org.apache.log4j.{Level, Logger}
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
/**
* Created by Administrator on 2017/11/6.
*/
object ForEachTest {
val checkpointDirectory="hdfs://hadoop1:9000/streamingchekpoint4"
def functionToCreateContext(): StreamingContext = {
//程序入口
val conf = new SparkConf().setMaster("local[2]").setAppName(s"${this.getClass.getSimpleName}")
val sc = new SparkContext(conf)
sc.setLogLevel("ERROR")
val ssc = new StreamingContext(sc,Seconds(1))
//数据的输入
val dStream = ssc.socketTextStream("192.168.32.10",9999)
//数据的处理
val resultDStream = dStream.flatMap(_.split(","))
.map((_, 1))
.updateStateByKey((values: Seq[Int], valuesState: Option[Int]) => {
val currentCount = values.sum
val lastCount = valuesState.getOrElse(0)
Some(currentCount + lastCount)
})
//程序的输出
resultDStream.foreachRDD( rdd =>{
//Driver
val jdbcCoon = MysqlPool.getJdbcCoon()
val statement = jdbcCoon.createStatement()
rdd.foreachPartition( partition =>{
//Executor
partition.foreach( recored =>{
//Executor
val word = recored._1
val count = recored._2
val sql=s"insert into aura.1706wordcount values(now(),'${word}',${count})"
statement.execute(sql)
})
MysqlPool.releaseConn(jdbcCoon)
})
})
//设置检查点
ssc.checkpoint(checkpointDirectory)
ssc
}
def main(args: Array[String]): Unit = {
val ssc = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _)
//启动程序
ssc.start()
ssc.awaitTermination()
}
}
这段代码是一个SparkStraming与mysql交互的Demo,用到了foreachRDD算子,mysql连接池的代码这里先省略,因为不是重点,会在另一片专门写SparkStreaming的博客中给出。这段代码看似没有问题,但是运行报错:
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: java.lang.Object
表示任务没有被序列化,那么这个序列化到底是指哪里呢?通过查阅官网,发现在介绍foreachRDD的时候有过这么一个介绍:
dstream.foreachRDD { rdd =>
val connection = createNewConnection() // executed at the driver
rdd.foreach { record =>
connection.send(record) // executed at the worker
}
}
这个说明foreachRDD是在driver端执行的,而foreach是在worker端执行的。我们知道我们在提交代码的时候,提交这个动作是在driver端执行的,提交的这台服务器就是driver,那么哪些代码是在drvier端执行的呢?
val conf = new SparkConf()
conf.setAppName(s"${this.getClass.getSimpleName}").setMaster("local[2]")
val sc = new SparkContext(conf)
val ssc: StreamingContext = new StreamingContext(sc, Seconds(1))
以上的这些初始化的代码和:textfile、foreachRDD都是在driver端执行的;
而map、flatmap、reduceByKey、foreach、foreachPartition...这类算子都是在worker端执行的。
从driver到worker是要先序列化再可以传输的,所以你如果要在foreachRDD里面写代码,如果没有经过序列化,就会报错。那么怎么解决呢?
1、让它序列化啊
2、如果这个对象不支持序列化,那就不要写在foreachRDD里面啊
所以,原文的这段代码应该修改为:
resultDStream.foreachRDD( rdd =>{
//Driver
rdd.foreachPartition( partition =>{
//Executor
val jdbcCoon = MysqlPool.getJdbcCoon()
val statement = jdbcCoon.createStatement()
partition.foreach( recored =>{
//Executor
val word = recored._1
val count = recored._2
val sql=s"insert into aura.1706wordcount values(now(),'${word}',${count})"
statement.execute(sql)
})
MysqlPool.releaseConn(jdbcCoon)
})
})
[转载]Spark-Task not serializable错误解析的更多相关文章
- Redis on Spark:Task not serializable
We use Redis on Spark to cache our key-value pairs.This is the code: import com.redis.RedisClient va ...
- spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable
import org.elasticsearch.cluster.routing.Murmur3HashFunction; import org.elasticsearch.common.math.M ...
- spark出现task不能序列化错误的解决方法
应用场景:使用JavaHiveContext执行SQL之后,希望能得到其字段名及相应的值,但却出现"Caused by: java.io.NotSerializableException: ...
- Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法
错误信息: 17/05/20 18:51:39 ERROR JobScheduler: Error running job streaming job 1495277499000 ms.0 org.a ...
- spark2.1注册内部函数spark.udf.register("xx", xxx _),运行时抛出异常:Task not serializable
函数代码: class MySparkJob{ def entry(spark:SparkSession):Unit={ def getInnerRsrp(outer_rsrp: Double, we ...
- Spark程序运行常见错误解决方法以及优化
转载自:http://bigdata.51cto.com/art/201704/536499.htm Spark程序运行常见错误解决方法以及优化 task倾斜原因比较多,网络io,cpu,mem都有可 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十九):推送avro格式数据到topic,并使用spark structured streaming接收topic解析avro数据
推送avro格式数据到topic 源代码:https://github.com/Neuw84/structured-streaming-avro-demo/blob/master/src/main/j ...
- 再提供一种解决Nginx文件类型错误解析漏洞的方法
[文章作者:张宴 本文版本:v1.2 最后修改:2010.05.24 转载请注明原文链接:http://blog.zyan.cc/nginx_0day/] 注:2010年5月23日14:00前阅读本文 ...
- 【原创】大叔问题定位分享(19)spark task在executors上分布不均
最近提交一个spark应用之后发现执行非常慢,点开spark web ui之后发现卡在一个job的一个stage上,这个stage有100000个task,但是绝大部分task都分配到两个execut ...
随机推荐
- ambari 快速安装部署
OS:Linux CPU消耗大,要准备5G以上,不然集群启动不了(我自己给它配了8G,启动整个集群是没问题,要用的话估计不够) 一.准备工作: 1.关闭防火墙:sudo ufw disable/ 2. ...
- NPM安装过程中的一些问题与解决
1. 安装 vue-cli3后提示 : Package require os(darwin) not compatible with your platform(win32). 上面是因为安装 npm ...
- Redis(1.3)Redis的基本特性(事务、多数据库)
[1]两大特性 (1)多数据库 1个redis实例 可以有16个数据库,默认下标为0~15,默认连接到的是 0 下标的数据库. (2)事务 [2]多数据库 [2.1]概念 1个redis实例 可以有1 ...
- scrapy生成json中文为ASCII码解决
修改pipelines.py 即可 修改内容如下: import json import codecs import os class BaiduNewsPipeline(object): #增加的 ...
- Oracle 的查询-scott用户介绍
scott用户 密码tiger 解锁scott用户 alter user scott account unlock; 解锁scott密码(也可重置密码) alter user scott identi ...
- Spring注解Component原理源码解析
在实际开发中,我们经常使用Spring的@Component.@Service.@Repository以及 @Controller等注解来实现bean托管给Spring容器管理.Spring是怎么样实 ...
- HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)
(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...
- Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用?
Hinton等人最新研究:大幅提升模型准确率,标签平滑技术到底怎么用? 2019年07月06日 19:30:55 AI科技大本营 阅读数 675 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- nodejs+gulp+webpack基础知识
nodejs+gulp+webpack基础知识 2019年08月22日 11:49:40 天府云创 阅读数 22 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...
- mysql 8.x 集群出现:Last_IO_Error: error connecting to master 'repl@xxx:3306' - retry-time: 60 retries: 1
网上的经验:网络不同,账号密码不对,密码太长,密码由 # 字符:检查MASTER_HOST,MASTER_USER,MASTER_PASSWORD(不知道 MASTER_LOG_FILE 有没有影响) ...