Spark-Task not serializable错误解析

2018年05月17日 15:33:03 沙拉控 阅读数:1509
 

在学习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错误解析的更多相关文章

  1. 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 ...

  2. spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable

    import org.elasticsearch.cluster.routing.Murmur3HashFunction; import org.elasticsearch.common.math.M ...

  3. spark出现task不能序列化错误的解决方法

    应用场景:使用JavaHiveContext执行SQL之后,希望能得到其字段名及相应的值,但却出现"Caused by: java.io.NotSerializableException: ...

  4. 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 ...

  5. spark2.1注册内部函数spark.udf.register("xx", xxx _),运行时抛出异常:Task not serializable

    函数代码: class MySparkJob{ def entry(spark:SparkSession):Unit={ def getInnerRsrp(outer_rsrp: Double, we ...

  6. Spark程序运行常见错误解决方法以及优化

    转载自:http://bigdata.51cto.com/art/201704/536499.htm Spark程序运行常见错误解决方法以及优化 task倾斜原因比较多,网络io,cpu,mem都有可 ...

  7. 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 ...

  8. 再提供一种解决Nginx文件类型错误解析漏洞的方法

    [文章作者:张宴 本文版本:v1.2 最后修改:2010.05.24 转载请注明原文链接:http://blog.zyan.cc/nginx_0day/] 注:2010年5月23日14:00前阅读本文 ...

  9. 【原创】大叔问题定位分享(19)spark task在executors上分布不均

    最近提交一个spark应用之后发现执行非常慢,点开spark web ui之后发现卡在一个job的一个stage上,这个stage有100000个task,但是绝大部分task都分配到两个execut ...

随机推荐

  1. GPD mircoPC linux系统安装

    前言 GPD 全称GamePad Digital, 深圳市中软赢科技术有限公司持有的品牌,其主要生产掌机,最近开始涉足办公级UMPC.其中有款UMPC--mircoPC堪称神作.接口齐全,黑大粗,耐操 ...

  2. PHP学习(3)——数据的存储与检索

    要点目录: I.保存数据 II.打开文件   III.创建并写入文件 IV.关闭文件 V.读文件 VI.给文件加锁 VII.删除文件 VIII.其他有用的文件操作函数 IX.数据库管理系统 1.保存数 ...

  3. SQL ------ JDBC 删除指定的某条记录

    package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...

  4. 常用小技巧之PyCharm IDE

    Pycharm控制台窗口怎样可以显示不同程序的运行结果 默认情况下,每次运行会把之前的那个结果给清理掉. 有时候运行多个程序像对比结果,不太方便. 可以在pycharm的控制台那里点击右键,在弹出的菜 ...

  5. C++命名建议

    如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套统一.带层次结构.清晰明了的命名准则就是必不可少而且非常好用的工具. 活跃在生物学.化学.军队.监狱.黑社会.恐怖组织等各个领域内的大量有识 ...

  6. foreach中的&用法

    原地址:https://blog.csdn.net/qq_38287952/article/details/79468321 例如,给数组添加一个新的元素. 这里的需求是统计商品收入,就可以用到&am ...

  7. T100——q查询,子母查询(汇总——明细)练习笔记

    范例: 代码: #add-point:input段落 name="ui_dialog.input" INPUT BY NAME g_master.bdate,g_master.ed ...

  8. Jmeter之压测探索和结果分析

    1.copy过来的,很有道理的一句话~ 最大并发数:取决于你的业务类型,数据量,处理时的资源需求等,具体多少,需要做一些性能测试来衡量 确定待测试的场景,设计脚本,不断增加并发数量. 2.CPU压不上 ...

  9. MySQL 事务、视图、索引

    一.事务(Transaction) 1.1 什么是事务? SQL中,事务是指将一系列数据操作捆绑成为一个整体进行统一管理. 如果一个事务执行成功,该事务中进行的所有数据均会提交,称为数据库中的永久组成 ...

  10. OnMouseWheel的通常处理

    BOOL CMainWindow::OnMouseWheel(UINT nFlags, short zDelta, CPoint point) { BOOL bUp = TRUE; int nDelt ...