1、一个rdd处理完去更新一下吗?还是rdd里的一个msg处理完就更新?
那会不会有问题啊?比如rdd拿了n个msg,处理到m(n2、拿出来处理了,然后插到mysql里,失败了,你让我把rdd中前面的m-1个都从mysql里删除掉?
你失败了那不就是offset没存到mysql中去么,下次还是从原先的offset读取吧
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Apache Spark中,RDD(弹性分布式数据集)是只读的、可分区的、不可变的数据集合。这意味着你不能直接更新一个已经创建好的RDD。当你提到“处理完去更新”,这实际上是指对RDD执行转换(Transformation)操作生成新的RDD,而不是修改原RDD。
对于你的问题,这里有几个关键点需要澄清:
消息处理:如果你是在处理像Kafka这样的流数据源,通常会使用Spark Streaming或Structured Streaming来处理实时数据流。在这些场景下,数据是以DStream(Spark Streaming中的概念)或DataFrame/Dataset(Structured Streaming中的概念)的形式处理的,而不是直接操作RDD。每个批次(batch)的数据会被处理,如果处理逻辑中包括写入MySQL,那么是针对这个批次的所有数据进行操作,而不是单个message。
错误处理与重试:当向MySQL插入数据失败时,确实存在如何处理已成功插入部分数据的问题。Spark本身不直接提供事务管理或回滚机制。处理这类情况的一般策略是:
解决方法:
综上所述,直接在RDD层面处理更新和错误恢复不是Spark推荐的方式,特别是在处理实时数据流时,应该结合Spark Streaming或Structured Streaming以及外部系统(如数据库)的特性来设计合理的数据处理和错误处理流程。