java.io.NotSerializableException: org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplem

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangyang_yangqi/article/details/81871375

在开发[Spark Streaming 读取Kafka数据写入HBASE]一套流程中,遇到了很多关于Serializable的问题:
1、kafka是一种C-S架构,producer产生的消息经过序列化后才能在网络上传播
2、Spark的transform序列化
3、在将DStream数据写入HBASE时,写入的操作时,需要在foreach算子中访问外部的HTable、Connection等,但是HTable对象不可以序列化,所以相关对象必须在算子内部创建

kafka序列化设置

Properties props = new Properties();
props.put("bootstrap.servers", "***********");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Spark序列化可参考博客
Spark是分布式执行引擎,其核心抽象是弹性分布式数据集RDD,其代表了分布在不同节点的数据。Spark的计算是在executor上分布式执行的,故用户开发的关于RDD的map,flatMap,reduceByKey等transformation 操作(闭包)有如下执行过程:
1. 代码中对象在driver本地序列化
2. 对象序列化后传输到远程executor节点
3. 远程executor节点反序列化对象
4. 最终远程节点执行
故对象在执行中需要序列化通过网络传输,则必须经过序列化过程。

对于Spark Streaming作业,注意哪些操作在driver,哪些操作在executor。因为在driver端(foreachRDD)实例化的对象,很可能不能在foreach中运行,因为对象不能从driver序列化传递到executor端(有些对象有TCP链接,一定不可以序列化)。所以这里一般在foreachPartitions或foreach算子中来实例化对象,这样对象在executor端实例化,没有从driver传输到executor的过程。

猜你喜欢

转载自blog.csdn.net/yangyang_yangqi/article/details/81871375
今日推荐