fbpx

PB 級 ETL 獨門秘器 – Greenplum GPFDIST 介紹與使用情境

誰適合看這篇文章

  1. 正在使用 Greenplum 或有意了解 Greenplum 的工程師
  2. 對 GPFDIST 有興趣的使用者

可以得到什麼收穫

  1. 了解 GPFDIST 基本介紹
  2. 創建透過 GPFDIST 協定的外部表語法

什麼是 GPFDIST

GPFDIST 是 Greenplum Database parallel file distribution program,專門用於處理 Greenplum 對外部檔案進行讀取或寫入。由於 GreenPlum 將自身定位為可處理 PB 等級資料的數據倉儲產品,因此在實際應用場景中,必然會有 ETL 大量資料匯入的需求,此時就可以透過 GPFDIST 以平行處理、協同作業的方式進行極為快速的資料處理。

一般來說,要將外部資料匯入資料庫的方法主要有下面兩種:
(1) 單純一筆一筆資料 insert 
(2) COPY from File

而上述方法都需要仰賴 Master (主節點) 耗費資源來獨立處理,因此可以想像當有大量資料待處理時,不但耗時甚久更可能影響到其他作業程序。

為了解決上述問題並且加速匯入流程,Greenplum 提供了一個基於其 MPP 架構 (Massively Parallel Processor) 的內部套件,也就是 GPFDIST。透過 GPFDIST 可以驅動各個 SEGMENT 平行讀寫來源檔案,進而增加匯入效率。

GPFDIST 特點介紹

由於 GPFDIST 與各 SEGMENT 是透過 HTTP 協定進行溝通,因此我們可視 GPFDIST 將為 HTTP SERVER 專門處理資料的傳輸發送,而各 SEGMENT 則扮演 HTTP CLIENT 的角色,對 GPFIDST 發送 GET/POST 等請求,受益於這樣的架構概念,帶來了下面幾項特點:

(1) 支援各種來源檔案

由於 ETL 或其他來源的資料格式都各不同,因此 GPFDIST 支援了常見的 TEXT、CSV 之外,也能透過 yaml 檔來進行JSON、XML 的轉置導入,而且在建立外部表時,透過 wildcard(*) 來代替完整檔名,在有多份文件匯入時,相當的方便。

除此之外,ETL 時常產出數百 GB 的資料,而這樣龐大的資料直接佔據硬碟空間,其實是很不明智的,因此針對被壓縮過的 ETL 資料檔 (gzip bzip2 bz2 zstd),GPFDIST 能夠自動解壓縮並且成為外部表的來源,透過 CPU 的運算能力來降低對空間的使用率,使其在各項考量中取得良好的平衡。

(2) 彈性部署支援

為了讓 Greenplum 主機的資源發揮到最大,通常會規劃將非必要的 loading 放在 ETL 主機執行,此時就可以根據資源的考量,GPFDIST 不只可以隨著 Greenplum 安裝在主機上之外,也能夠部署到 ETL 主機群上,並且透過建表時指定不同網卡 (NIC) 來讓 SEGMENT 們平行讀取/傳輸檔案。讓資料匯入的效率可以大幅提升,而不再將 loading 都依賴 Master 主機上。

而要將 GPFDIST 部署到 ETL 主機上也相當簡單,只要確認好 OS 有相依的套件,就可以直接將 GPFDIST 執行檔複製到 ETL 主機上執行。

# gpfdist version "6.22.0"
[root@mdw ~]# ldd ./gpfdist
        linux-vdso.so.1 (0x00007ffd0705d000)
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fb00ec37000)
        libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007fb00e9a3000)
        libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007fb00e4ba000)
        libyaml-0.so.2 => /lib64/libyaml-0.so.2 (0x00007fb00e29a000)
        libzstd.so.1 => /lib64/libzstd.so.1 (0x00007fb00dff6000)
        libz.so.1 => /lib64/libz.so.1 (0x00007fb00ddde000)
        libevent-2.1.so.6 => /lib64/libevent-2.1.so.6 (0x00007fb00db85000)
        libapr-1.so.0 => /lib64/libapr-1.so.0 (0x00007fb00d94b000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb00d72b000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb00d366000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb00d162000)
        libuuid.so.1 => /lib64/libuuid.so.1 (0x00007fb00cf5a000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb00cd31000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb00ee48000)

語法範例

gpfdist 語法範例

此處提供了上圖內三種常見情境的對應建表語法(以可讀表為例),並且將兩組 GPFDIST 運行於 ETL SERVER 中。

模擬資訊如下:

Host_NIC_Name IP
etl_NIC_1 192.168.0.10
etl_NIC_2 192.168.0.11

ETL 主機運行 GPFDIST 指令:

#透過nohup讓GPFDIST在背景常駐執行
# -p <PORT_NUMBERR>      //指定PORT
# -d <PATH_EXT_FOLDER>   //匯入或讀取資料的目錄路徑
# -l <PATH_LOG_FOLDER>   //GPFDIST執行時的log存放目錄

nohup gpfdist -p 8080 -d /home/gpadmin/ext_folder/ -l /home/gpadmin/gplog1 &
nohup gpfdist -p 8081 -d /home/gpadmin/ext_folder/ -l /home/gpadmin/gplog2 &


情境 1 – 單 GPFDIST,單檔案

檔名: ext_file.csv

CREATE EXTERNAL TABLE ext_omni_1 (id int, name char(10)) 
LOCATION ('gpfdist://etl_NIC_1:8080/ext_file.csv') 
FORMAT 'csv';

情境 2 – 單 GPFDIST,多檔案

檔名: ext_file1.csv , ext_file2.csv

CREATE EXTERNAL TABLE ext_omni_2 (id int, name char(10)) 
LOCATION ('gpfdist://etl_NIC_1:8080/ext_file1.csv', 
          'gpfdist://etl_NIC_1:8080/ext_file2.csv') 
FORMAT 'csv';

-- 利用wildcard,指定相關檔案 
CREATE EXTERNAL TABLE ext_omni_3 (id int, name char(10)) 
LOCATION ('gpfdist://etl_NIC_1:8080/ext_file*.csv') 
FORMAT 'csv';

情境 3 – 多 GPFDIST,多檔案

檔名: ext_fileA.csv ext_fileB.csv

-- 在/home/gpadmin/ext_folder/下有兩個子目錄: folder_A 及 folder_B
CREATE EXTERNAL TABLE ext_omni_4 (id int, name char(10)) 
LOCATION ('gpfdist://etl_NIC_1:8080/folder_A/ext_fileA.csv', 
          'gpfdist://etl_NIC_2:8081/folder_B/ext_fileB.csv') 
FORMAT 'csv';

[注意] 每張外部表在 location 內的 url 數量,不可以超過 primary instance 的個數。

匯入資料

#讀取外部表 ext_omni_1
 SELECT * FROM ext_omni_1;
 
#將外部表 ext_omni_1 匯入到內部表 omni_table 當中
 INSERT INTO omni_table SELECT * FROM ext_omni_1;

結論

GPFDIST 做為一款 Greenplum 當中能支援多面向的平行資料傳輸工具,不但相當輕量化而且也能和其他 ETL 系統、服務進行資料流的串接整合。對於需要處理大量資料的 ETL 開發端,更是相當的好上手並且支援多種功能。

除此之外,若是有資料安全的考量,也能支援 SSL 的 gpfdists://Protocol,而當要對匯入的資料內容做更細微處理,Greenplum 更有提供一個以 GPFDIST 為基礎的工具 -GPLOAD,來滿足相應的資料轉置需求。因此在 Greenplum 的環境下,相當推薦使用 GPFDIST 來代替過往單靠 Master 來匯入資料的功能。

[REF]


相關文章