分佈式環境下的分片數據導出方法

  最近提交了一個專利,是基於去年作的一個異步數據導出的項目,平穩支撐了16/17年的雙十一,抽時間把其中的細節分享出來數據庫

  • 背景 

  數據導出excel的傳統方法通常都是先將數據生成到內存中,而後利用excel的一些工具類生成excel文件經過http請求或者ftp返回給用戶。可是在數據量很大或者併發量很高的場景中,每每會致使內存飆高或者頻繁的FullGC,嚴重時會致使宕機。若是分批進行導出則導出數據量的大小與用戶等待時間成正比,用戶體驗較差。緩存

  咱們的初衷就是要解決數據導出形成的內存溢出。本文將介紹一種分佈式的分片數據導出方法,解決了系統的內存壓力,能支撐大數據量及高併發的數據導出,具備較高的效率及擴展性。多線程

 

  • 現有方案比較
  1. 方案一:在一臺機器中,一個請求使用多個線程進行導出,最終生成excel文件,提升數據導出的效率
  2. 方案二:將用戶的查詢語句分紅多個可執行語句,進行分批導出,同時數據是分批發送給用戶

  方案分析架構

  第一種方案中,雖然使用了多線程進行導出,可是數據最終仍是須要在內存中轉換生成excel文件,這樣不能真正解決內存壓力問題。併發

  第二種方案中,雖然解決了大數據量的內存問題,可是數據是分批輸送給用戶的,體驗較差,同時不能解決高併發的問題,具備侷限性。異步

  同時,現有的方案中,通常都是在一臺機器上進行分批導出,本質上都用增長導出時間的方式來緩解內存壓力,是一種用時間換空間的方式。用戶須要等待較長的時間,體驗較差。分佈式

 

  • 方案細節

  咱們一樣也是基於分治的思想,可是採用了分佈式的解決方案,將一個大數據的導出分片並分紅多個子任務在不一樣的機器上進行導出,而且數據存儲爲csv格式文件,能夠以追加的方式進行存儲  高併發

  但願達到的技術效果:工具

  1. 解決單點導出的內存壓力
  2. 提升導出效率,用戶不用等待過久
  3. 具備較高的擴展性,能夠不斷地提升導出的併發度及數據量

  

  方案實現大數據

  一方面,數據量很大的狀況下,不能將數據所有緩存在內存中,須要分片進行導出;另外一方面併發量很大時,一臺機器也不能知足需求,須要在分佈式環境下分散每臺機器的壓力,這樣就擁有了良好的擴展性。

  這種分片及分佈式的數據導出方法,用於解決大數據量或高併發場景下數據導出問題,可以減輕系統內存壓力,同時具備良好的擴展性。

  整體流程以下:

     

 

 

  1. 第一步:用戶向業務系統發出導出http請求;
  2. 第二步:業務系統嚮導出系統發起一個數據導出的RPC調用;
  3. 第三步:導出系統從各類存儲系統(例如數據庫、搜索等)中分片獲取數據;
  4. 第四步:多臺機器分片獲取到的數據分別上傳到文件存儲系統中進行組合;
  5. 第五步:在文件系統中組合成csv文件;
  6. 第六步:用戶從文件系統中下載文件;

   

  分佈式分片導出方法: 

  

  說明

  1. 首先主任務將數據分片,每一個分片是一個子任務;
  2. 將全部子任務分發到不一樣的機器去並行執行,每臺機器能夠限制並行的子任務數量,來保證內存壓力在可空範圍。
  3. 當每臺機器的子任務都達到閾值上限以後就會將任務緩存在主任務的阻塞隊列中,直到全部任務分發完畢。
  4. 每一個子任務拼裝當前須要處理的數據,咱們並不關心數據從哪裏獲取,能夠從DB、搜索、Hbase等存儲獲取,同時能夠在子任務中處理業務邏輯。而後將處理完的數據上傳至文件存儲系統中。
  5. 當全部子任務執行完畢以後主任務會向文件存儲系統發送請求,將全部的分片合併成csv文件。此時主任務會更新任務狀態並獲取到文件下載連接。

 

  • 總結

  這種數據導出架構的核心思想有4個:

  1. 數據導出異步化,先用時間換空間
  2. 一個高併發及大數據量場景下的導出能夠分而治之,分散內存壓力
  3. 子任務(數據分片)分發到不一樣的機器,一方面分佈式環境下均衡內存壓力,另外一方面用空間換時間
  4. 導出的數據文件可追加,基於流式化的導出
相關文章
相關標籤/搜索