深度解析 Twitter Heron 大資料實時分析系統
阿新 • • 發佈:2019-02-06
所有的老的生產環境的topology已經執行在Heron上, 每天大概處理幾十T的資料, billions of訊息
(3)認為Storm設計不合理的地方
3.1 一個executor 存在2個執行緒, 一個執行執行緒, 一個傳送執行緒, 並且一個executor執行多個task, task的排程完全依賴來源的tuple, 很不方便確認哪個task出了問題。
3.2 因為多種task執行在一個worker中, 無法明確出每種task使用的資源, 也很難定位出問題的task,當出現效能問題或其他行為時, 常用就是重啟topology, 重啟後就好了,因為task進行了重新排程
3.3 日誌打到同一個檔案中,也很難查詢問題,尤其是當某個task瘋狂的列印日誌時
3.4 當一個task掛掉了,直接會幹掉worker,並強迫其他執行好的task被kill掉
3.5 最大的問題是,當topology某個部分出現問題時, 會影響到topology其他的環節
3.6 gc引起了大量的問題
3.7 一條訊息至少經過4個執行緒, 4個佇列, 這會觸發執行緒切換和佇列競爭問題
3.8 nimbus功能太多, 排程/監控/分發jar/metric report, 經常會成為系統的bottleneck
3.9 storm的worker沒有做到資源保留和資源隔離, 因此存在一個worker會影響到另外的worker。 而現有的isolation排程會帶來資源浪費問題。 Storm on Yarn也沒有完全解決這個問題。
3.10 zookeeper成為系統的瓶頸, 當叢集規模增大時。 有些系統為了降低zk心態,新增了tracker,但tracker增加了系統運維難度。
3.11 nimbus是系統單點
3.12 缺乏反壓機制
3.12.1 當receiver忙不過來時, sender就直接扔棄掉tuple,
3.12.2 如果關掉acker機制, 那無法量化drop掉的tuple
3.12.3 因為上游worker執行的計算就被扔棄掉。
3.12.4. 系統會變的難以預測(less predictable.)
3.13 常常出現效能問題, 導致tuple fail, tuple replay, 執行變慢
3.13.1 不良的replay, 任意一個tuple失敗了,都會導致整個tuple tree fail, 不良的設計時(比如不重要的tuple失敗),會導致tuple輕易被重發
3.13.2 當記憶體很大時,長時間的gc,導致處理延時,甚至被誤殺
3.13.3 佇列競爭
Heron設計原則:
Topology Manager
1. tm伴隨整個topology生命週期, 提供topology狀態的唯一contact (類似yarn的app master)
2. 可以一主多備, 大家搶佔zk 節點, 誰勝出,誰為master, 其他為standby
為什麼要重新設計Heron:
【題外話】這裡完全引用作者吐槽的問題, 不少問題,其實JStorm已經解決(1)debug-ability 很差, 出現問題,很難發現
1.1 多個task執行在一個系統程序中, 很難定位問題。需要一個清晰的邏輯計算單元到物理計算單元的關係(2)需要一種更高階的資源池管理系統
2.1 可以和其他程式設計框架共享資源, 說白了,就是類似yarn/mesos, 而在Twitter就是Aurora 2.2 更簡單的彈性擴容和縮容 叢集 2.3 因為不同task,對資源需求是不一樣的, 而storm會公平對待每個worker, 因此會存在worker浪費記憶體問題。當worker記憶體特別大時, 進行jstack或heap dump時,特別容易引起gc,導致被supervisor幹掉 2.4 經常為了避免效能故障,常常進行超量資源分配, 原本100個core,分配了200個
(3)認為Storm設計不合理的地方
3.1 一個executor 存在2個執行緒, 一個執行執行緒, 一個傳送執行緒, 並且一個executor執行多個task, task的排程完全依賴來源的tuple, 很不方便確認哪個task出了問題。
3.2 因為多種task執行在一個worker中, 無法明確出每種task使用的資源, 也很難定位出問題的task,當出現效能問題或其他行為時, 常用就是重啟topology, 重啟後就好了,因為task進行了重新排程
3.3 日誌打到同一個檔案中,也很難查詢問題,尤其是當某個task瘋狂的列印日誌時
3.4 當一個task掛掉了,直接會幹掉worker,並強迫其他執行好的task被kill掉
3.5 最大的問題是,當topology某個部分出現問題時, 會影響到topology其他的環節
3.6 gc引起了大量的問題
3.7 一條訊息至少經過4個執行緒, 4個佇列, 這會觸發執行緒切換和佇列競爭問題
3.8 nimbus功能太多, 排程/監控/分發jar/metric report, 經常會成為系統的bottleneck
3.9 storm的worker沒有做到資源保留和資源隔離, 因此存在一個worker會影響到另外的worker。 而現有的isolation排程會帶來資源浪費問題。 Storm on Yarn也沒有完全解決這個問題。
3.10 zookeeper成為系統的瓶頸, 當叢集規模增大時。 有些系統為了降低zk心態,新增了tracker,但tracker增加了系統運維難度。
3.11 nimbus是系統單點
3.12 缺乏反壓機制
3.12.1 當receiver忙不過來時, sender就直接扔棄掉tuple,
3.12.2 如果關掉acker機制, 那無法量化drop掉的tuple
3.12.3 因為上游worker執行的計算就被扔棄掉。
3.12.4. 系統會變的難以預測(less predictable.)
3.13 常常出現效能問題, 導致tuple fail, tuple replay, 執行變慢
3.13.1 不良的replay, 任意一個tuple失敗了,都會導致整個tuple tree fail, 不良的設計時(比如不重要的tuple失敗),會導致tuple輕易被重發
3.13.2 當記憶體很大時,長時間的gc,導致處理延時,甚至被誤殺
3.13.3 佇列競爭
Heron設計原則:
(1)相容老的storm api
(2)實現2種策略, At most once/At least once