大數據計算技術秘史(上篇)

在之前的文章《2024 年,一個大數據從業者決定……》《存儲技術背后的那些事兒》中,我們粗略地回顧了大數據領域的存儲技術。在解決了「數據怎么存」之后,下一步就是解決「數據怎么用」的問題。

其實在大數據技術興起之前,對于用戶來講并沒有存儲和計算的區分,都是用一套數據庫或數據倉庫的產品來解決問題。而在數據量爆炸性增長后,情況就變得不一樣了。單機系統無法存儲如此之多的數據,先是過渡到了分庫分表這類偽分布式技術,又到了 Hadoop 時代基于分布式文件系統的方案,后來又到了數據庫基于一致性協議的分布式架構,最終演進為現在的存算分離的架構。

最近十幾年,Data Infra 領域的計算技術以及相關公司層出不窮,最終要解決的根本問題其實只有一個:如何讓用戶在既靈活又高效,架構既簡單又兼具高擴展性,接口既兼容老用戶習慣、又能滿足新用戶場景的前提下使用海量數據。

解讀一下,需求如下:

數據量大、數據種類多、數據邏輯復雜

支持 SQL 接口,讓習慣了 SQL 接口的 BI 老用戶們實現無縫遷移,同時要想辦法支持 AI 場景的接口——Python

交互式查詢延遲要低,能支持復雜的數據清洗任務,數據接入要實時

架構盡量簡單,不要有太多的運維成本,同時還能支持縱向、橫向的水平擴展,有足夠的彈性

據太可研究所(techinstitute)所知,目前市面上沒有哪款產品能同時滿足以上所有要求,如果有,那一定是騙人的。所以在計算領域誕生了眾多計算引擎、數據庫、計算平臺、流處理、ETL 等產品,甚至還有一個品類專門做數據集成,把數據在各個產品之間來回同步,對外再提供統一的接口。

不過,如果在計算領域只能選一個產品作為代表,那毫無疑問一定是 Spark。從 09 年誕生起到現在,Spark 已經發布至 3.5.0 版本,社區依舊有很強的生命力,可以說穿越了一個技術迭代周期。它背后的商業公司 Databricks 已經融到了 I 輪,估值 430 億💲,我們不妨沿著 Spark 的發展歷史梳理一下計算引擎技術的變革。

Vol.1

大數據計算的場景主要分兩類,一是離線數據處理,二是交互式數據查詢。離線數據處理的的特點產生的數據量大、任務時間長(任務時長在分鐘級甚至是小時級),主要對應數據清洗任務;交互式查詢的特點是任務時間短、并發大、輸出結果小,主要對應 BI 分析場景。

時間撥回 2010 年之前,彼時 Spark 還沒開源,當時計算引擎幾乎只有 Hadoop 配套的 MapReduce 可以用,早年間手寫 MapReduce 任務是一件門檻很高的事情。MapReduce 提供的接口非常簡單,只有 mapper、reducer、partitioner、combiner 等寥寥幾個,任務之間傳輸數據只有序列化存到 hdfs 這一條路,而真實世界的任務不可能只有 Word Count 這種 demo。所以要寫好 MapReduce 肯定要深入理解其中的原理,要處理數據傾斜、復雜的參數配置、任務編排、中間結果落盤等。現在 MapReduce 已經屬于半入土的技術了,但它還為業界留下了大量的徒子徒孫,例如各個云廠商的 EMR 產品,就是一種傳承。

Spark 開源之后為業界帶來了新的方案,RDD 的抽象可以讓用戶像正常編寫代碼一樣寫分布式任務,還支持 Python、Java、Scala 三種接口,大大降低了用戶編寫任務的門檻。總結下來,Spark 能短時間內獲得用戶的青睞有以下幾點:

更好的設計,包括基于寬窄依賴的 dag 設計,能大大簡化 job 編排

性能更高,計算在內存而非全程依賴 hdfs,這是Spark 早期最大的賣點,直到 Spark2.x 的官網上還一直放著一張和 mapreduce 的性能對比,直到這幾年沒人關心 mapreduce 之后才撤掉

更優雅的接口,RDD 的抽象以及配套的 API 更符合人類的直覺

API 豐富,除了 RDD 和配套的算子,還支持了Python 接口,這直接讓受眾提升了一個數量級

但早期的 Spark 也有很多問題,例如內存管理不當導致程序 OOM、數據傾斜問題、繼承了 Hadoop 那套復雜的配置。Spark 誕生之初非常積極地融入 Hadoop 體系,例如,代碼里依賴了大量 Hadoop 的包,文件系統和文件訪問接口沿用了 Hadoop 的設計,資源管理一開始只有 Hadoop 的 Yarn。直到現在這些代碼依舊大量使用,未來也不可能再做修改,所以說盡管 Hadoop 可能不復存在,但 Hadoop 的代碼會一直保留下去,在很多計算引擎里面發揮著不可替代的作用。

Vol.2

無論是非常難用的 MapReduce 接口,還是相對沒那么難用的 Spark RDD 接口,受眾只是研發人員,接口是代碼。

無論是做數據清洗的數據工程師,還是使用 BI 的數據分析師,最熟悉的接口還是 SQL。

因此,市面上便誕生了大量 SQL on Hadoop 的產品,很多產品直到現在也還很有生命力。

最早出現的是 Hive,Hive 的影響力在大數據生態里太大,大到很多人都以為它是 Hadoop 原生自帶的產品,不知道它是 Facebook 開源的。Hive 主要的能力只有一個就是把 SQL 翻譯成 MapReduce 任務,這件事說來簡單,好像也就是本科生大作業的水平,但想把它做好卻是件非常有挑戰性的工作,早期也只有 Hive 做到了,而且成為了事實上的標準。

要把 SQL 翻譯成 MapReduce 任務,需要有幾個必備組件,一是 SQL 相關的 Parser、Planner、Optimizer、Executor,基本上是一個 SQL 數據庫的標配,二是 metadata,需要存儲數據庫、表、分區等信息,以及表和 HDFS數據之間的關系。

alt 圖源|https://www.interviewbit.com/blog/hive-architecture/

Hive 的這套思路影響了后來眾多的計算引擎,例如 Spark SQL、Presto 等默認都會支持 Hive Metastore。Hive 的架構最大的瓶頸就在 MapReduce 上,無法做到低延遲的查詢,也就無法解決用戶低延遲、交互式分析的需求。有個很直觀的例子,每次用戶提交一個 Hive 查詢,可以去喝一杯咖啡再回來看結果。此外,哪怕是離線數據清洗的任務使用 Hive 也相對較慢。

Spark 在 2012 年發布的 0.8 版本中開發了 Spark SQL 模塊,類似 Hive 的思路,把 SQL 編譯成 RDD 任務,同時期的 Presto 也進入了 Apache 孵化器,目標也是解決大數據場景下交互式分析的場景。Spark 和 Presto 支持 SQL 的時間相仿,但后來走上了相當不同的道路,Presto 的定位更接近一個 OLAP 數據庫,重心在交互式查詢場景,而 Spark 則將注意力放在數據處理任務上,是一個開發分布式任務的框架,自始至終都不是一個完整的數據庫,市面上基于 Spark 開發的數據庫產品,倒是有不少。

通過 SQL 交互在 10 年代早期,逐漸變成了主流使用大數據產品的主流范式,包括離線任務、交互式查詢的接口都逐漸統一到了SQL。隨著數據量進一步增長,查詢性能一直解決得不好,哪怕是 Spark SQL、Presto,也只能把延遲降低到分鐘級別,還是遠遠無法滿足業務的需求。

這種情況直到 2015 年 Kylin 開源才得以解決,基于Cube、預計算技術第一次將大數據領域的交互式查詢延遲降低到了秒級,做到了和傳統數倉達類似的查詢體驗。但 kylin 的做法代價也很大,用戶需要自定義各種模型、Cube、維度、指標等等概念非常復雜,還要學會設計 rowkey 否則性能也不會很好。Kylin 的出現讓業界看到了秒級延遲的可能性,至此內業一些同學甚至覺得大數據場景下 Hadoop + Hive + Spark + Kylin + HBase 可能就是最優解了,頂多還需要加上 Kafka + Flink 去解決實時數據的問題。

但是,2018 年 Clickhouse 橫空出世,通過 SIMD、列存、索引優化、數據預熱等一系列的暴力優化,竟然也可把查詢延遲降低到秒級,而且架構極其簡單,只要 Zookeeper + Clickhouse,就能解決上面一堆產品疊加才可解決的問題。這一下子戳中了 Hadoop 體系的痛點——Hadoop 體系產品太多、架構太復雜、運維困難。

自 ClickHouse 后,數據庫產品們便開始瘋狂吸收其優秀經驗,大數據和數據庫兩個方向逐漸融合,業界重新開始思考「大數據技術真的需要單獨的一個體系嗎?」「Hadoop 的方向是對的嗎?」「數據庫能不能解決海量數據的場景?」這個話題有點宏大,可以放在以后討論。

Vol.3

說回計算引擎,早期的引擎無論是 Hive 也好,Spark 的 RDD 接口也罷,都不適合實時的數據寫入。而在大數據技術演進的這些年里,用戶的場景也越來越復雜。早期的離線計算引擎只能提供離線數據導入,這就使得用戶只能做 T+1 或近似 T+0 的分析。但很多場景需要的是實時分析,到現在,實時分析已經成為了新引擎的標配。

Spark 在 0.9 本版里提供了一套 Spark streaming 接口嘗試解決實時的問題,但扒開 Spark streaming 的代碼,不難發現它實際上是一段時間觸發一個微批任務,對于延遲沒那么敏感的用戶其實已經夠用了。當然也有想要近乎沒有延遲的用戶,例如金融交易監控、廣告營銷場景、物聯網的場景等。

實時流數據的難度要遠高于批處理,首先,如何做到低延遲就是個難點。其次,流數據本身質量遠低于批數據,具體體現在流數據會有亂序、數據丟失、數據重復的問題。此外,要做流處理還需要確保任務能長期穩定地運行,這與批處理任務跑完就結束對穩定性的要求很不一樣。最后,還有很復雜的數據狀態管理,包括 checkpoint 管理、增量更新、狀態數據一致性、持久化的問題。

Apache Flink 對這些問題解決的遠比 Spark streaming 要好,所以在很長時間內 Flink 就是流計算的代名詞。Spark 直到 2.0 發布了 structured streaming 模塊之后,才有了和 Flink 同臺競技的資格。Flink 雖然在流計算場景里是無可爭議的領導者,但在流計算的場景和市場空間遠小于離線計算、交互式分析的市場。可以這樣認為,其在數據分析領域錦上添花的功能而非必備能力,Flink 背后的團隊和 Databricks 差距也很大,曾創業兩次,又先后賣給阿里和 Confluent,這可能也是 Flink 的影響力遠小于 Spark 的原因。

好了,本次的大數據計算技術漫談(上)就先談到這里,下周同一時間,咱們繼續!

本文由 mdnice 多平臺發布

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696169.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react實現拖拽的插件

插件一:dnd-kit 插件官網鏈接https://docs.dndkit.com/introduction/installation 插件二:react-beautiful-dnd https://github.com/atlassian/react-beautiful-dnd/tree/master 兩個插件的區別: 插件一可以做到從區域A拖住到區域B 插件二…

平臺組成-門戶服務

整體是從用戶視角,從外往內介紹。前面講了平臺的幾個模塊(就是前端部署包)。今天開始介紹后臺服務(微服務,SpringCloud,通過-jar 參數啟動的jar包)。 門戶服務完成登錄、注冊、界面配置、功能鏈…

java面試JVM虛擬機篇

1 JVM組成 1.1 JVM由那些部分組成,運行流程是什么? 難易程度:☆☆☆ 出現頻率:☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的運行環境(java二進制字節碼的運行環境) 好處: 一次編寫&a…

Go 原子操作有哪些?

Go atomic包是最輕量級的鎖(也稱無鎖結構),可以在不形成臨界區和創建互斥量的情況下完成并發安全的值替換操作,不過這個包只支持int32/int64/uint32/uint64/uintptr這幾種數據類型的一些基礎操作(增減、交換、載入、存…

Excel之index、MATCH面試題、VLOOKUP函數,

VLOOKUP() 在表格的首列查找指定的數值,并返回表格當前行中指定列處的數值。 結構:VLOOKUP(查找值,查找區域,列序數,匹配條件) 解釋:VLOOKUP(找誰,在哪里找,第幾列,0或1) 1.目的:根據【產品】查找【銷量】 公式:V…

pikachu靶場-XSS

XSS: XSS(跨站腳本)概述 Cross-Site Scripting 簡稱為“CSS”,為避免與前端疊成樣式表的縮寫"CSS"沖突,故又稱XSS。一般XSS可以分為如下幾種常見類型: 1.反射性XSS; 2.存儲型XSS; 3.DOM型XSS; …

QT的UI入門

二、UI入門 QWidget類(熟悉) QWidget類是所有組件和窗口的基類,內部包含了一些基礎的界面特性。 常用屬性: 修改坐標 x : const int 橫坐標,每個圖形的左上角為定位點,橫軸的零點在屏幕的最左邊&#xff0c…

js實現復制功能

一、具體場景 前端有時需要實現點擊按鈕復制的功能,這個時候就不能讓用戶去手動選擇內容右鍵復制了。 二、實現方式 1. document.execCommand (1)具體實現 復制時,先選中文本,然后調用document.execCommand(‘copy’)…

171基于matlab的隨機共振微弱信號檢測

基于matlab的隨機共振微弱信號檢測,隨機共振描述了過阻尼布朗粒子受周期性信號和隨機噪聲的共同作用下,在非線性雙穩態系統中所發生的躍遷現象. 隨機共振可用于弱信號的檢測。程序已調通,可直接運行。

共享之力:分布式計算的奇跡

在信息時代的浪潮中,分布式計算作為一種革命性的技術,已經深刻地改變了我們對計算和數據處理的理解方式。其發展歷程既是一段精彩的科技史,也是一段充滿探索與突破的冒險故事,從最初的概念探索到如今的普及應用,分布式…

HashMap 源碼學習-jdk1.8

1、一些常量的定義 這里針對MIN_TREEIFY_CAPACITY 這個值進行解釋一下。 java8里面,HashMap 的數據結構是數組 (鏈表或者紅黑樹),每個數組節點下可能會存在鏈表和紅黑樹之間的轉換,當同一個索引下面的節點超過8個時…

【Webpack】處理字體圖標和音視頻資源

處理字體圖標資源 1. 下載字體圖標文件 打開阿里巴巴矢量圖標庫open in new window選擇想要的圖標添加到購物車,統一下載到本地 2. 添加字體圖標資源 src/fonts/iconfont.ttf src/fonts/iconfont.woff src/fonts/iconfont.woff2 src/css/iconfont.css 注意字體…

[計算機網絡]---TCP協議

前言 作者:小蝸牛向前沖 名言:我可以接受失敗,但我不能接受放棄 如果覺的博主的文章還不錯的話,還請點贊,收藏,關注👀支持博主。如果發現有問題的地方歡迎?大家在評論區指正 目錄 一 、TCP協…

Java并發基礎:原子類之AtomicBoolean全面解析

本文概要 AtomicBoolean類優點在于能夠確保布爾值在多線程環境下的原子性操作,避免了繁瑣的同步措施,它提供了高效的非阻塞算法實現,可以大大提成程序的并發性能,AtomicBoolean的API設計非常簡單易用。 AtomicBoolean核心概念 …

P1024 [NOIP2001 提高組] 一元三次方程求解

P1024 [NOIP2001 提高組] 一元三次方程求解 純代碼記錄 #include <iostream> #include <math.h> using namespace std; double a,b,c,d; double res[3];//用于存放三個解 int resCount;inline double F(double x)//三次函數 {return a*pow(x,3)b*pow(x,2)c*xd; }//…

web前端開發this指向問題

? 函數內部中的 this 指向誰&#xff0c;不是在函數定義時決定的&#xff0c;而是在函數第一次調用并執行的時候決定的 1. call 方法 語法&#xff1a;函數名.call(調用者, 參數1, …) 作用&#xff1a;函數被借用時&#xff0c;會立即執行&#xff0c;并且函數體內的this會…

Facebook Horizon:探索虛擬現實中的社交空間

隨著科技的不斷進步&#xff0c;虛擬現實&#xff08;VR&#xff09;技術正成為社交互動和娛樂體驗的新前沿。在這個數字時代&#xff0c;Facebook作為全球最大的社交媒體平臺之一&#xff0c;正在引領虛擬社交的新時代&#xff0c;其推出的虛擬社交平臺Facebook Horizon成為了…

Tomcat線程池原理(下篇:工作原理)

文章目錄 前言正文一、執行線程的基本流程1.1 JUC中的線程池執行線程1.2 Tomcat 中線程池執行線程 二、被改造的阻塞隊列2.1 TaskQueue的 offer(...)2.2 TaskQueue的 force(...) 三、總結 前言 Tomcat 線程池&#xff0c;是依據 JUC 中的線程池 ThreadPoolExecutor 重新自定義…

深入理解C語言(5):程序環境和預處理詳解

文章主題&#xff1a;程序環境和預處理詳解&#x1f30f;所屬專欄&#xff1a;深入理解C語言&#x1f4d4;作者簡介&#xff1a;更新有關深入理解C語言知識的博主一枚&#xff0c;記錄分享自己對C語言的深入解讀。&#x1f606;個人主頁&#xff1a;[?]的個人主頁&#x1f3c4…

Imagewheel私人圖床搭建結合內網穿透實現無公網IP遠程訪問教程

文章目錄 1.前言2. Imagewheel網站搭建2.1. Imagewheel下載和安裝2.2. Imagewheel網頁測試2.3.cpolar的安裝和注冊 3.本地網頁發布3.1.Cpolar臨時數據隧道3.2.Cpolar穩定隧道&#xff08;云端設置&#xff09;3.3.Cpolar穩定隧道&#xff08;本地設置&#xff09; 4.公網訪問測…