java.io.NotSerializableException: org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplem 淡淡的烟草味﹌ 2022-05-16 11:22 104阅读 0赞 在开发\[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序列化[可参考博客][Link 1] 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的过程。 [Link 1]: https://blog.csdn.net/xwc35047/article/details/78411749
还没有评论,来说两句吧...