【面試場景題】日志去重與統計系統設計

文章目錄

  • 題目
    • 場景描述
    • 要求
    • 問題
    • 考察點
  • 解答
    • 思考
    • 一、核心解決方案(基礎版,單節點32GB內存、10臺節點)
      • 1. 整體架構選型
      • 2. 關鍵步驟詳解
        • (1)數據分片:解決“數據量大,單節點處理不了”的問題
        • (2)本地計算:單節點內完成計數與初步篩選
        • (3)全局匯總:合并各節點結果
        • (4)容錯機制
    • 二、內存優化(單節點僅8GB時)
    • 三、提速方法(縮短計算時間)
    • 四、實時統計(每5分鐘更新一次)
  • 總結

題目

場景描述

某電商平臺的服務器每天會產生約10億條訪問日志,每條日志包含用戶ID、訪問URL、訪問時間等信息(每條日志約100字節)。現在需要設計一個系統,解決兩個核心問題:

  1. 找出當天所有僅出現過一次的URL(即獨立訪問的URL)。
  2. 統計每個URL的訪問次數,并按訪問量從高到低排序,輸出Top 100的URL。

要求

  • 系統需處理每日新增的10億條日志,原始日志存儲在分布式文件系統(如HDFS)中。
  • 服務器集群資源有限:單節點內存最多32GB,可使用的節點數量不超過10臺。
  • 需考慮處理效率(盡量縮短計算時間)和容錯性(如節點故障時如何處理)。

問題

  1. 請設計一個解決方案,闡述核心思路和關鍵步驟。
  2. 如果內存有限(如單節點僅8GB),如何優化方案避免OOM?
  3. 如何提高系統的處理速度?可以從算法、數據結構、分布式策略等角度分析。
  4. 若需實時統計(如每5分鐘更新一次Top 100 URL),方案需要做哪些調整?

考察點

  • 大數據處理思維(分治、哈希分片)
  • 內存優化能力(數據壓縮、磁盤緩存)
  • 分布式系統設計(任務拆分、容錯機制)
  • 算法與數據結構選型(哈希表、堆、布隆過濾器等)
  • 實時與離線處理的差異理解

這道題結合了實際業務中的日志處理場景,既考察基礎算法能力,也關注工程落地時的資源限制與性能優化,能有效區分候選人的綜合技術水平。

解答

思考

  1. 10億條日志,平均每條100字節,也就是總共100GB數據。如果只存URL統計值,放10臺機器應該內存勉強夠,這里用hash分片的方式,即URL哈稀按10取模,分到10臺機器上統計,完后假設夠就能直接統計全量URL出現次數,然后再用小根堆,求出Top 100個url。統計時間復雜度是O(n),小根堆排序時間復雜度是O(nlog100)。
  2. 假設不夠,也算回答下面32G改為8G的情況,可以hash分片分為100份,放入100個小文件中,然后再分別基于這100個小文件,計算只出現一次的URL和TOP100,因為是hash分片的,同一個url不可能出現在兩臺機器上,所以最后匯總100個分片的數據即可。
  3. 假如離線統計變成了實時統計,一天100G,平均5分鐘是350M,如果不考慮絕對精確,那么離線數據統計TOP 1000,然后加上5分鐘新數據的URL的統計,合并取出TOP100。如果要精確計算,那么有可能TOP 1001的那個URL加上5分鐘內的新數據,剛好達到top100,那么就漏統計了。但單純目前的10臺機器很難做到精確統計,可以引入Redis的Zset維護所有url的統計值,通過zrange統計top100.
    針對日志去重與統計系統的設計問題,解決方案需結合分治思想、分布式處理、內存優化三大核心思路,同時兼顧效率與容錯性。以下是具體方案拆解:

一、核心解決方案(基礎版,單節點32GB內存、10臺節點)

1. 整體架構選型

采用**“分布式離線計算框架”(如MapReduce/Spark)作為核心引擎,依托分布式文件系統(HDFS)存儲原始日志,利用框架的并行計算能力和容錯機制處理10億條日志。
核心邏輯分為
“分片預處理→本地計算→全局匯總”**三階段。

2. 關鍵步驟詳解

(1)數據分片:解決“數據量大,單節點處理不了”的問題
  • 分片依據:按URL的哈希值分片(如hash(URL) % 10,10為節點數),確保相同URL被分配到同一節點。
    原理:相同URL的哈希值相同,會被路由到同一個節點,避免“跨節點統計同一URL”導致的計數錯誤。
  • 分片效果:10億條日志平均分配到10臺節點,每節點處理約1億條(約10GB原始數據),單節點32GB內存可承載。
(2)本地計算:單節點內完成計數與初步篩選

每臺節點對分配到的分片數據執行以下操作:

  • 步驟1:URL去重與計數
    哈希表(如Java的HashMap<String, Integer>)存儲“URL→訪問次數”映射:

  • 遍歷分片內的每條日志,提取URL,在哈希表中累加計數(若不存在則初始化為1,存在則+1)。

  • 優化:用“URL的哈希值”代替原始URL作為key(如將URL通過MD5壓縮為16字節哈希值),減少內存占用(原始URL可能很長,哈希值固定長度更省空間)。

  • 步驟2:篩選“僅出現一次的URL”
    遍歷本地哈希表,篩選出value=1的URL,暫存為“本地獨立URL列表”。

  • 步驟3:計算“本地Top 100 URL”
    對本地哈希表的(URL, 次數)按次數降序排序,取前100條作為“本地Top 100”(用堆排序效率更高:維護一個大小為100的小頂堆,遍歷計數時動態更新,時間復雜度O(n log 100))。

(3)全局匯總:合并各節點結果
  • 匯總“獨立URL”:收集所有節點的“本地獨立URL列表”,合并后即為全局“僅出現一次的URL”(因相同URL已被分片到同一節點,無需去重)。
  • 匯總“全局Top 100”
    收集所有節點的“本地Top 100”(共10×100=1000條),用一個大小為100的小頂堆對這1000條數據重新排序,最終得到全局Top 100 URL。
(4)容錯機制
  • 依賴分布式框架的原生容錯:若某節點故障,框架會自動將其任務分配給其他節點重新處理(需確保原始日志在HDFS中有多副本,避免數據丟失)。
  • 中間結果持久化:將本地哈希表、本地Top 100等中間結果寫入磁盤(如HDFS臨時目錄),避免節點重啟后重復計算。

二、內存優化(單節點僅8GB時)

當單節點內存降至8GB,1億條日志的哈希表可能超出內存(假設每條URL+計數占32字節,1億條需3.2GB,但哈希表負載因子會導致實際占用更高,可能達6-8GB),需進一步優化:

  1. 二次分片(分片內再拆分)
    對單節點的1億條日志再次按hash(URL) % 10拆分(即總分片數10×10=100),每批處理1000萬條(約1GB),處理完一批后釋放內存,再處理下一批。

  2. 使用磁盤輔助存儲
    嵌入式KV數據庫(如LevelDB/RocksDB)替代內存哈希表:

  • 遍歷日志時,將URL的計數實時寫入磁盤數據庫(key=URL哈希值,value=次數),利用數據庫的磁盤+內存混合存儲特性避免OOM。
  • 優勢:LevelDB支持按key排序,后續篩選獨立URL和Top 100時可按序遍歷,效率高于隨機讀寫。
  1. 數據壓縮
  • 對URL進行字典編碼:將重復出現的URL映射為整數ID(如“www.xxx.com”→1,“www.yyy.com”→2),用ID代替URL存儲,減少key的長度。

三、提速方法(縮短計算時間)

  1. 算法與數據結構優化
  • 計數階段:用數組+哈希函數代替哈希表(若URL哈希值可映射到整數范圍),減少哈希沖突帶來的開銷。
  • Top 100計算:用小頂堆(而非全量排序),將局部排序時間從O(n log n)降至O(n log k)(k=100)。
  1. 分布式并行優化
  • 增加分片數:將10億條日志拆分為更多分片(如100片),讓10臺節點并行處理10片/節點,提高CPU利用率(避免單節點處理1億條時CPU空閑)。
  • 減少數據傳輸:僅傳輸“本地結果”(獨立URL列表、本地Top 100),而非原始日志(原始10GB/節點,結果可能僅10MB/節點)。
  1. 硬件與框架調優
  • 用Spark替代MapReduce:Spark基于內存計算,中間結果保存在內存(非磁盤),迭代計算速度快3-5倍。
  • 啟用數據預讀取:利用HDFS的“預取機制”,在處理當前分片時提前加載下一分片數據到內存緩存。

四、實時統計(每5分鐘更新一次)

離線方案適合T+1處理,實時統計需切換為流處理架構(如Flink/Kafka Streams),核心調整如下:

  1. 數據接入
    日志通過Kafka實時流入系統(Kafka作為消息隊列,緩沖峰值流量),每5分鐘劃一個“滾動窗口”。

  2. 實時計數

  • Flink的KeyedStream按URL分組,在窗口內累加計數(底層用狀態后端存儲計數,支持 RocksDB 持久化避免狀態丟失)。
  • 窗口結束后,觸發“本地Top 100”計算,結果寫入全局狀態(如Redis)。
  1. 全局Top 100更新
  • 維護一個全局Redis有序集合(ZSet),存儲所有URL的累計次數,每5分鐘從各窗口結果中合并更新ZSet,再用ZREVRANGE取前100。
  • 優化:用“滑動窗口”代替滾動窗口(如統計最近5分鐘,每1分鐘更新一次),減少結果抖動。
  1. 處理亂序數據
    日志可能因網絡延遲亂序到達,需設置水印(Watermark):允許數據遲到30秒,超過后不再計入當前窗口,平衡實時性與準確性。

總結

該方案通過“分治+分布式”解決大數據量問題,通過“磁盤輔助+二次分片”優化內存,通過“流處理框架”支持實時統計,兼顧了效率、容錯性和資源限制,符合實際生產場景的工程落地需求。

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

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

相關文章

【Day 16】Linux-性能查看

目錄 一、Stress系統壓力測試工具 二、性能查看 &#xff08;一&#xff09;查看CPU # nproc # lscpu # top # uptime # mpstat 數字1 數字2 &#xff08;二&#xff09;查看內存 # dmidecode -t memory | less # free -h # …

【ICCV2017】Deformable Convolutional Networks

一、摘要盡管卷積神經網絡&#xff08;CNN&#xff09;在視覺識別任務上取得巨大成功&#xff0c;但其固有的固定幾何結構&#xff08;固定卷積采樣網格、固定池化窗口、固定 RoI 劃分&#xff09;嚴重限制了對未知幾何變換&#xff08;尺度、姿態、形變、視角變化&#xff09;…

echarts在前后端分離項目中的實踐與應用

目錄 一、ECharts簡介 二、后端數據接口設計 三、數據結構設計 1. 柱狀圖數據結構 2. 餅圖數據結構 四、后端實現要點 五、前端ECharts配置解析 1. 柱狀圖配置 2. 餅圖配置 六、最佳實踐建議 七、總結 一、ECharts簡介 ECharts是百度開源的一個基于JavaScript的可視…

SQL 四大語言分類詳解:DDL、DML、DCL、DQL

SQL&#xff08;結構化查詢語言&#xff09;通常被分為四種主要類型&#xff0c;每種類型負責不同的數據庫操作。下面我將詳細介紹這四類SQL語言的語法和用途。一、DDL (Data Definition Language) 數據定義語言功能&#xff1a;定義和管理數據庫對象結構&#xff08;表、視圖、…

ESP-idf框架下的HTTP服務器\HTML 485溫濕度采集并長傳

項目描述:本項目采用485采集溫濕度以及電壓電流等,485模塊分別為下圖,串口轉485模塊采用自動收發模塊,ESP32工作在AP熱點模式,通過手機連接esp32的熱點來和esp進行數據通訊,使用esp32作為HTTP服務器缺陷:項目的最終HTML頁面代碼可發給AI讓其寫注釋#include "freertos/Free…

雅江工程解鎖墨脫秘境:基礎條件全展示(區位、地震、景點、天氣)

目錄 前言 一、區位信息 1、空間位置 2、區位介紹 二、地震信息 1、歷史地震信息 2、5.0級以上大地震 三、景點信息 1、景點列表分布 2、4A級以上景點 四、天氣信息 1、天氣實況 2、天氣應對挑戰 五、總結 前言 相信最近大家對雅江電站的超級大工程項目應該有所耳…

??機器學習貝葉斯算法

??一、引言??在當今機器學習領域&#xff0c;貝葉斯算法猶如一顆璀璨的明星。你是否想過&#xff0c;垃圾郵件過濾系統是如何準確判斷一封郵件是否為垃圾郵件的呢&#xff1f;這背后可能就有貝葉斯算法的功勞。今天&#xff0c;我們就一同走進貝葉斯算法的世界&#xff0c;…

Chisel芯片開發入門系列 -- 18. CPU芯片開發和解釋8(流水線架構的代碼級理解)

以【5 Stage pipeline CPU】搜索圖片&#xff0c;選取5幅有代表性的圖列舉如下&#xff0c;并結合Chisel代碼進行理解和點評。 圖1&#xff1a;原文鏈接如下 https://acsweb.ucsd.edu/~dol031/posts/update/2023/04/10/5stage-cpu-pipeline.html 點評&#xff1a;黑色的部分…

Docker容器中文PDF生成解決方案

在Docker容器中生成包含中文內容的PDF文件時&#xff0c;經常遇到中文字符顯示為方塊或亂碼的問題。本文將詳細介紹如何在Docker環境中配置中文字體支持&#xff0c;實現完美的中文PDF生成。 問題現象 當使用wkhtmltopdf、Puppeteer或其他PDF生成工具時&#xff1a; 中文字符…

2.java集合,線程面試題(已實踐,目前已找到工作)

1線程的創建方式 繼承Thread類實現Runnable接口實現Callable接口 2.這三種方式在項目中的使用有哪些&#xff0c;一般都是怎么用的 繼承thread類實現線程的方式通過實現run方法來實現線程&#xff0c;通過run進行線程的啟用實現runnable方法實現run方法&#xff0c;然后通過thr…

站在前端的角度,看鴻蒙頁面布局

從Web前端轉向鴻蒙&#xff08;HarmonyOS&#xff09;開發時&#xff0c;理解其頁面布局的相似與差異是快速上手的核心。鴻蒙的ArkUI框架在布局理念上與Web前端有諸多相通之處&#xff0c;但也存在關鍵區別。以下從五個維度系統分析&#xff1a; &#x1f4e6; 一、盒子模型&a…

JavaWeb遺傳算法、TSP、模擬退火、ACO算法等實戰應用

Java Web中實現遺傳算法的應用 以下是關于Java Web中實現遺傳算法的應用場景和實例的整理,涵蓋不同領域的解決方案和實現方法: 遺傳算法基礎結構 在Java Web中實現遺傳算法通常需要以下核心組件: 種群初始化:隨機生成初始解集。 適應度函數:評估個體優劣。 選擇操作:輪…

【圖像算法 - 09】基于深度學習的煙霧檢測:從算法原理到工程實現,完整實戰指南

一、項目背景與需求 視頻介紹 【圖像算法 - 09】基于深度學習的煙霧檢測&#xff1a;從算法原理到工程實現&#xff0c;完整實戰指南今天我們使用深度學習來訓練一個煙霧明火檢測系統。這次我們使用了大概一萬五千張圖片的數據集訓練了這次的基于深度學習的煙霧明火檢測模型&a…

間接制冷技術概念及特征

1、基本概念 (1)間接制冷技術即二次制冷技術。常規做法:二次冷卻液儲液罐增加放置于制冷系統管路,促使冷量再快捷的傳遞給載冷劑,繼而載冷劑冷量促使冷庫達到制冷效果。間接制冷技術:通過常壓的二次冷卻介質進行大循環傳送冷量,在直接制冷劑不易應用的位置或者不可運用直…

Antlr學習筆記 01、maven配置Antlr4插件案例Demo

文章目錄前言源碼插件描述pom引入插件案例&#xff1a;實現hello 標識符 案例1、引入Antlr4的pom運行依賴2、定義語義語法&#xff0c;配置.g4文件實現java代碼3、編寫完之后&#xff0c;執行命令實現編譯4、編寫單測測試使用參考文章資料獲取前言 博主介紹&#xff1a;?目前…

PostGIS面試題及詳細答案120道之 (101-110 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

第十七天:原碼、反碼、補碼與位運算

原碼、反碼、補碼與位運算 一、原碼、反碼、補碼 1、原碼 定義&#xff1a;原碼是一種簡單的機器數表示法。對于一個有符號整數&#xff0c;最高位為符號位&#xff0c; 0 表示正數&#xff0c; 1 表示負數&#xff0c;其余位表示數值的絕對值。示例&#xff1a;以 8 位二進制…

一次完整的 Docker 啟動失敗排錯之旅:從 `start-limit` 到 `network not found

一次完整的 Docker 啟動失敗排錯之旅&#xff1a;從 start-limit 到 network not found 你是否也曾自信地敲下 sudo systemctl start docker&#xff0c;卻只得到一個冰冷的 failed&#xff1f;這是一個開發者和運維工程師都可能遇到的場景。本文將通過一個真實的排錯案例&…

Tdengine 時序庫年月日小時分組匯總問題

年月分組select to_char(collection_time ,"yyyy-mm") AS date, cast(SUM(a.stage_value)as DOUBLE) as stage_value from TABLE GROUP BY date年月日分組select to_char(collection_time ,"yyyy-mm-dd") AS date, SUM(a.stage_value)as DOUBLE) as stage_…

數據結構(01)—— 數據結構的基本概念

408前置學習C語言基礎也可以看如下專欄&#xff1a;打怪升級之路——C語言之路_ankleless的博客-CSDN博客 目錄 1. 基本概念 1.1 數據 1.2 數據元素 1.3 數據項 1.4 組合項 1.5 數據對象 1.6 數據類型 2. 數據結構 2.1 邏輯結構 2.2 存儲結構 2.3 數據的運算 在學…