# GPFDIST --- ## 誰適合看這篇文章 1. 正在使用GP或有意了解GP的工程師 2. 對GPFDIST有興趣的使用者 ## 可以得到什麼收穫 1. 了解GPFDIST基本介紹 2. 創建透過GPFDIST協定的外部表語法 ## 什麼是GPFDIST GPFDIST是Greenplum Database parallel file distribution program, 專門用於處理GP對外部檔案進行讀取或寫。 由於GreenPlum將自身定位為可處理PB等級資料的數據倉儲產品, 因此在實際應用場景中,必然會有ETL大量資料匯入的需求, 此時就可以透過GPFDIST以平行處理、協同作業的方式進行極為快速的資料處理。 一般來說,要將外部資料匯入資料庫的方法主要有下面兩種: (1) 單純一筆一筆資料insert, (2) COPY from File 而上述方法都需要仰賴Master(主節點)耗費資源來獨立處理, 因此可以想像當有大量資料待處理時, 不但耗時甚久更可能影響到其他作業程序。 為了解決上述問題並且加速匯入流程, Greenplum提供了一個基於其MPP架構(Massively Parallel Processor)的內部套件 也就是GPFDIST,透過GPFDIST可以驅動各個SEGMENT平行讀寫來源檔案, 進而增加匯入效率。 ## 特點介紹 由於GPFDIST與各segment是透過HTTP協定進行溝通,因此我們可視GPFDIST將為HTTP SERVER專門處理資料的傳輸發送,而各SEGMENT則扮演HTTP CLIENT的角色,對GPFIDST發送GET/POST等請求。那也受益於這樣的架構概念,帶來了下面幾項特點 ### (1)支援各種來源檔案 由於ETL或其他來源的資料格式都各不同,因此GPFDIST支援了常見的TEXT、CSV之外,也能透過ymal檔來進行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主機上執行。 ```bash # 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) ``` ## 語法範例 ![DEMO架構圖](https://i.imgur.com/I3a7eOH.png) 此處提供了上圖內三種常見情境的對應建表語法(以可讀表為例) 並且將兩組GPFDIST運行於ETL SERVER中。 模擬資訊如下: | Host_NIC_Name | IP | | --------- | ------------ | | etl_NIC_1 | 192.168.0.10 | | etl_NIC_2 | 192.168.0.11 | ETL主機運行gpfdist指令: ```bash #透過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 ```sql 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 ```sql 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 ```sql -- 在/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的個數。 #### 匯入資料 ```sql #讀取外部表 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] https://cn.greenplum.org/greenplum-external-table/ https://greenplum.org/greenplum-etl/ https://docs.vmware.com/en/VMware-Tanzu-Greenplum/6/greenplum-database/GUID-admin_guide-external-g-using-the-greenplum-parallel-file-server--gpfdist-.html