增加排序的算子后,出现异常

增加排序的算子后,出现异常

老师,我在任务程序里增加了排序的算子后,出现了had a not serializable result: org.apache.kafka.clients.consumer.ConsumerRecord,即ConsumerRecord无法序列化异常。根据网上的提示,在sparkConf中增加了如下属性配置项后,异常消失

new SparkConf().set("spark.serializer", classOf[KryoSerializer].getName)

虽然这个问题解决了,但是我很困惑为什么我增加了如下排序算子后,就必须要增加这个配置项,否则会报错。而没有增加排序算子,即用老师的原方案,不增加这个配置项也不会报错。而且我发现一个现象,通过我这种方式增加排序算子后,控制台信息中rdd好像是4个4个的增加;而在没有增加排序算子之前,则是1个1个的rdd增加。这是什么原因呢?其中的原理是什么呢?是我的这个排序方式有问题吗?老师会怎么写这个排序方案呢?

https://img1.sycdn.imooc.com/climg/6589725409f75dad11380688.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

1:因为sortby这个算子中的数据需要是可序列化的,但是他目前操作的ConsumerRecord默认是无法序列化的,所以需要添加spark.serializer配置项。也可以在sortby之前把ConsumerRecord转化一下,转化成可以序列化的数据类型,其实后面需要的是line,也就是record.value(),所以rdd.map返回(tmestamp,line)即可。


2:控制台中rdd几个几个的增加,都是正常的,没有什么必然联系。可能是在foreachPartition之前增加了一些算子,导致数据处理的慢了,所以积压的数据就多了,这样输出的时候就一起输出了。也可能和控制台输出程序在某些时刻的打印速度有关系。


3:针对rdd内的数据排序,常规思路就是使用sortby。

  • 蒋昌魁 提问者 #1

    好的,谢谢老师,我明白了。不过今天遇到个新的问题,无法获取数据,校验码看了下,我这边并没有过期。提示如下,是您那边的接口出现异常了吗?昨天可以正常获取到数据

    https://img1.sycdn.imooc.com/climg/658a576a09b2674017860634.jpg

    https://img1.sycdn.imooc.com/climg/658a583709aa299d15400460.jpg

    2023-12-26 12:36:18
  • 徐老师 回复 提问者 蒋昌魁 #2

    目前平台的校验接口有异常,需要稍等,已反馈给平台。

    2023-12-26 15:28:56
  • 徐老师 回复 提问者 蒋昌魁 #3

    现在接口可以了。

    2023-12-26 15:51:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师