大數據面試之路 (一) 數據傾斜

記錄大數據面試歷程

數據傾斜

?大數據崗位 ,數據傾斜面試必問的一個問題。

一、數據傾斜的表現與原因

  1. 表現

    • 某個或某幾個Task執行時間過長,其他Task快速完成。

    • Spark/MapReduce作業卡在某個階段(如reduce階段),日志顯示少數Task處理大量數據。

    • 資源利用率不均衡(如CPU、內存集中在某些節點)。

  2. 常見場景

    • Key分布不均:如某些Key對應的數據量極大(如用戶ID為空的記錄、熱點事件)。

    • 數據分區策略不合理:Hash分區時Key沖突,或Range分區時范圍劃分不均衡。

    • 業務邏輯導致傾斜:如大表Join小表時小表廣播失敗,或笛卡爾積操作。

二、檢測數據傾斜的方法?

  1. 日志分析

    • 查看任務執行時間分布(如Spark UI的Stage詳情)。

    • 檢查Shuffle讀寫數據量(如Shuffle Read/Write Records)。

  2. 抽樣統計

    • 對Key進行采樣,統計Top N高頻Key(如用countByKeysample)。

  3. 監控工具

    • 使用Ganglia、Prometheus等監控節點資源負載。

三、通用解決方案

1. 預處理:過濾或隔離傾斜數據

  • 過濾異常Key:直接刪除無意義的傾斜Key(如空值、測試數據)。

  • 分離熱點數據:將高頻Key單獨處理,與非傾斜數據合并結果。

-- 示例:將熱點用戶的行為日志單獨處理
SELECT * FROM logs WHERE user_id = 'hot_user' -- 單獨處理
UNION ALL
SELECT * FROM logs WHERE user_id != 'hot_user' -- 正常處理?

?2. 調整Key分布

?增加隨機前綴(Salting):對Key添加隨機數,分散數據到不同分區。

# Spark示例:對傾斜Key添加隨機前綴
skewed_rdd = rdd.map(lambda x: (x[0] + "_" + str(random.randint(0, 9)), x[1]))?

?兩階段聚合

  1. 對Key加隨機前綴,局部聚合;

  2. 去掉前綴,全局聚合。

3. 優化Shuffle過程?

  • 提高并行度:增加分區數(如spark.sql.shuffle.partitions=2000)。

  • 使用Combiner:在Map端預聚合(如ReduceByKey替代GroupByKey)。

  • 廣播小表:在Join時,將小表廣播到所有Executor,避免Shuffle。

4. 使用特定框架優化?

  • Spark AQE(Adaptive Query Execution)
    Spark 3.0+ 支持動態合并傾斜分區(spark.sql.adaptive.skewJoin.enabled=true)。

  • Flink KeyBy前加鹽:類似Spark的隨機前綴方法。

  • Hive參數調優
    set hive.map.aggr=true;?(Map端聚合)
    set hive.groupby.skewindata=true;?(生成兩個MR Job分散負載)。

?四、場景化解決方案

?場景1:Join操作傾斜

?方案1:將小表廣播

-- Spark SQL廣播Join
SELECT /*+ BROADCAST(small_table) */ *?
FROM big_table JOIN small_table ON big_table.key = small_table.key;?

?方案2:拆分傾斜Key

若大表和大表Join且某些Key傾斜:

  1. 提取傾斜Key單獨Join;

  2. 非傾斜Key正常Join;

  3. 合并結果

場景2:Group By/Aggregation傾斜?

方案:兩階段聚合(加鹽與去鹽?

-- 第一階段:對Key加隨機后綴,局部聚合
SELECT key || '_' || suffix AS salted_key, SUM(value)?
FROM table?
GROUP BY key || '_' || suffix;

-- 第二階段:去除后綴,全局聚合
SELECT REPLACE(salted_key, '_*', '') AS key, SUM(sum_value)?
FROM temp_table?
GROUP BY REPLACE(salted_key, '_*', '');

?場景3:數據源傾斜

方案:調整文件分區?

  • 寫入數據時使用合理的分區策略(如按時間+哈希混合分區)。

  • 對小文件合并,對大文件拆分。

五、預防數據傾斜的設計原則?

  1. 合理選擇分區鍵:避免選擇基數低或分布不均的字段。

  2. 數據預分析:ETL階段提前統計Key分布,識別潛在傾斜。

  3. 動態調整:利用AQE(自適應查詢執行)等自動化優化機制。

?面試回答示例

問題:如何處理Spark作業中的數據傾斜?
回答

  1. 定位傾斜:通過Spark UI查看Stage中Task的數據量分布,找到傾斜的Key。

  2. 過濾無效數據:如刪除空Key或異常值。

  3. 調整Key分布:對傾斜Key加隨機前綴,分兩階段聚合。

  4. 優化Shuffle:提高shuffle.partitions,使用廣播Join。

  5. 框架特性:開啟Spark AQE,自動合并傾斜分區。

  6. 舉例:在最近的項目中,某用戶行為日志的UserID存在熱點,通過加鹽將原本集中在1個分區的數據分散到10個分區,作業時間從2小時縮短至15分鐘。

數據傾斜調優?

更多信息請參?阿里云幫助中心?

?數據傾斜調優_云原生大數據計算服務 MaxCompute(MaxCompute)-阿里云幫助中心

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

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

相關文章

僅僅使用pytorch來手撕transformer架構(3):編碼器模塊和編碼器類的實現和向前傳播

僅僅使用pytorch來手撕transformer架構(2):編碼器模塊和編碼器類的實現和向前傳播 往期文章: 僅僅使用pytorch來手撕transformer架構(1):位置編碼的類的實現和向前傳播 最適合小白入門的Transformer介紹 僅僅使用pytorch來手撕transformer…

《OpenCV》—— dlib(換臉操作)

文章目錄 dlib換臉介紹仿射變換在 dlib 換臉中的應用 換臉操作 dlib換臉介紹 dlib 換臉是基于 dlib 庫實現的一種人臉替換技術,以下是關于它的詳細介紹: 原理 人臉檢測:dlib 庫中包含先進的人臉檢測器,如基于 HOG(方向…

機器學習中的梯度下降是什么意思?

梯度下降(Gradient Descent)是機器學習中一種常用的優化算法,用于最小化損失函數(Loss Function)。通過迭代調整模型參數,梯度下降幫助模型逐步逼近最優解,從而提升模型的性能。 1.核心思想 梯…

三、Docker 集群管理與應用

(一)項目案例 1、準備主機 (1)關閉防火墻,或者開放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于節點之間的通信)、UDP端口4789(用于overlay網絡流…

網絡DNS怎么更改?

訪問速度慢或某些網站無法打開?改變網絡DNS設置可能會幫助解決這些問題。本文將詳細介紹如何更改網絡DNS,包括更改的原因、具體步驟。 一、為什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考慮因素:某些公共DNS服務器的響應速度比…

江科大51單片機筆記【12】DS18B20溫度傳感器(上)

寫在前言 此為博主自學江科大51單片機(B站)的筆記,方便后續重溫知識 在后面的章節中,為了防止篇幅過長和易于查找,我把一個小節分成兩部分來發,上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論…

基于springboot+vue的佳途旅行分享預約平臺

一、系統架構 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 環境:jdk1.8 | mysql | maven | node 二、代碼及數據庫 三、功能介紹 01. web端-注冊 02. web端-登錄 03. web端-系統主頁1 04. web端-系統主頁2 05. we…

【數據結構】2算法及分析

0 章節 1.4到1.5小節。 掌握算法概念、特性、描述、算法性能時間復雜度和空間復雜度; 理解遞歸含義? 掌握實現遞歸的條件和時機; 應用簡單遞歸問題的算法設計; 重點 算法…

【一起學Rust | Tauri2.0框架】基于 Rust 與 Tauri 2.0 框架實現軟件開機自啟

文章目錄 前言 一、準備工作1.1 環境搭建1.2 創建 Tauri 項目1.3 添加依賴 二、實現開機自啟的基本原理2.1 開機自啟的基本概念2.2 Tauri 應用的生命周期 三、Windows 平臺實現3.1 Windows 注冊表機制3.2 實現步驟3.3 注意事項 四、Linux 平臺實現4.1 Linux systemd 服務4.2 實…

一周熱點-OpenAI 推出了 GPT-4.5,這可能是其最后一個非推理模型

在人工智能領域,大型語言模型一直是研究的熱點。OpenAI 的 GPT 系列模型在自然語言處理方面取得了顯著成就。GPT-4.5 是 OpenAI 在這一領域的又一力作,它在多個方面進行了升級和優化。 1 新模型的出現 GPT-4.5 目前作為研究預覽版發布。與 OpenAI 最近的 o1 和 o3 模型不同,…

css中的浮動

在 CSS 中,浮動(float)是一種定位元素的方式,它允許元素脫離正常的文檔流,并向左或向右移動,直到其邊緣碰到包含塊或者另一個浮動元素的邊緣。下面從多個方面詳細介紹 CSS 浮動: 一&#xff0c…

element-plus中form表單組件的使用

1.如何讓每個表單項對齊? 問題描述:如下圖,每個表單項的輸入框/下拉框/日期選擇器是沒有對齊的,我們希望它們縱向是對齊的。 解決方案:給el-form標簽,加上label-width"100px"即可。意思就是給每個…

線性搜索算法

何時使用線性搜索算法? 當處理一個小數據集時。當搜索存儲在連續內存中的數據集時。 線性搜索算法在什么情況下優于其他搜索算法? 當列表或數組未排序時,或者當輸入的大小相對較小時,首選線性搜索算法。它易于實現,并…

踩坑記錄:yolov5環境版本要求比較嚴苛?

在安裝yolov5環境時,numpy安裝失敗報錯metadata-generation-failed 報錯如下: Collecting numpy1.18.5 (from -r /*****/yolov5-5.0/requirements.txt (line 5))Using cached https://pypi.tuna.tsinghua.edu.cn/packages/01/1b/d3ddcabd5817be02df0e6…

Java設計模式系列:單例模式的7種實現與適用場景

一、單例模式核心價值與實現原則 1. 使用場景 全局配置類(如數據庫連接池)日志記錄器Spring默認Bean作用域硬件設備訪問(如打印機)2. 設計三原則 私有構造器:禁止外部實例化靜態實例持有:全局唯一訪問點延遲加載(可選):避免資源浪費二、七種單例實現方式深度解析 1.…

OpenManus-通過源碼方式本地運行OpenManus,含踩坑及處理方案,chrome.exe位置修改

前言:最近 Manus 火得一塌糊涂啊,OpenManus 也一夜之間爆火,那么作為程序員應該來嘗嘗鮮 1、前期準備 FastGithub:如果有科學上網且能正常訪問 github 則不需要下載此軟件,此軟件是提供國內直接訪問 githubGit&#…

【最新】DeepSeek 實用集成工具有那些?

deepseek 系列github倉庫地址 【主頁】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重點介紹】awesome-deepseek-integration 注意:以下內容來自awesome-deepseek-integration DeepSeek 實用集成(awesome-deepseek-integration) 將…

開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器

開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器 目錄 開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器本項目未經授權,禁止商用!本項目未經授權,禁止商用!本項目未經授權&…

Flink測試環境Standalone模式部署實踐

1.JDK環境 參考官方文檔: https://nightlies.apache.org/flink/flink-docs-release-1.20/release-notes/flink-1.18/ 2.下載Flink:https://flink.apache.org/downloads/ 本次驗證用的是:https://www.apache.org/dyn/closer.lua/flink/flink…

在16卡服務器上使用最新版的CUDA和驅動訓練`llama - 2 - 7b`和`llama - 2 - 70b`模型,并生成訓練指標數據

要在16卡服務器上使用最新版的CUDA和驅動訓練llama - 2 - 7b和llama - 2 - 70b模型,并生成訓練指標數據,你可以按照以下步驟進行: 1. 環境準備 確保你的服務器已經安裝了最新版的CUDA和驅動,并且安裝了必要的Python庫&#xff0…