Yimian 是一家領先的AI驅動數據分析服務商,專注於數位商務數據。我們提供實時的商業策略、產品開發及數位商務運營洞察。許多客戶如寶潔、聯合利華和瑪氏等,均為個人護理、化妝品、食品飲料、寵物及汽車行業的領導者。
我們最初採用的是基於CDH(Cloudera Distributed Hadoop)構建的大數據集群,部署於本地數據中心。隨著業務擴張,數據量急劇增長,面臨擴展周期長、計算與存儲資源不匹配及維護成本高等挑戰。
為此,我們決定重構數據架構,遷移至雲端,採用計算與存儲分離策略。經過仔細評估,我們選擇了阿里雲彈性MapReduce(EMR) + JuiceFS + 阿里雲對象存儲服務(OSS)。
目前,借助JuiceFS,我們已實現計算與存儲解耦的架構,存儲容量翻倍,且未觀察到明顯的性能影響,運營成本大幅降低。
在本文中,我們將分享將Hadoop遷移至雲端的架構設計,闡述為何選擇JuiceFS+EMR+OSS,以及新架構帶來的益處。我們旨在透過此文,為面臨類似挑戰的讀者提供寶貴見解。
舊有架構與挑戰
為滿足日益增長的需求,我們從數百個大型網站爬取數據,目前數量已超過500個。隨著時間推移,我們積累了大量原始、中間及結果數據。隨著網站爬取範圍與客戶基礎的擴大,數據量急劇增長。因此,我們決定擴展硬件以應對日益增長的需求。
原始架構
下圖展示了我們先前的架構,一個基於CDH的大數據集群部署在數據中心內:
- 主要組件包括Hive、Spark及HDFS。
- 多個數據生產系統,其中Kafka為一例,將數據輸入集群。
- 我們還使用了其他存儲解決方案,如TiDB、HBase及MySQL,與Kafka並行。

數據從上游應用系統及數據收集系統流入,並寫入Kafka。我們利用Kafka Connect集群將數據同步至HDFS。
在此架構基礎上,我們開發了名為OneWork的定制數據開發平台,用以管理各項任務。這些任務通過Airflow進行排程,並在任務隊列中處理。
我們的痛點
面臨的挑戰如下:
- 應用數據快速增長與擴展週期過長: 我們於2016年部署的CDH集群,至2021年已處理了數PB的數據。然而,數據增長常超出硬件規劃,導致每六個月須頻繁擴展,耗費大量資源與時間。
- 存儲與計算緊耦合及容量規劃困難: 傳統Hadoop架構中存儲與計算的緊密耦合,使得根據存儲或計算需求進行獨立擴展與規劃變得困難。例如,擴展存儲亦需購買不必要的計算資源,導致資源配置效率低下。
- 因CDH版本老舊而不敢升級: 我們的CDH版本過時,因擔憂穩定性與兼容性問題而猶豫升級。
- 高運營成本: 公司約有200名員工,僅配備一名全職運維人員,造成沉重工作負擔。為緩解此狀況,我們尋求更穩定且簡化的架構。
- 單一數據中心單點故障風險: 所有數據存於單一數據中心,長期存在風險。若遇電纜損壞或其他問題,單一數據中心即成為單點故障。
新架構需求
為應對挑戰並滿足日益增長的需求,我們決定進行架構調整。升級時考慮的主要方面包括:
- 雲端採用、彈性擴展性及運營靈活性:採用雲端服務能簡化運營。例如,利用基於雲端的儲存讓我們專注於應用程式,同時避免維護工作。此外,雲端資源實現了無需冗長硬體部署和系統配置的彈性擴展性。
- 儲存與計算脫鉤:我們旨在分離儲存和計算以實現更好的靈活性和效能。
- 偏好開源元件,避免供應商鎖定:儘管我們使用雲端服務,但我們力求減少對特定供應商的依賴。在使用 AWS Redshift 提供客戶服務的同時,我們傾向於開源元件用於內部運營。
- 與現有解決方案兼容,控制成本和風險:我們的目標是確保與當前解決方案的兼容性,以最小化開發成本並減少對我們應用程式的影響。
為何選擇 JuiceFS+EMR+OSS
在評估了多種解決方案後,我們選擇了 EMR+JuiceFS+OSS 來建立一個儲存與計算分離的大數據平台,並逐步將我們的本地數據中心遷移至雲端。

在此配置中,物件儲存取代了 HDFS,而 JuiceFS 作為協議層因其支援 POSIX 和 HDFS 協議。在其上,我們使用了一種半管理式 Hadoop 解決方案,EMR。它包含了 Hive、Impala、Spark、Presto/Trino 等元件。
阿里雲 vs. 其他公有雲
經過仔細評估,我們選擇了阿里雲而非 AWS 和 Azure,主要基於以下因素:
- 近接性: 阿里雲的可用區與我們的數據中心位於同一城市,確保了低延遲和降低的網絡成本。
- 全面的開源組件: 阿里雲EMR提供廣泛的Hadoop相關開源組件。除了我們大量使用的Hive、Impala、Spark和Hue外,它還提供與Presto、Hudi、Iceberg等無縫集成。在我們的研究中,發現只有EMR原生包含Impala,而AWS和Azure要么提供較低版本,要么需要手動安裝和部署。
JuiceFS vs. JindoFS
什麼是JuiceFS?
JuiceFS 是一個開源、雲原生、高性能的分佈式文件系統。它提供完整的POSIX兼容性,允許對象存儲跨不同平台和區域用作大型本地磁盤。
JuiceFS採用數據-元數據分離的架構,支持分佈式文件系統設計。使用JuiceFS存儲數據時,數據持久化在Amazon S3等對象存儲中,而元數據可以存儲在Redis、MySQL、TiKV、SQLite等數據庫中。
除了POSIX外,JuiceFS完全兼容HDFS SDK,允許無縫替換HDFS以實現存儲計算分離。

為何我們選擇JuiceFS而非JindoFS
我們基於以下考慮選擇了JuiceFS而非JindoFS:
- 儲存設計: JuiceFS 採用數據與元數據分離的儲存架構,實現了分散式文件系統的設計。數據持久化於對象儲存中,而元數據則可存於 Redis、MySQL、TiKV、SQLite 等多種數據庫,提供更高的靈活性。相較之下,JindoFS 的元數據儲存於 EMR 集群的本地硬盤,使得維護、升級與遷移較為不便。
- 儲存靈活性: JuiceFS 提供多種儲存方案,支援不同方案間的在線遷移,增強了可攜性。JindoFS 塊數據僅支援 OSS。
- 開源社區支持: JuiceFS 基於開源社區,支援所有公有雲環境,有利於未來擴展至多雲架構。
整體架構設計
考慮到某些應用仍將保留在數據中心的 Hadoop 集群中,我們實際上採用了混合雲架構,如下圖所示。

在架構圖中:
- 頂部是 Airflow 和 OneWork,兩者均支援分散式部署,因此可以輕鬆進行水平擴展。
- 左側是 IDC,使用傳統的 CDH 架構及部分 Kafka 集群。
- 右側是在阿里雲上部署的 EMR 集群。
IDC 與 EMR 集群通過高速專線相連。
我們如何從新架構中獲益
儲存與計算分離的優勢
隨著存儲與計算解耦的實施,我們的總存儲容量已翻倍,而計算資源保持穩定。偶爾,我們會根據需要啟用臨時任務節點。在我們的場景中,數據量快速增長,而查詢需求保持穩定。自2021年以來,我們的數據量已翻倍。從初始階段至今,我們對計算資源的調整微乎其微,除了偶爾啟用彈性資源和臨時任務節點以應對特定的應用需求。
性能變化
對於我們主要涉及大規模批量處理的離線計算應用場景,性能並未受到顯著影響。但在概念驗證(PoC)階段,我們觀察到即席Impala查詢的響應時間有所改善。
在PoC階段,我們進行了一些簡單測試。然而,由於多種影響因素,準確解讀結果頗具挑戰:
- 從HDFS過渡到JuiceFS
- 組件版本升級
- Hive引擎的變更
- 集群負載的變化
這些因素使得與我們之前在裸金屬服務器上部署的CDH相比,關於性能差異的明確結論難以得出。
易用性與穩定性
我們在使用JuiceFS時未遇到問題。
在使用EMR時,我們遇到了一些小問題。總體而言,CDH被認為更穩定且用戶友好。
實施複雜度
在我們的場景中,最耗時的流程是增量雙寫和數據驗證。回顧過去,我們在驗證上投入過多,其實可以簡化。
多種因素影響複雜性:
- 應用場景(離線/實時、表/任務數量、上層應用)
- 組件版本
- 支持工具及儲備
未來計劃
我們的未來計劃包括:
- 繼續將剩餘應用遷移至雲端。
- 探索使用JuiceFS+OSS的冷/熱分層存儲策略。JuiceFS文件在OSS上完全拆解,使得實現文件級分層較為困難。我們目前的做法是將JuiceFS中的冷數據遷移至OSS,設為歸檔存儲,並在不影響使用的情況下修改Hive表或分區的LOCATION。
- 如果數據量增長,使用Redis有壓力,未來可能考慮轉向TiKV或其他引擎。
- 探索EMR的彈性計算實例,以降低使用成本同時滿足應用服務級別協議。
Source:
https://dzone.com/articles/migrating-hadoop-to-the-cloud-2x-storage-capacity