閱讀622 返回首頁    go 魔獸


高速 OSS 並行導入導出__快速入門_雲數據庫 HybridDB-阿裏雲

雲數據庫HybridDB(ApsaraDB HybridDB)是一種在線MPP大規模並行處理數據倉庫服務。雲數據庫HybridDB基於Greenplum Database開源數據庫項目,並由阿裏雲深度擴展支持OSS存儲、JSON數據類型、HyperLogLog預估分析等功能特性。

在阿裏雲上,支持通過 gpossext 並行裝載數據到 HybridDB 中,也支持並行的把數據導出到 OSS 中。

gpossext 語法

  1. CREATE [READABLE] EXTERNAL TABLE tablename
  2. ( columnname datatype [, ...] | LIKE othertable )
  3. LOCATION ('ossprotocol')
  4. FORMAT '...'
  5. [ ENCODING 'encoding' ]
  6. [ LOG ERRORS ...]
  7. CREATE WRITABLE EXTERNAL TABLE table_name
  8. ( column_name data_type [, ...] | LIKE other_table )
  9. LOCATION ('ossprotocol')
  10. FORMAT '...'
  11. [ ENCODING 'encoding' ]
  12. [ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ]
  13. ossprotocol:
  14. oss://oss_endpoint filepath=[folder/[folder/]...]/file_name
  15. id=userossid key=userosskey bucket=ossbucket
  16. ossprotocol:
  17. oss://oss_endpoint dir=[folder/[folder/]...]/file_name
  18. id=userossid key=userosskey bucket=ossbucket

參數解釋

ossprotocol 整個協議和相關參數描述如下

常用參數

  1. 1. 協議名,當然是 oss
  2. 2. ossendpoint 參數,是內網訪問oss的地址,也叫 host
  3. 3. id oss賬號ID
  4. 4. key oss賬號key
  5. 5. bucket ossbucket,需要創建 oss 賬號後分配
  6. 6. filepath oss 中帶路徑的文件名,需要注意
  7. 6.1 文件名包含文件路徑,但不包含 bucket 名
  8. 6.2 並行裝載模式要求文件被均勻拆分為多個文件
  9. 6.3 文件命名方式為 finame.x,x 要求從 1 開始,且是連續的
  10. 6.4 例 filename.1 filename.2 filename.3 ...
  11. 6.5 可以被導入的文件有 filename filename.1 filename.2 ...;其中1到N需要是連續的
  12. 6.6 為了最大化導入性能,建議拆分文件的個數是導入到的 HybridDB segment 個數的倍數
  13. 7. dir oss 中帶路徑的虛擬文件夾,需要注意
  14. 7.1 dir指 oss 上的虛擬文件夾,它需要以 / 結尾
  15. 7.2 該模式和 filepath 互斥,不能同時指定
  16. 7.3 該模式會導入指定虛擬目錄下的所有文件到 HybridDB,但不包括它子目錄和子目錄下的文件
  17. 7.4 和 filepath 一樣,該模式也是並行導入的,為了最大化導入性能,每個文件的大小需要盡量的均勻。
  18. 7.5 和 filepath 不同,dir 下的文件沒有命名要求

導入模式參數

  1. 8. async 是否啟用異步模式裝載數據
  2. 8.1 開啟輔助線程從 oss 裝載數據,加速導入性能。默認導入模式是異步模式。
  3. 8.2 默認情況下異步模式是打開的,如果需要關掉,可以使用參數 async = false 或 async = f
  4. 8.3 異步模式和普通模式比,會消耗更多的硬件資源

導出模式參數

  1. 9. 針對導出模式,新增下列兩個參數
  2. 9.1 oss_flush_block_size 單詞刷出到 oss 的buffer大小,默認 32 MB,可選範圍 1 到 128 MB
  3. 9.2 oss_file_max_size 寫到 oss 的最大文件大小,超出之後會切換到另一個文件再寫。默認 1024 MB,可選範圍 8 到 4000 MB
  4. 9.3 上述兩個參數對導入模式無效
  5. 10 針對導出模式,需要注意
  6. 10.1 WRITABLE 是導出模式外部表的關鍵字,創建外部表時需要明確指明
  7. 10.2 導出模式目前隻支持虛擬文件夾的匹配模式,即隻支持 dir 不支持 filepath
  8. 10.3 導出模式的 DISTRIBUTED BY 子句可以使 segment 直接把本地數據寫入 oss,不用數據重分布

其他通用參數

  1. 11 針對導入模式和導出模式,還有下列容錯相關參數
  2. 11.1 oss_connect_timeout 設置鏈接超時,單位秒,默認是10秒
  3. 11.2 oss_dns_cache_timeout 設置DNS超時,單位秒,默認是60秒
  4. 11.3 oss_speed_limit 控製能容忍的最小速率,默認是1024,即1K
  5. 11.4 oss_speed_time 控製能容忍的最長時間,默認是15秒
  6. 11.5 如果使用了上述默認值,表示如果連續15秒的傳輸速率小於1K,則超時
  7. 11.6 詳細描述,請客參考文章末尾的鏈接

gpossext 的其他參數兼容 HybridDB EXTERNAL TABLE 的原有語法,主要有

  1. 1. FORMAT 支持文件格式,支持 text,csv 等
  2. 2. ENCODING 文件中數據的編碼格式,如 utf8
  3. 3. LOG ERRORS 依然支持容錯模式數據導入,通過製定該子句忽略掉導入中出錯的數據

用例

  1. # 創建 oss 導入外部表
  2. create READABLE external table ossexample
  3. (date text, time text, open float, high float,
  4. low float, volume int)
  5. location('oss://oss-cn-hangzhou.aliyuncs.com
  6. filepath=osstest/example.csv id=XXX
  7. key=XXX bucket=testbucket') FORMAT 'csv'
  8. LOG ERRORS SEGMENT REJECT LIMIT 5;
  9. # 創建 oss 導出外部表
  10. create WRITABLE external table ossexample_exp
  11. (date text, time text, open float, high float,
  12. low float, volume int)
  13. location('oss://oss-cn-hangzhou.aliyuncs.com
  14. dir=osstest/exp/ id=XXX
  15. key=XXX bucket=testbucket') FORMAT 'csv'
  16. DISTRIBUTED BY (date);
  17. # 創建堆表,數據就裝載到這張表中
  18. create table example
  19. (date text, time text, open float,
  20. high float, low float, volume int)
  21. DISTRIBUTED BY (date);
  22. # 數據並行的從 ossexample 裝載到 example 中
  23. insert into example select * from ossexample;
  24. # 數據並行的從 example 導出到 oss
  25. insert into ossexample_exp select * from example;
  26. # 可以看到,每個 segment 都會參與工作。
  27. # 他們並行的從 oss 拉取數據
  28. # 然後通過 Redistribute Motion 分發給對應的 segment.
  29. # 每個 segment 再通過 insert 節點入庫
  30. explain insert into example select * from ossexample;
  31. QUERY PLAN
  32. --------------------------------------------------------------------------------------------------
  33. Insert (slice0; segments: 4) (rows=250000 width=92)
  34. -> Redistribute Motion 4:4 (slice1; segments: 4) (cost=0.00..11000.00 rows=250000 width=92)
  35. Hash Key: ossexample.date
  36. -> External Scan on ossexample (cost=0.00..11000.00 rows=250000 width=92)
  37. (4 rows)
  38. # 可以看到,segment 把本地數據直接導出到 oss ,沒有進行數據重分布
  39. explain insert into ossexample_exp select * from example;
  40. QUERY PLAN
  41. ---------------------------------------------------------------
  42. Insert (slice0; segments: 3) (rows=1 width=92)
  43. -> Seq Scan on example (cost=0.00..0.00 rows=1 width=92)
  44. (2 rows)

gpossext 使用注意

gpossext 打開了 oss 到 HybridDB 的數據通道,用戶可以把數據放到廉價的 oss 中,再導入到 HybridDB 中進行分析。使用需要注意

  1. 1. gpossext 中除了 ossprotocol,其他的部分和 HybridDB 相同。
  2. 2. 數據導入的性能和 HybridDB 集群的資源(CPU IO MEM NET)相關,也和 OSS 相關。
  3. 3. 為了保證數據導入的性能 ossendpoint Region 需要匹配 HybridDB 雲上所在 Region,建議 OSS 和 HybridDB 在同一個 Region 以獲得最好的性能。相關信息請參考下麵的鏈接。

錯誤處理

當導入或導出操作出錯時,錯誤日誌會出現下列信息:

  1. code: 出錯請求的HTTP狀態碼
  2. error_code: OSS的錯誤碼
  3. error_msg: OSS的錯誤信息
  4. req_id: 標識該次請求的UUID;當您無法解決問題時,可以憑 req_id 來請求 oss 開發工程師的幫助
  5. 請參考文檔末尾的鏈接以了解各類錯誤,超時相關的錯誤可以使用 oss_ext 相關參數處理

參考鏈接

  1. oss endpiint 信息
  2. oss help 頁麵
  3. oss 錯誤處理
  4. oss 錯誤響應
  5. HybridDB EXTERNAL TABLE 手冊

最後更新:2016-12-01 11:08:37

  上一篇:go 插件管理__快速入門_雲數據庫 HybridDB-阿裏雲
  下一篇:go 導入MySQL數據__快速入門_雲數據庫 HybridDB-阿裏雲