分布式環境下的分片資料匯出方法

2022-03-26 05:27:17 字數 1328 閱讀 3088

最近提交了乙個專利,是基於去年做的乙個非同步資料匯出的專案,平穩支撐了16/17年的雙十一,抽時間把其中的細節分享出來

資料匯出excel的傳統方法一般都是先將資料生成到記憶體中,然後利用excel的一些工具類生成excel檔案通過http請求或者ftp返回給使用者。但是在資料量很大或者併發量很高的場景中,往往會導致記憶體飆高或者頻繁的fullgc,嚴重時會導致宕機。如果分批進行匯出則匯出資料量的大小與使用者等待時間成正比,使用者體驗較差。

我們的初衷就是要解決資料匯出造成的記憶體溢位。本文將介紹一種分布式的分片資料匯出方法,解決了系統的記憶體壓力,能支撐大資料量及高併發的資料匯出,具有較高的效率及擴充套件性。

方案一:在一台機器中,乙個請求使用多個執行緒進行匯出,最終生成excel檔案,提高資料匯出的效率

方案二:將使用者的查詢語句分成多個可執行語句,進行分批匯出,同時資料是分批傳送給使用者

方案分析

第一種方案中,雖然使用了多執行緒進行匯出,但是資料最終還是需要在記憶體中轉換生成excel檔案,這樣不能真正解決記憶體壓力問題。

第二種方案中,雖然解決了大資料量的記憶體問題,但是資料是分批輸送給使用者的,體驗較差,同時不能解決高併發的問題,具有侷限性。

同時,現有的方案中,一般都是在一台機器上進行分批匯出,本質上都用增加匯出時間的方式來緩解記憶體壓力,是一種用時間換空間的方式。使用者需要等待較長的時間,體驗較差。

我們同樣也是基於分治的思想,但是採用了分布式的解決方案,將乙個大資料的匯出分片並分成多個子任務在不同的機器上進行匯出,並且資料儲存為csv格式檔案,可以以追加的方式進行儲存

希望達到的技術效果:

解決單點匯出的記憶體壓力

提高匯出效率,使用者不用等待太久

具有較高的擴充套件性,可以不斷地提高匯出的併發度及資料量

說明

首先主任務將資料分片,每個分片是乙個子任務;

將所有子任務分發到不同的機器去並行執行,每台機器可以限制並行的子任務數量,來保證記憶體壓力在可空範圍。

當每台機器的子任務都達到閾值上限之後就會將任務快取在主任務的阻塞佇列中,直到所有任務分發完畢。

每個子任務拼裝當前需要處理的資料,我們並不關心資料從**獲取,可以從db、搜尋、hbase等儲存獲取,同時可以在子任務中處理業務邏輯。然後將處理完的資料上傳至檔案儲存系統中。

這種資料匯出架構的核心思想有4個:

資料匯出非同步化,先用時間換空間

乙個高併發及大資料量場景下的匯出可以分而治之,分散記憶體壓力

子任務(資料分片)分發到不同的機器,一方面分布式環境下均衡記憶體壓力,另一方面用空間換時間

匯出的資料檔案可追加,基於流式化的匯出

分布式環境下的解決方案 分布式鎖

分布式鎖,也就是在多程序情況下的鎖。需要有儲存鎖的空間,並且鎖的空間是可以訪問到的。鎖需要被唯一標識。鎖要有至少兩種狀態。儲存空間 鎖是乙個抽象的概念,鎖的實現,需要依存於乙個可以儲存鎖的空間。在多執行緒中是記憶體,在多程序中是記憶體或者磁碟。更重要的是,這個空間是可以被訪問到的。多執行緒中,不同的...

分布式環境下的id生成方法

前幾天研究資料庫分表分庫的問題,其中有乙個關鍵的地方就是生成唯一鍵的問題,假如資料表有1億條資料,而且還在不斷的增加,這裡我們就需要考慮到分表分庫,假設我們採用hash或者是使用者取模求餘的方法將這個表拆分成10個表,每個表的結構相同,其中有乙個主鍵id,那麼10個表中的id需要唯一不同,在單錶的時...

分布式環境下的session共享

session共享在當前這個網際網路背景下,已經不是乙個新鮮的話題了,而且如何解決session共享其實也有很多非常成熟的方案 伺服器實現的session複製或session共享,這型別的共享session是和伺服器緊密相關的 我們在web伺服器之間增加了會話資料的同步,通過同步就保證了不同web伺...