# 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)
```
## 語法範例

此處提供了上圖內三種常見情境的對應建表語法(以可讀表為例)
並且將兩組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