從OSS裝載資料到PostgreSQL

曾文旌發表於2016-08-23

oss_fdw

在阿里雲上,支援通過 oss_fdw 並行裝載資料到 PostgreSQL 和 PPAS 中

oss_fdw 引數

oss_fdw 和其他 fdw 的介面一樣,提供對外部資料來源 oss 的資料封裝,使用者可以使用 oss_fdw 像一張表一樣讀取 oss 上的存放的檔案。
和其他 fdw 一樣,oss_fdw 提供獨有的數個引數用於連線和解析 oss 上的檔案資料。

和 oss 相關引數有

1. ossendpoint 引數,是內網訪問oss的地址,也叫 host

2. id oss 賬號 id

3. key oss 賬號 key

4. bucket ossbucket,需要建立 oss 賬號後分配

5. filepath oss 中帶路徑的檔名
  5.1 檔名包含檔案路徑,但不包含 bucket
  5.2 該引數匹配 oss 對應路徑上的多個檔案,支援將他們裝載到資料庫
  5.3 檔案命名為 filepath 和 filepath.x 支援被匯入到資料庫,x 要求從 1 開始,且是連續的
  5.4 例 filepath filepath.1 filepath.2 filepath.3 filepath.5 前4個檔案會被匹配和匯入,但是 filepath.5 不會。
  
6. dir oss 中的虛擬檔案目錄
    6.1 dir 需要以 / 結尾
    6.2 dir 制定的虛擬檔案目錄中的所有檔案(不包含子資料夾和子資料夾下的檔案)都會被匹配和匯入到資料庫。

需要注意

1. 前4個引數 ossendpoint id key bucket 放在server物件中
2. filepath 和 dir 需要在 FDW 的 OPTIONS 引數引數中指定
3. filepath 和 dir 必須指定兩個引數之一,且不能同時指定
4. 各引數的值使用‘’引起來,不能包括無用的空格

其他引數

1. format 
    指定檔案的格式,目前只支援 csv

2. encoding 
    檔案中資料的編碼格式,支援常見 pg 編碼,如 utf8

3. parse_errors 
    容錯模式解析,按照行為單位,忽略檔案分析過程中發生的錯誤
    
4. delimiter
   制定列的分割符
   
5. quote 
   指定檔案的引用字元
   
6. escape 
    指定檔案的逃逸字元
    
7. null 
    指定匹配對應字串的列為 null
    例如 null `test`,即列值為 ‘test’ 的字串為 null
    
8. force_not_null
    制定一列為多列的值不是 null
    例 force_not_null ‘id’,即表中 id 列如果是 null,替換成空字串

用例

# 建立外掛
create extension oss_fdw;

# 建立 server 
CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS 
     (host `oss-cn-hangzhou-zmf.aliyuncs.com` , id `xxx`, key `xxx`,bucket `mybucket`);

# 建立 oss 外部表
CREATE FOREIGN TABLE ossexample 
    (date text, time text, open float,
     high float, low float, volume int) 
     SERVER ossserver 
     OPTIONS ( filepath `osstest/example.csv`, delimiter `,` , 
         format `csv`, encoding `utf8`, PARSE_ERRORS `100`);
        
# 建立表,資料就裝載到這張表中
create table example
        (date text, time text, open float,
         high float, low float, volume int);

# 資料並行的從 ossexample 裝載到 example 中。
insert into example select * from ossexample;

# 可以看到
# oss_fdw 能夠正確估計 oss 上的檔案大小,正確的規劃查詢計劃。
explain insert into example select * from ossexample;
                             QUERY PLAN                              
---------------------------------------------------------------------
 Insert on example  (cost=0.00..1.60 rows=6 width=92)
   ->  Foreign Scan on ossexample  (cost=0.00..1.60 rows=6 width=92)
         Foreign OssFile: osstest/example.csv.0
         Foreign OssFile Size: 728
(4 rows)
        

oss_fdw 使用注意

oss_fdw 開啟了 oss 到 PostgreSQL 和 PPAS 的資料通道,使用者可以把資料放到廉價的oss中,再匯入到 PostgreSQL 或 PPAS 中。

1. oss_fdw 是在 PostgreSQL FOREIGN TABLE 框架下開發的外部表外掛。
2. 資料匯入的效能和 PostgreSQL 叢集的資源(CPU IO MEM MET)相關,也和 OSS 相關。
3. 為了保證資料匯入的效能 ossprotocol 中 ossendpoint 的需要匹配 PostgreSQL 雲上所在 Region。相關資訊請參考下面的連結。

id 和 key 隱藏

CREATE SERVER中的id和key資訊如果不做任何處理,那麼使用者將可以 select * from pg_foreign_server看到明文資訊,這樣將會暴露使用者的id和key。
為了對id和key隱藏,我們通過對id和key進行對稱加密實現(不同的例項使用不同的祕鑰,最大限度保護使用者資訊),但是不能使用類似GP那樣,增加一個資料型別,因為會不相容老例項。

最終的加密後的資訊如下:

postgres=# select * from pg_foreign_server ;
  srvname  | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                                              srvoptions

-----------+----------+--------+---------+------------+--------+------------------------------------------------------------------------------------------------------------------------------------
----------------------------------
 ossserver |       10 |  16390 |         |            |        | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5xxxxxxxx,key=MD5xxxxxxxx,bucket=067862}

加密後的資訊將會以MD5開頭(總長度為len%8==3),這樣匯出之後再匯入不會再次加密,但是使用者不能建立MD5開頭的key和id

參考連結

  1. oss endpiint 資訊
  2. [oss help 頁面] [2]
  3. [PostgreSQL CREATE FOREIGN TABLE 手冊] [3]


相關文章