辽宁麻将透视眼镜|微乐辽宁麻将下载苹果版
連接安全與變革
股票代碼:831194

共享 共贏

新聞

技術干貨 | 數據沙盒技術- 大數據架構發展趨勢之計算和存儲分離
來源:派拉集團時間:4/7/2019瀏覽量:

本文非原創,編譯自參考文獻中列出的IDC Report



大數據平臺典型部署架構

大數據平臺的典型部署架構,以往都是存儲和計算資源共用,例如Cloudera CDH的集群配置, 每個集群的工作節點都是YARN的計算節點和HDFS存儲節點。


 大家知道Hadoop的設計是來源于Google GFS,它包含分布式文件系統HDFS和分布式計算框架MapReduce, 構成HDFS的服務器集群通常是是機架式服務器,每個節點掛載多塊本地硬盤,這些節點同時又運行分布式計算任務。


在Hadoop剛推出的時代,服務器的網絡速度通常在100Mbps到1Gbps,海量的數據如果需要在服務器之間傳輸會很耗時,Hadoop上的分布式計算任務在處理海量數據時,為了避免大量耗時的網絡傳輸,就設計為盡量使用節點上本地硬盤中存儲的數據,而不是通過網絡訪問共享存儲的方式,這就帶來了存儲和計算綁定和共用的設計。


HDFS為了實現數據的高可用,將數據的每個單元(Block)保存多個副本(Replica),不同的副本保存在不同的節點上,分布式計算也同時切分為多個任務,每個任務都分配給在本地具有該數據副本的節點上去執行,這樣就大大減少了網路帶寬的使用,不需要頻繁將數據從一個節點傳輸到另一個節點。這個設計從Google發源到Hadoop生態圈的不斷發展成熟,帶來了我們現在的大數據時代。


Hadoop的這種架構設計在當時是一種突破,經過多年的發展,已經非常成熟,可以支持PB級別的數據處理,集群節點數量可以根據計算和存儲需求擴展,可以構建數千個節點的Hadoop集群,數據的讀取大都是在離數據副本最近的集群節點上,因此數據處理過程中的數據訪問非常快速和高效。


當然,這樣的架構的副作用是,Hadoop的用戶不能將計算和存儲分別擴展,通常Cloudera CDH擴容是通過添加相同配置的節點,同時擴充集群的計算和存儲資源。數據的多份副本也就意味著大量的數據冗余,并且數據處理計算時不能完全確保數據本地訪問,還是會有部分的資源開銷用于數據在網絡中傳輸,導致處理延遲。


近些年硬件的一個發展趨勢是CPU和網絡速度的增長遠快于存儲,數據中心通常有足夠的帶寬來用于數據的傳輸,而隨著數據量的增長到PB和EB級別,使用多份副本保存數據的機制造成的成本增加,反而使得計算和存儲綁定架構的實用性變差。從數據處理應用的角度,Spark, Flink等計算框架已替代MapReduce,不僅是批處理,流式處理等實時應用越來越普遍,數據也不再是靜態的,這些應用的I/O訪問模式和存儲需求需要新的架構去支持。


另一個發展趨勢是,虛擬化和容器技術帶來的靈活性和有效的資源利用,以及云計算這種資源即開即用的機制,使用物理機(Bare Mental)的部署方式不再適應這個趨勢,數據分析和數據科學團隊也需要大數據平臺能夠具備種靈活、敏捷、高效和低成本這些新的特征。




大數據平臺未來發展趨勢



計算和存儲分離將會是未來大數據平臺的發展趨勢,下面是幾個這方面的相關示例:


不同于MapReduce, 現在許多大數據查詢引擎都可以支持計算和存儲分離,例如Spark, Apache Drill, AWS Athena和Redshift,這些查詢引擎都具備將元數據持久化到編目中,如果數據在外部存儲中就通過引用的方式,而不是將其ETL到本地保存。


Hadoop開源生態圈和社區也已經開始擁抱計算和存儲分離,除HDFS之外,Hadoop還支持其他各種分布式存儲和云存儲,Amazon S3, Azure Blob, Alluxio, OpenStack Swift等。用戶可以在私用云或公有云上運行Hadoop的計算集群,連接共享存儲或云存儲,目前Cloudera CDH已支持Amazon S3, 部署在Amazon公有云上的CDH作為計算集群運行MapReduce或Spark任務,而數據存儲則使用Amazon S3作為共享存儲。


Hadoop 3.0版本中包含了糾刪碼(Erasure Code)功能,在不降低數據存儲高可用的基礎上減少數據存儲空間,這使Hadoop在計算和存儲分離機制的實現上前進了一步。糾刪碼這種數據保護技術是通過在原始數據中加入新的校驗數據,使各個部分的數據產生關聯性。在一定范圍的數據出錯情況下,通過糾刪碼技術都可以進行恢復。對比副本存儲的存儲效率,當默認副本為3個的話,存儲效率僅為33%,如果存放副本的3個有2個對應的磁盤損壞,數據不會丟失;使用糾刪碼(數據和校驗碼12:4)的情況下,存儲效率為75%,任意4個磁盤損壞不會丟失數據。


由此可見糾刪碼在存儲效率和數據可靠性上都比副本機制成倍提高。糾刪碼的數據編碼和解碼需要消耗CPU資源,Intel的Intelligent Storage Acceleration (ISA)通過CPU的特殊指令集可以實現編碼和解碼的硬件加速,可以將使用糾刪碼的額外CPU開銷幾乎可以忽略不計。


Cloudera CDH 6.x版本已經包含了糾刪碼功能,作為一種存儲選項,用戶可以將數據量大,但是訪問頻率較低的冷數據使用糾刪碼方式存儲,對應的冷數據集群和計算集群可以分別部署。


計算和存儲分離架構的主要優勢如下:


CPU和存儲可以分別擴容:用戶可以選擇合適的計算資源和存儲資源,當計算資源不夠時可以單獨添加,避免了計算和存儲共用方式可能造成的資源浪費。


集中存儲單份數據:通過計算和存儲分離,不同的計算集群,Hadoop HDFS, Spark, Cassandra, MongoDB或Tensorflow只需共享訪問同一個數據湖存儲,節省數據存儲的成本;用戶可以使用企業級的共享存儲提供持續一致的高性能服務,數據管理和數據安全也可以統一有效的管理。


賦能敏捷應用開發:通過企業級共享存儲提供的數據快照和內存復制功能,測試和開發可以快速和高效的使用相關數據。


混合云部署支持:計算和存儲分離架構可以讓用戶根據數據處理應用場景和實際計算、存儲要求選擇使用公有云和私有云的相關資源,例如在機器學習的數據探索階段,如果需要大量計算資源,可以使用公有云搭建計算集群,連接私有化部署的企業存儲,減少前期硬件資源投入。


簡單和靈活的軟件管理:大數據集群中各組件的版本使用和管理更加方便有效,共享存儲集群的HDFS版本通常使用穩定版本,計算集群的組件可以根據應用需求使用升級對應的版本。使用數據沙盒和容器技術,用戶可以動態創建各種類型的計算沙盒,如Spark, Flink, Tensorflow, Kafka, Apache Ignite, 關系型數據庫等,這些沙盒的計算資源需求可以根據需求創建,沙盒的底層框架基于Kubernetes和Docker容器,沙盒中的數據處理任務訪問共享存儲集群的HDFS,任務完成后,沙盒的計算資源就可以釋放并回收,另外其中的組件版本可以根據應用的需求獨立升級,互不影響。


企業用戶可以通過以下幾個階段逐步過渡到計算和存儲分離的平臺架構:


通過POC搭建計算和存儲分離的架構,并評估其敏捷性、靈活性、成本等各方面指標。


構建企業數據湖存儲集群,集中存放冷、熱數據,測試和使用Hadoop生態圈計算和存儲分離的技術和產品,包括公有云和私有云的各種類型架構部署,例如使用CDH 6.x版本中的EC,使用數據沙盒技術等等。


當條件成熟時,現有的計算和存儲綁定的平臺架構逐步遷移到新的存儲和計算分離的平臺架構,從而發揮其在敏捷性、靈活性、成本等方面的優勢。


未來新的大數據應用場景建議使用計算和存儲分離架構





參考文檔:

IDC Report: Five Benefits of Decoupling Compute and Storage for Big Data Deployments,

https://www.idc.com/getdoc.jsp?containerId=US43575418

Hadoop 3.0 and the Decoupling of Hadoop Compute From Storage,  

https://dzone.com/articles/hadoop-30-and-the-decoupling-of-hadoop-compute-fro





返回列表

相關推薦

讓我們了解您的需求

© 2018 Paraview Software. All rights reserved.

滬ICP備13029541號-1

服務熱線:400-6655-745
企業郵箱:[email protected]
辽宁麻将透视眼镜 10932622186120317432225475311249958357049973242953624125187106646680668975559495352400369417120648 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();