Redis Streams与Spark的完美结合
来源:Redislabs
作者:Roshan Kumar
翻译:Kevin (公众号:中间件小哥)
最近,我有幸在 Spark +AI 峰会上发表了题目为“Redis + Structured Streaming:扩展您的持续应用的完美组合”的演讲。
我对这个主题的兴趣是由 Apache Spark 和 Redis 在过去几个月中引入的新功能引起的。根据我之前使用 Apache Spark 的经验,我很欣赏它在运行批处理时的优雅,并且它在 2.0 版本中引入 Structured Streaming 是在这个方向上的进一步发展。
与此同时,Redis 最近宣布了用于管理流数据的新数据结构,称为“Streams”。Redis Streams 提供了生产者和消费者之间的异步通信功能以及持久性、回顾性查询功能和类似于 Apache Kafka 的横向扩展选项。从本质上讲,Redis 通过Streams 提供了一个轻便、快速、易于管理的流数据库,使数据工程师们受益良多。
此外,开发 Spark-Redis 库是为了使 Redis 可以作为弹性分布式数据集(RDD)使用。因为现在有了 Structured Streaming 和 Redis Streams,我们决定扩展 Spark-Redis 库将 Redis Streams 集成为 Apache Spark Structured Streaming 的数据源。
在上个月的演讲中,我演示了如何在 Redis Streams 中收集用户活动数据并将其下载到 Apache Spark 进行实时数据分析。我开发了一个小型的适合移动设备的 Node.js 应用程序,在这个程序中人们可以点击投票给他们最喜欢的狗来进行有趣的比赛。
这是一场艰苦的战斗,有几个观众甚至是黑客很有创意地攻击了我的应用程序。他们使用“页面检查”选项更改了 HTML 按钮名称试图弄乱应用的显示。但最终他们失败了,因为 Redis Streams,Apache Spark,Spark-Redis 库和我的代码都足够的强大,可以有效地应对这些攻击。
在我演讲期间和之后观众还询问了一些有趣的问题,例如:
1. 如果数据处理速度低于 Redis Streams 接收数据的速率,该如何扩展?
我的回答:配置一个 Redis Streams 的消费者组,将每个 Spark 作业作为属于该组的一个消费者,这样每个作业都会获得一组独有的数据,将输出模式设置为“更新”非常重要,这样每个作业都不会覆盖其他作业的数据提交。
2. 如果我重新启动 Spark 作业,Redis Streams 中的数据会发生什么变化?
我的回答:RedisStreams 持久化数据。因此您的 Spark 作业不会遗漏任何数据,如果重新启动 Spark 作业,它将从之前停止的位置提取数据。
3. 我可以用 Python 开发我的 Spark 应用程序吗?(我的演示是用 Scala 编写的)
我的回答:是的,你可以,请参阅 GitHub 上的 Spark-Redis 文档。
4. 我可以在云上部署 Redis Streams 吗?
我的回答:是的,Streams 只是 Redis 中的另一个数据结构,从 5.0 版开始内置于 Redis 中,最快捷的方式是在 https://redislabs.com/get-started 上注册。
我在峰会上的主要收获是了解到人们对连续处理和数据流的兴趣日益浓厚。根据大家的需求,我们在 InfoQ 上发布了一篇关于此主题的更详细的文章,在其中提供了有关如何设置 Redis Streams 和 Apache Spark 以及使用 Spark-Redis 库进行连接的详细信息,大家也可以随时查看我演讲的完整视频。
更多优质中间件技术资讯/原创/翻译文章/资料/干货,请关注“中间件小哥”公众号!