基于 Spark 實現 COS 海量數據處理

上周在組內分享了一下這個主題, 我覺得還是摘出一部分當文章輸出出來
分享主要包括三個方面: 1. 項目背景 2.Spark 原理 3. Spark 實戰
項目背景
主要是將海量日志進行多維度處理;
項目難點
1、數據量大(壓縮包數量 6TB,60 億條數據);
2、在 cos 上的目錄不固定;
3、計算方式復雜,各種過濾、聚合、匯總邏輯;
4、處理時間有限,需在 4h 內完成;
基于上述的項目背景和難點, 最終決定采用 Spark,首先數據量大及計算方式復雜, 如果使用傳統的服務方式, 需要大量的服務器資源, 而目錄不固定, 使數據讀取變的復雜, 且普通服務不太可能在 4h 內處理完畢; 綜合考慮決定使用 Spark。
那么就要講講Spark 是什么, 以及在這些挑戰中的優勢了
Apache Spark
快速、通用、可擴展的大數據引擎;
優勢:
1、快速: Spark 可以中集群中并行處理數據, 重復利用多臺機器的計算能力,顯著提高處理速度, 對于我們的大數據量場景尤為重要;
2、易于使用的 API, 支持 Java、Python、Scala API; Spark 原生只支持 Scala 和 Java,僅中外圍包裝通過 PySpark 中間件實現對 Python 語言的支持;
3、通用:提供多種計算模型,如: 批處理、交互式查詢(Spark SQL)、實時流處理、機器學習、圖計算等,可以靈活應對復雜的計算需求;
4、靈活: 支持多種數據源,如 HDFS、COS、Kafka、HBase 像我們的數據存儲在 COS 上, 是可以直接讀取 COS 目錄, 且對于不確定路徑, 可以直接使用* 代替,Hadoop-COS實現了以騰訊云 COS 作為底層文件系統運行上層計算任務的功能,支持使用Hadoop、Spark以及Tez等處理存儲在騰訊云COS對象存儲系統上的數據,地址如下:
https://github.com/tencentyun/hadoop-cos
Spark 架構
在這里插入圖片描述
前面了解了 Spark 是什么, 這里講一下 Spark 的架構
1、Driver是spark應用程序入口,是spark核心,負責spark集群的鏈接和資源管理。
2、ClusterManager負責所有Executor的資源管理和調度,Spark可以與多種集群管理器配合使用, 比如yarn k8s。

3、Executor 負責具體作業計算任務。

當我們提交一個任務開始執行時,是如何作業的:

1、啟動 Driver 程序,會解析編寫的程序,并序列化字節級別代碼, 通過 SparkSession 的一個成員變量: SparkContext 向Cluster Manager 發出命令,Cluster Manager 會將當前的資源情況分配合適的資源給 Driver。

2、 Drvier 的字節級別代碼會分發至將要執行的 Executor 上, 這些計算過程實際上是在每個節點本地計算并完成,每個spark會在集群中有一個或多個Executor,Executor 之間也可能會有數據的傳輸,比如一些聚合函數執行。

3、一旦整個執行過程完成,Driver 收集所有 Executor 返回的結果, 結束整個作業,同時像 ClusterManager 釋放資源。

4、在整個過程中,Cluster Manager 扮演了資源管理和任務調度的關鍵角色。它確保了 Spark 作業能夠高效地利用集群資源,調度任務到合適的 Executor 上執行,從而實現分布式計算的優勢。

通過這種方式, Spark 可以高效利用集群資源, 實現大規模數據的分布式處理

Spark 核心組件

在這里插入圖片描述
1、Spark Core是Spark基礎,提供內存計算能力, 是分布式處理大數據的基礎,它將分布式數據抽象為彈性分布式數據集(RDD),并為運行在其上的上層組件提供 API。所有 Spark 的上層組件都建立在 Spark Core 的基礎之上。

2、Spark Streaming 是一個用于處理動態數據流的 Spark 組件。它能夠開發出強大的交互和數據查詢程序。在處理動態數據流時,流數據會被分割成微小的批處理,這些微小批處理將會在 Spark Core 上按時間順序快速執行。

3、Spark SQL 是一個用于處理結構化數據的 Spark 組件。它允許使用 SQL 語句查詢數據。Spark 支持多種數據源,包括 Hive 表、Parquet 和 JSON 等。

Spark 核心數據結構

在這里插入圖片描述
前面我們帶過 rdd, rdd 全稱為彈性分布式數據集, 是 spark 的核心數據結構,一個不可變的分布式對象集合,

雖然名字帶了分布式,但是在使用的時候,是感受不到分布式,就跟操作本地數據集一樣操作在分布式存儲中的數據。

RDD 特性有三種:

1、彈性

容錯分兩部分: 1> 機器層面的容錯, 節點出錯自動重試, 2>RDD層面的容錯;也就是血統, rdd 的依賴關系, 有寬依賴和窄依賴, 可以通過血統信息重新計算丟失的分區,而不需要重新計算整個RDD;但是當計算邏輯復雜時,就會引起依賴鏈過長,重算代價就很高,可以適當使用rdd檢查點;

2、分布式

數據分布在集群的多個節點上,RDD的分區(partition)是指將數據集劃分成多個部分,以便在集群中的不同節點上并行處理。分區數與集群中的節點數無關,很可能集群中的單個節點有幾個數據分區。

3、不可變性

Rdd只能基于在穩定物理存儲中的數據集和其他已有的rdd上執行確定性操作來創建。

RDD 支持操作
在這里插入圖片描述
rdd支持兩種

1、轉換,從現有數據集創建一個新的數據集:如map將數據集每個元素傳遞給函數,返回一個新的分布式數據集表示結果。

RDD的所有轉換都是惰性的, 也就是說并不會直接計算,他們只是記住這些應用到基礎數據集(比如一個文件)的轉換動作, 只有當發生一個要求返回結果給Driver的動作, 才會真正執行; 比如map創建一個新數據集,并在reduce中使用,最終只返回reduce的結果給Driver,而不是整個大的新數據集。

這樣Spark就可以了解所有執行的算子, 從而設定并優化執行計劃。

2、動作: 如reduce 將所有元素疊加起來,將最終結果返回給Driver

轉換算子返回的還是RDD,但是行動算子返回的是非RDD類型值,比如整數,或者無返回值

RDD 依賴關系

1、窄依賴

每一個parent RDD的Partition最多被子RDD的一個Partition使用

2、寬依賴(也稱Shuffle依賴)

多個子RDD的Partition會依賴同一個parent RDD的Partition

Shuffle 是指在分布式計算過程中,數據在不同的分區之間重新分配的過程。Shuffle 通常發生在需要跨分區進行數據交換的操作中,例如 groupByKey、reduceByKey、join 等。這些操作需要將數據從一個分區移動到另一個分區,以便進行合并或聚合

在書上截的一個圖, 還是很清晰的:
在這里插入圖片描述
RDD 邏輯計算圖
在這里插入圖片描述
這里結合我們的項目背景: 萬象圖片請求數據, 對海量日志進行多維度處理、計算、分析,我們來了解一下 rdd 的邏輯計算

我們的日志都是以壓縮包的方式,json 的格式存儲在 cos 上; 首先從 cos讀取出來的數據也就是第一步創建 RDD,其中解析 json,確定 key 以及 filter 過濾邏輯, 是 RDD 的轉換操作;

轉換完成后,進行按桶粒度聚合或者統計,是action動作,生成運算結果, 轉換和執行在Executor上操作的;

每個Executor處理其中的一部分RDD,最終將執行結果又寫回 COS 上;

RDD 緩存

在這里插入圖片描述
Spark 速度非常快的原因之一就是 RDD 緩存。

我們看右側的這個圖, 以場景來說明:

RDD0 過濾生成RDD1, 在RDD1基礎上, 進行不同的聚合計算, 常規情況下, 要做兩次filter;

首先進行了RDD0→RDD1→RDD2的計算作業,那么計算結束時,RDD1就已經緩存在系統中了。在進行RDD0→RDD1→RDD3的計算作業時,由于RDD1已經緩存在系統中,因此RDD0→RDD1的轉換不會重復進行,計算作業只須進行RDD1→RDD3的計算就可以了,因此計算速度可以得到很大提升

所以在不同操作中在內存中持久化(或緩存)一個RDD后,每個節點就將計算的分片結果保存在內存中,對次數據集進行的其他操作中重用。

緩存有可能丟失, 或者基于內存的數據由于內存不足被刪除, RDD的緩存機制,保證了即使緩存丟失也能保證計算的正確執行。

Spark 配置及調優
在這里插入圖片描述
先講資源配置:

Executor.memory: 設置過大, 部分任務分配到資源等待, 設置過小,頻繁gc,影響性能;

Executor-cores: 每個Executor可以使用的cpu核心數每個Executor可以并行執行多個任務,核心數越多,Executor的并行處理能力越強。
在這里插入圖片描述
在代碼中的一些使用: 數據處理優化;

數據分區設置: 分區數決定了數據集被劃分成多少個部分,影響到并行度和任務調度。過多: 上下文頻繁切換;過少,并行度不足,任務處理數據量大,影響作業完成時間;

那么如何合理設置分區數:

分區數應根據數據量和集群的計算資源來設置。一個常見的經驗法則是每個分區的數據量在 128MB 到 256MB 之間。在實際運行中,監控作業的執行情況,觀察任務的執行時間、資源利用率等指標,根據實際情況進行調整。

數據傾斜:數據傾斜會導致某些任務處理數據量過大, 以reduceByKey 和groupByKey 為例:

1> 內存使用

groupByKey 會將所有具有相同鍵的值聚集到一個列表中,這可能會導致大量的數據在內存中存儲,尤其是當某個鍵的值非常多時。這可能會導致內存溢出或性能下降。

reduceByKey 在每個分區內先進行局部聚合(即在每個分區內對相同鍵的值進行合并),然后再將結果發送到 reducer。這種方式減少了需要傳輸的數據量,從而降低了內存使用和網絡傳輸的開銷。

2> 網絡傳輸

groupByKey 會將所有相同鍵的值發送到同一個節點,這可能會導致大量的數據在網絡中傳輸。

reduceByKey 通過在每個分區內進行局部合并,減少了需要在網絡中傳輸的數據量,從而提高了性能。

緩存: 將常用數據進行緩存,緩存有幾種形式, 比如都放內存中, 可以選擇節省空間的級別,序列化對象等多種級別。
在這里插入圖片描述
1> 比如在使用filter算子后,通常數據會被打碎成很多個小分區,這會影響后面的執行操作,可以先對后面的數據用coalesce算子進行一次合并。

2>像在實際處理cos 文件, 文件只有幾十 k,但是十幾萬的數據, 光遍歷讀 COS 就需要 1h+, 處理加工只需要 30min;

到這里, 就結束了!

附錄 COS 使用 demo:

https://cloud.tencent.com/document/product/436/79146

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

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

相關文章

Unity3D 屏幕點擊特效

實現點擊屏幕任意位置播放點擊特效。 屏幕點擊特效 需求 現有一個需求,點擊屏幕任意位置,播放一個點擊特效。 美術已經做好了特效,效果如圖: 特效容器 首先,畫布是 Camera 模式,畫布底下有一個 UIClic…

MCU編程

MCU 編程基礎:概念、架構與實踐 一、什么是 MCU 編程? MCU(Microcontroller Unit,微控制器) 是將 CPU、內存、外設(如 GPIO、UART、ADC)集成在單一芯片上的小型計算機系統。MCU 編程即針對這些…

Go語言--語法基礎6--基本數據類型--數組類型(1)

Go 語言提供了數組類型的數據結構。 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的 原始類型例如整型、字符串或者自定義類型。相對于去聲明number0,number1, ..., and number99 的變量,使用數組形式 numbers[0], …

左神算法之給定一個數組arr,返回其中的數值的差值等于k的子數組有多少個

目錄 1. 題目2. 解釋3. 思路4. 代碼5. 總結 1. 題目 給定一個數組arr,返回其中的數值的差值等于k的子數組有多少個 2. 解釋 略 3. 思路 直接用hashSet進行存儲,查這個值加上k后的值是否在數組中 4. 代碼 public class Problem01_SubvalueEqualk {…

自回歸(AR)與掩碼(MLM)的核心區別:續寫還是補全?

自回歸(AR)與掩碼(MLM)的核心區別:用例子秒懂 一、核心機制對比:像“續寫”還是“完形填空”? 維度自回歸(Autoregressive)掩碼語言模型(Masked LM)核心目標根據已生成的token,預測下一個token(順序生成)預測句子中被“掩碼”的token(補全缺失信息)輸入輸出輸入…

后端開發兩個月實習總結

前言 本人目前在一家小公司后端開發實習差不多兩個月了,現在準備離職了,就這兩個月的實習經歷寫下這篇文章,既是對自己實習的一個總結,也是給正在找實習的小伙伴以及未來即將進入到后端開發這個行業的同學的分享一下經驗。 一、個…

Python基礎(??FAISS?和??Chroma?)

??1. 索引與查詢性能? ??指標????FAISS????Chroma????分析????索引構建速度??72.4秒(5551個文本塊)91.59秒(相同數據集)FAISS的底層優化(如PQ量化)加速索引構建,適合批…

Windows下memcpy_s如何在Linux下使用

Windows下代碼如下 memcpy_s(pLine->ppBuf[i], m_ColorLineByte, pIn nOffset, m_ColorLineByte); 方案 1:使用標準 memcpy 手動檢查(最通用) // 檢查參數有效性 if (pLine->ppBuf[i] nullptr || pIn nullptr || m_ColorLi…

2025年數學算法與自動化控制國際會議(ICMAAC 2025)

2025年數學算法與自動化控制國際會議(ICMAAC 2025) 2025 International Conference on Mathematical Algorithms and Automation Control 一、大會信息 會議簡稱:ICMAAC 2025 大會地點:中國長沙 審稿通知:投稿后2-3日…

C語言數組介紹 -- 一維數組和二維數組的創建、初始化、下標、遍歷、存儲,C99 變長數組

目錄 1. 一維數組 1.1 數組的概念 1.2 一維數組的創建 1.3 一維數組的初始化 1.4 數組的類型 1.5 數組下標 1.5.1 數組元素的遍歷 1.5.2 數組的輸入 1.6 一維數組在內存中的存儲 1.7 sizeof 計算數組元素個數 2. 二維數組 2.1 二維數組的創建 2.2 二維數組的初始…

SpringAI + DeepSeek大模型應用開發 - 進階篇(上)

三、SpringAI 2. 哄哄模擬器 2.1 提示詞工程 提示詞工程(Prompt Engineering):通過優化提示詞,使大模型生成盡可能理想的內容,這一過程就叫提示詞工程。 (1)清晰明確的指令 談談人工智能 …

Spring Boot實現異常處理

Spring Boot 提供了多種靈活的方式實現異常處理,以下是核心方案和最佳實踐: 一、基礎異常處理方案 1. ControllerAdvice ExceptionHandler(全局處理) ControllerAdvice public class GlobalExceptionHandler {// 處理特定異常&…

【目標檢測】IOU的概念與Python實例解析

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Vue2中如何使用vue-print-nb打印功能

插件官網地址&#xff1a;vue-print-nb - npm 1.安裝 npm install vue-print-nb --save 2.導入打印插件 //main.js import Print from vue-print-nb Vue.use(Print); 3.配置參數 4.頁面使用 <div id"printDiv">打印內容</div><el-button v-print&…

Matplotlib快速入門

目錄 基本使用 解決中文亂碼 一個坐標系繪制多個圖像 多個坐標系繪制 基本使用 什么是Matplotlib 是專門用于開發2D圖表(包括3D圖表)以漸進&#xff0c;交互式方式實現數據可視化 為什么要學習matplotlib 可視化是在整個數據挖掘的關鍵輔助工具&#xff0c;可以清晰的理解…

扣料不允許‘貨物移動’

遇到了報錯&#xff0c;不允許貨物移動 以為又是和之前一樣是訂單已經關閉&#xff0c;看是領錯料還是財務誤關的原因&#xff0c;但是co03一看訂單狀態并沒有關閉 原因就是這個CRTD 訂單只是創建了&#xff0c;但是沒有下達 找個正常的看看&#xff1a; 一般訂單創建和下達都…

【AI】全新AI測試系列之二--------AI自動化測試,提高測試效率

目錄 一、自動化測試 1、與手動測試對比 2、自動化測試流程 二、自動化測試環境搭建 三、web自動化使用AI的兩種方式 1、利用DeepSeek快速生成腳本 2、pycharm集成通義靈碼 四、通義靈碼實戰 1、使用提示詞生成代碼 2、使用pytest框架 前言&#xff1a;上一章節只要是…

npm包沖突install失敗

--legacy-peer-deps是npm&#xff08;Node.js包管理器&#xff09;的一個命令行選項&#xff0c;主要用于解決依賴沖突問題。當安裝依賴時&#xff0c;npm默認會嚴格檢查peer dependencies&#xff08;對等依賴&#xff09;的版本兼容性&#xff0c;可能導致安裝失敗。啟用此選…

68、數據訪問-crud實驗-刪除用戶完成

68、數據訪問-crud實驗-刪除用戶完成 以下是完成“數據訪問-CRUD實驗-刪除用戶”功能的一般步驟&#xff0c;以常見Web應用框架&#xff08;如Spring Boot MyBatis-Plus、Django、Ruby on Rails&#xff09;為例&#xff1a; #### 準備工作 - **數據庫表設計**&#xff1a;確…

實現 TurtleBot3 多點軌跡跟蹤導航

系統架構 move_base本身不支持一次性發送多個目標點并自動按順序導航,使用nav_msgs/Path消息類型發布多個路徑點,然后讓機器人按順序依次到達每個路徑點。 發布一個包含多個路徑點的Path消息(可選,用于在RVIZ中顯示路徑)。按順序將每個路徑點作為MoveBaseGoal發送給move_…