來源: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 庫進行連接的詳細信息,大家也可以隨時查看我演講的完整視頻。
更多優質中間件技術資訊/原創/翻譯文章/資料/干貨,請關注“中間件小哥”公眾號!