HAWQ++新特性介紹:可插拔外部存儲

 

HAWQ++可插拔外部存儲

HAWQ++2.1.0版本中發佈了一個新功能:可插拔外部存儲。該功能在保留了原有外部表數據讀寫框架的基礎上引入了增強的外部表讀寫框架。

通過新框架HAWQ++可以支持更加高效地訪問更多類型外部存儲,實現對外部表數據的彈性執行,從而給用戶提供更簡單更有效的數據導入和導出方案,甚至在一些場景中HAWQ++可直接支持用戶對外部表數據的進行分析和查詢。

開發人員可以輕鬆的通過註冊UDF的方式支持新的文件系統和文件格式。當前HAWQ++正式發佈版已支持直接構建外部表讀寫HDFS文件系統上的CSVTEXT格式文件,且讀寫併發性能優化更加智能和富有彈性。HDFS外部表實現比較PXF方案性能有數倍提升。

HAWQ++可插拔外部存儲支持原理

        此前HAWQ依賴PXF訪問外部數據,而PXF採用JAVA實現的外部代理方式。因此在整個數據傳輸路徑中有多次數據轉換,整體性能不盡人意。同時PXF採用固有並行度的方式提供外部代理,其數據導入導出的併發控制死板且PXF可靠性方案實施複雜。在HAWQ++中該特性的提出致力於提出替代PXF的外部數據讀寫方案,通過縮短數據處理路徑,提高數據處理效率,充分發揮HAWQ彈性執行引擎優化能力,實現性能更優使用更簡單靈活且更可靠的外部存儲讀寫。

簡化的數據傳輸接口

        原有的HAWQ外部表數據讀寫框架通過兩階段實現:如下圖所示,在讀外部存儲數據的場景中,數據首先被文件系統協議實現UDF讀取寫入到內部內存緩衝區,然後第二階段的格式識別UDF解釋緩衝區中的數據得到數據庫記錄,在寫外部存儲數據的場景中,數據流動方向相反。這種設計提供了實現靈活性,但卻不適合特殊的外部存儲如HBASE;同樣不可避免的數據兩次複製也嚴重影響數據傳輸性能。而當前HAWQ++引入的新接口合併了文件系統協議實現和文件格式識別的邏輯,即實現的UDF直接提供解釋完成的數據庫記錄或直接寫出數據庫記錄。這利於引入更新的數據處理實現技術,利於提供更高性能的數據讀寫實現。新的接口更加靈活,它也能在未來更好支持類似HBASE等特殊類型存儲的數據讀寫。

 

彈性的執行引擎

        HAWQ++同樣針對外部表訪問優化進行了增強,HAWQ++可以自動識別當前HDFS文件系統中外部表的數據分佈,以此爲依據可以充分發揮HAWQ++MPP++彈性執行引擎。引擎對外部表和內部表採用一致處理邏輯,即根據表規模、HAWQ++資源隊列定義、數據庫資源利用率等動態調整集羣中的外部表讀寫併發數,根據數據分佈選擇最優的計算節點分佈,從而達到優化和靈活控制外部表訪問性能的效果。由於HAWQ++彈性引擎將動態選擇低負載的健康節點進行數據處理,天然支持了導入導出方案的可靠性問題。

 

HDFS外部表支持

        HAWQ++當前版本(2.1.1)支持HDFS協議的外部表,支持的格式爲CSVTEXTHAWQ++針對HDFS外部存儲的數據讀寫實現是完全C/C++的,依據的HDFS讀寫庫同樣爲C/C++實現的libHDFS3。這保障了HAWQ++HDFS外部表支持在實現上是極其高效的。未來HAWQ++將根據實際需要擴展支持更多更廣泛的外部數據存儲協議和文件格式,並持續改進數據讀寫提高端到端性能。

        更進一步的,HAWQ++支持的可寫外部表默認支持讀取數據,這進一步在外部行爲上簡化了外部表使用方法,方便用戶在實際業務場景中構建更簡單高效的數據導入導出方案。

HAWQ++ HDFS外部表操作實例

        用戶使用HAWQ++的外部表非常簡單,在數據導入場景中,用戶只需要三步即可實現數據導入,對比PXF方案安裝和使用都更加便捷:


        同樣在數據導出場景中,使用HDFS外部表用戶只需要兩步即可實現數據導出:1)創建可寫外部表,2)使用INSERT INTO SELECT語句將數據導出。其中,創建外部表支持自動創建不存在的導出路徑。下面基於簡單例子,實際瞭解如果創建和使用HDFS外部表。

創建和刪除HDFS外部表

        與原外部表創建刪除方式一樣,使用中只需要在LOCATION字段中指定是hdfs協議即可。

CREATE WRITABLE EXTERNAL TABLE sales_ext
        (a INT, b DOUBLE PRECISION)
        LOCATION ('hdfs://localhost:8020/sales')
        FORMAT 'csv' (DELIMITER '|');

DROP EXTERNAL TABLE sales_ext;

詳細命令參數可參考

http://oushu.io/docs/hawq/reference/sql/create-external-table/
http://oushu.io/docs/hawq/reference/sql/drop-external-table/

讀取HDFS外部表

        對於一個已創建的外部表或可寫外部表,都可以對其進行讀取,如使用如下語句將外部表數據導入一個內部表中。

INSERT INTOsales_int SELECT * FROM sales_ext;

        也可以使用如下語句直接加工過濾和提取感興趣的數據。

SELECT a, AVG(b) FROM sales_ext WHERE b > 1000.00 GROUP BY a;

寫入HDFS外部表

        用戶只能對一個可寫外部表寫入數據,寫入外部表數據可以作爲一種快速的數據導出手段使用。如下語句將時間數據的導出。導出完成後用戶可從外部表對應的文件路徑找到導出的CSVTEXT格式的文件。特別的,在HAWQ++中用戶也可以在導出數據後對同一個可寫外部表進行查詢訪問。

INSERT INTO sales_ext SELECT * FROM sales_int;

HDFS外部表選項

選項

含義

默認值

DELIMITER

指定列值分隔符。

CSV:逗號’,’

TEXT:製表符’\t’

NULL

指定代表NULL值的字符串。

CSV:空格‘ ‘

TEXT”\N”

ESCAPE

指定轉義字符。HDFS外部表不支持OFF選項。

CSV:雙引號‘”‘

TEXT:反斜槓’\’

QUOTE

指定引號的代替字符。

雙引號‘”‘

FORCE QUOTE

對指定列非NULL列值強制加引號。僅對CSV格式的可寫外部表有效。

N/A

FORCE NOT NULL

對指定列空值強制轉換爲空字符串。僅對CSV格式的外部表讀取有效。

N/A

NEWLINE

指定行分割形式。

LF

HEADER

指定第一行只包含列名信息,需要忽略。

N/A

FILL MISSING FIELDS

強制將爲指定值的列填充NULL

N/A

ENCODING

指定外部表編碼。

默認外部表編碼

LOG ERRORS INTO

將錯誤行內容導入錯誤表中。HDFS外部表的錯誤表也是一個外部表,HAWQ自動創建錯誤表外部表,用戶可以通過檢查pg_exttable獲取自動創建的錯誤表路徑,且用戶需要手動刪除錯誤表。

N/A

SEGMENT REJECT LIMIT

當某個HAWQ VSEG上累積錯誤行超過指定行數,讀取過程報錯退出。HAWQ外部表當前只支持指定具體行數的方式,不支持百分比的方式。

N/A

 

使用HDFS

外部表實現導入導出的介紹可參考
http://oushu.io/docs/hawq/user-guide/import-export/intro/

           


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章