首先是虚构的用例。假设我有一个元组流 (user_id, time_stamp, login_ip)
。我想以 5 秒的粒度维护每个用户的最后登录 IP。
使用 Spark 流,我可以使用 updateStateByKey
方法更新这张 map 。问题是,随着数据流不断涌来,每个时间间隔的RDD越来越大,因为看到了更多的user_ids
。一段时间后, map 会变得很大,维护时间会变长,无法实现结果的实时传递。
请注意,这只是我想出的一个简单示例来说明问题。实际问题可能更复杂,确实需要实时交付。
关于如何解决这个问题的任何想法(在 Spark 以及其他解决方案中都会很好)?
最佳答案
您没有完全更新 Map
。您提供的功能只是更新与一个键关联的状态,剩下的由 Spark 完成。特别是,它为您维护一个类似 map 的 RDD
键-状态对——实际上,是一系列它们,一个 DStream
。所以状态的存储和更新就像其他一切一样是分布式的。如果更新速度不够快,您可以通过添加更多工作人员来扩大规模。
关于hadoop - 使用Spark的有状态操作updateStateByKey如何保持实时性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24618549/