greenplum客户端工具_如何从Teradata迁移到Greenplum(上篇)
01
Teradata產(chǎn)品和用戶面臨的問題
Teradata公司成立于1979年,主要為客戶提供三種服務(wù):基于云和硬件的數(shù)據(jù)倉庫、業(yè)務(wù)分析和咨詢服務(wù)。Teradata在1983年推出其首個數(shù)據(jù)庫產(chǎn)品,并為數(shù)據(jù)倉庫市場輸送了大量的人才,之后很長一段時間內(nèi)一直處于數(shù)據(jù)分析領(lǐng)域市場領(lǐng)導(dǎo)者的地位。國內(nèi)很多大型商業(yè)銀行的數(shù)據(jù)倉庫系統(tǒng)都是基于Teradata進行構(gòu)建的。到2005年前后,隨著Intel x86 64位處理器的發(fā)布,基于x86架構(gòu)的服務(wù)器在企業(yè)里開始承擔(dān)越來越多的計算工作,而Teradata一直固守其一體機架構(gòu),造成越來越多的企業(yè)難以承受其高昂的硬件成本和擴容維護費用。另一方面,用戶的數(shù)據(jù)越來越多,業(yè)務(wù)對數(shù)據(jù)倉庫的響應(yīng)時間要求越來越短,而Teradata中存在讀寫互相阻塞的問題,無法滿足業(yè)務(wù)的需求。面對這一矛盾,很多公司都在考慮如何更好地建設(shè)數(shù)據(jù)倉庫以滿足當(dāng)前及未來一段時間的業(yè)務(wù)增長需求,甚至有用戶想借此機會搭建新一代數(shù)據(jù)平臺,在提供Teradata原有功能的同時,可以整合不同業(yè)務(wù)單元的數(shù)據(jù),實現(xiàn)更加多元的業(yè)務(wù)能力。在選擇新的數(shù)據(jù)平臺和Teradata的替代方案時,用戶往往非常慎重,通常會從多個維度對市面上眾多常見的商業(yè)和開源產(chǎn)品進行全方位的評估,包括功能、性能、高可用、可擴展性、開放性、數(shù)據(jù)加載速度、跨云跨平臺能力、與第三方工具的集成能力、監(jiān)控管理特性和總體成本等。用戶期望尋找成本更低、更開放、功能和性能同樣強大的替代方案。大量用戶最終選擇了Greenplum,并認(rèn)同Greenplum是替代Teradata的最佳產(chǎn)品。02
從Teradata遷移到Greenplum的可行性
熟悉數(shù)據(jù)產(chǎn)品的讀者大多了解,Teradata和Greenplum都屬于MPP數(shù)據(jù)庫,這一架構(gòu)上的相似性意味著從Teradata遷移到Greenplum是個非常自然的過程。熟悉Teradata的用戶可以快速掌握Greenplum。同時,兩者的語法非常接近、生態(tài)系統(tǒng)高度重合,這也極大地降低了遷移的難度和過程,使得Greenplum成為Teradata理想的替代產(chǎn)品。另外一方面,Greenplum相比Teradata更加開放,產(chǎn)品基于PostgreSQL完全開源,不需要專有硬件,大大降低了數(shù)據(jù)倉庫構(gòu)建的軟硬件成本。Teradata架構(gòu)
上圖給出了Teradata的架構(gòu),可以看出,Teradata同樣采用無共享(Shared Nothing)大規(guī)模并行處理( MPP)架構(gòu)。主要包括解析引擎(Parsing Engine,PE)、計算引擎 (Access Module Processor,AMP)、消息通信層 (Bynet)三個模塊。其中PE模塊相當(dāng)于Greenplum的 master節(jié)點,負責(zé)處理用戶連接、SQL的解析、分發(fā)和最終查詢結(jié)果的輸出;AMP模塊 相當(dāng)于Greenplum 的segment節(jié)點,負責(zé)具體數(shù)據(jù)的計算工作;Bynet模塊相當(dāng)于Greenplum的interconnect部分,負責(zé)整個網(wǎng)絡(luò)的通信和數(shù)據(jù)在不同節(jié)點的傳輸。此外,VDisk相當(dāng)于Greenplum segment節(jié)點的本地存儲。可見,Teradata在架構(gòu)上和Greenplum基本一致,主要區(qū)別是在其對應(yīng)的硬件部分,如Bynet是專門的硬件網(wǎng)絡(luò)設(shè)備,VDisk部分對應(yīng)的底層存儲一般是通過共享存儲劃分邏輯單元號(LUN)的方式實現(xiàn)。
因為Greenplum和Teradata在架構(gòu)上相似,且都支持ANSI SQL標(biāo)準(zhǔn),因此兩個產(chǎn)品中大量語句的語法都一致或者高度相似,即使有不一樣的語法或者概念,也能在另一個產(chǎn)品中找到對應(yīng)的語法或者概念。例如,對于create table命令,兩者的語法基本一樣;如果創(chuàng)建表時劃分分區(qū),兩者都使用partition by。但對于數(shù)據(jù)分布的控制,Teradata使用primary index, 而Greenplum使用distributed by。對于大多數(shù)Teradata特有的概念和語法,遷移到Greenplum時可以忽略,極個別的情形下需要加以改寫。
Greenplum和Teradata在工具鏈和生態(tài)系統(tǒng)上也存在著許多相似性。如下表所示,Teradata中常用的庫和工具在Greenplum都有對應(yīng)的使用方式和工具。所有常見的BI工具都同時內(nèi)置支持Teradata和Greenplum。所以,使用商業(yè)智能(BI)工具的用戶在遷移后依然可以使用自己熟悉的工具。類型 | Teradata | Greenplum | 遷移說明 |
ODBC/JDBC | 支持 | 支持 | _ |
BI前端展現(xiàn) 工具 | 支持所有BI前端工具 | 支持所有BI前端工具 | 通過ODBC或JDBC標(biāo)準(zhǔn)訪問DW,改動量很小或沒有; |
LOAD工具 | fastload/ multiload/ tpump等 | 外部表導(dǎo)入、COPY等工具 | 采用工具對ETL腳本使用到的部分 |
UNLOAD工具 | fastexport等 | 外部表導(dǎo)出、COPY等工具 | 采用工具對ETL腳本使用到的部分 |
命令執(zhí)行 客戶端 | BTEQ | PSQL | 采用工具對ETL腳本使用到的部分 |
SQL- DML語法 | 支持ANSI SQL | 支持ANSI SQL | Greenplum和Teradata的語法基本相同。Teradata有少量特殊語法或函數(shù)(如事務(wù)BT/ET、OLAP的csum,rank、qualify等、函數(shù)如char),Greenplum都有相對應(yīng)的甚至更強大的函數(shù),只是需要修改SQL中的語法。工作量不大 |
SQL- 語法DDL | 使用PRIMARY INDEX、PPI等 | 使用Distribution分布數(shù)據(jù),使用partition做表分區(qū) | DDL語法基本相同。需要將Teradata的PRIMARY INDEX改成Distribution key,PPI改成表分區(qū) |
備份與恢復(fù) | 采用NETVULT+archive工具 | CRONTAB調(diào)度器+ gpbackup/ gprestore | 實現(xiàn)數(shù)據(jù)庫的自動備份 |
系統(tǒng)監(jiān)控等管理工具 | Teradata MANAGE | Greenplum Command Center | _ |
Teradata與Greenplum的數(shù)據(jù)庫特征比較
雖然異構(gòu)數(shù)據(jù)庫遷移的工作量不小,但由于有上述大量相同點,從Teradata遷移到Greenplum往往是一個可以接受的工作。許多用戶也在實踐中發(fā)現(xiàn)這項工作比想象中容易。在國外,著名的投資銀行摩根斯丹利成功將其部分Teradata集群遷移到Greenplum,并逐步擴大Greenplum的集群數(shù)量和使用場景。到2018年,摩根斯坦利在600多臺機器上運行著24個生產(chǎn)集群,管理著多達25PB的原始數(shù)據(jù)。在國內(nèi),某大型商業(yè)銀行在2013年就啟動了部分Teradata集群向Greenplum的遷移,遷移完成后批量作業(yè)的處理時間減少了6個小時,報表查詢響應(yīng)時間減少為原來的?。03
如何從Teradata遷移到Greenplum
由于Grennplum和Teradata基于同樣的MPP架構(gòu),所以在Teradata上的物理模型設(shè)計原則同樣適用于Greenplum,遷移工作主要是對應(yīng)語法的翻譯。
01
遷移流程概述
Teradata遷移至Greenplum的總體流程如下圖所示,主要分為歷史數(shù)據(jù)遷移、日常加工流程遷移、應(yīng)用接口遷移及管理工具遷移幾個階段。
遷移總體流程圖
1. 歷史數(shù)據(jù)遷移該階段包括如下步驟:在Teradata數(shù)據(jù)庫中,按規(guī)定分隔符及字符編碼將歷史數(shù)據(jù)導(dǎo)成文本文件,存放于Greenplum數(shù)據(jù)庫網(wǎng)絡(luò)相通的ETL服務(wù)器本地磁盤或所連NAS上,確保Greenplum數(shù)據(jù)庫通過gpfidst協(xié)議的外部表能讀取數(shù)據(jù)文件。
從Teradata導(dǎo)出DDL腳本,按照Greenplum語法批量修改腳本,確保在Greenplum中能成功創(chuàng)建所有用戶表。
2. 日常加工流程遷移
該階段將ETL查詢加工語句按Greenplum的DML語法進行轉(zhuǎn)換,并根據(jù)Teradata與Greenplum函數(shù)對照表替換相關(guān)函數(shù),轉(zhuǎn)換ETL連接數(shù)據(jù)庫方式。重新配置加工作業(yè),歷史數(shù)據(jù)遷移成功后,啟動日常ETL作業(yè)。
3. 應(yīng)用接口遷移在該階段,由于Greenplum數(shù)據(jù)庫支持ODBC/JDBC,商業(yè)智能前端展現(xiàn)等工具可通過ODBC或JDBC標(biāo)準(zhǔn)訪問數(shù)據(jù)倉庫,改動網(wǎng)絡(luò)連接IP等即可。4. 管理工具部署該階段包括以下步驟:
遷移任務(wù) | 任務(wù)簡述 |
數(shù)據(jù)卸載 | 從Teradata卸載抽取歷史數(shù)據(jù) |
DDL導(dǎo)出 | 從Teradata導(dǎo)出表DDL腳本 |
DDL腳本轉(zhuǎn)換遷移 | 按Greenplum語法對Teradata版DDL(包括表,索引,視圖)腳本進行轉(zhuǎn)換 |
數(shù)據(jù)加載 | 選擇Greenplum數(shù)據(jù)加載方式,如外部表或者copy工具,準(zhǔn)備加載腳本,進而進行數(shù)據(jù)加載 |
ETL工具腳本轉(zhuǎn)換遷移 | 建立Greenplum到ETL服務(wù)器的網(wǎng)絡(luò)連接,對數(shù)據(jù)加工模塊腳本按Greenplum語法進行局部修改,查詢語句轉(zhuǎn)換及存儲過程轉(zhuǎn)換等 |
查詢語句轉(zhuǎn)換遷移 | 按Greenplum語法規(guī)則及特性修改轉(zhuǎn)換及優(yōu)化查詢語句 |
存儲過程轉(zhuǎn)換遷移 | 按Greenplum語法規(guī)則及特性修改轉(zhuǎn)換及優(yōu)化Teradata及用戶自定義函數(shù),存儲過程等 |
資源負載管理遷移 | 根據(jù)Teradata資源負載管理確定Greenplum用戶及資源組或者資源隊列 |
安全及權(quán)限管理遷移 | 遷移用戶及組等角色的訪問權(quán)限及數(shù)據(jù)庫對象權(quán)限 |
BI工具接口遷移 | 建立Greenplum到BI前端應(yīng)用連接 |
主要遷移任務(wù)
接下來,我們將詳細介紹主要的遷移工作。
02
Teradata數(shù)據(jù)卸載及DDL導(dǎo)出規(guī)范
首先,我們需要了解Teradata的數(shù)據(jù)卸載及DDL導(dǎo)出規(guī)范。
(1)數(shù)據(jù)卸載規(guī)范
在卸數(shù)前,需要按遷移前協(xié)商好的字符編碼從Teradata中卸出數(shù)據(jù),推薦使用UTF8或者GBK,在確定字符編碼規(guī)則后,通知準(zhǔn)備加載腳本的相關(guān)人員。
在數(shù)據(jù)卸載前,需要按遷移前協(xié)商好的分隔符從Teradata中卸出數(shù)據(jù),推薦使用單分隔符(如“|”等),如果有特殊規(guī)定需要雙分隔符(如“|@|”),Greenplum也允許使用。在確定分隔符規(guī)則后,通知準(zhǔn)備加載腳本的相關(guān)人員。
(2)DDL導(dǎo)出規(guī)范
在Teradata中通過show schemaname.tablename來導(dǎo)出用戶表DDL語句,將定義語句傳至約定的ETL中轉(zhuǎn)服務(wù)器等,需確保該中轉(zhuǎn)服務(wù)器與Greenplum數(shù)據(jù)庫網(wǎng)絡(luò)相通,以便修改后的DDL能傳輸至Greenplum數(shù)據(jù)庫服務(wù)器進行用戶表的創(chuàng)建。
數(shù)據(jù)定義語句(DDL)轉(zhuǎn)換。
下面詳細介紹如何進行 DDL 轉(zhuǎn)換。
1. Create table
將Teradata表定義轉(zhuǎn)換為Greenplum表定義,有以下考慮要點:???? 在Teradata數(shù)據(jù)庫中大小寫不敏感,而Greenplum數(shù)據(jù)庫則大小寫敏感。例如,如下代碼說明了Greenplum數(shù)據(jù)庫對大小寫是敏感的。pivotal=# create table t1(id int,name varchar(32)) distributed by (id);CREATE TABLEpivotal=# insert into t1 values (1,'ABC');INSERT 0 1pivotal=# select * from t1 where name='ABC'; id | name----+------ 1 | ABC(1?row)pivotal=# select * from t1 where name='abc'; id | name----+------(0?rows)Teradata默認(rèn)大小寫不敏感,若要區(qū)分大小寫,則應(yīng)在查詢語句中指定CASESPECIFIC關(guān)鍵字,強制不忽略大小寫。
BTEQ -- Enter your SQL request or BTEQ command:create table test.t1 (id int,name varchar(32)) primary index ( id ); *** Table has been created. *** Total elapsed time was 1 second. BTEQ -- Enter your SQL request or BTEQ command:insert into test.t1 values(1,'ABC'); *** Insert completed. One row added. *** Total elapsed time was 1 second. BTEQ -- Enter your SQL request or BTEQ command:select * from test.t1 where name='ABC'; *** Query completed. One row found. 2 columns returned. *** Total elapsed time was 1 second. id name----------- -------------------------------- 1 ABC BTEQ -- Enter your SQL request or BTEQ command:select * from test.t1 where name='abc'; *** Query completed. One row found. 2 columns returned. *** Total elapsed time was 1 second. id name----------- -------------------------------- 1 ABC BTEQ -- Enter your SQL request or BTEQ command:select * from test.t1 where name='abc' (CASESPECIFIC) ; *** Query completed. No rows found.?***?Total?elapsed?time?was?1?second.???? 數(shù)據(jù)類型及約束條件。
???? 在Greenplum數(shù)據(jù)庫,主鍵(PK)可以考慮作為分布鍵。
???? 非標(biāo)準(zhǔn)化的Teradata SQL命令,即Teradata特有的SQL命令。
在DDL轉(zhuǎn)換中,應(yīng)根據(jù)上述考慮要點進行轉(zhuǎn)換。下表根據(jù)Teradata與Greenplum建表(CREATE TABLE)語句的語法詳細說明如何轉(zhuǎn)換。Teradata | Greenplum | ||
CREATE TABLE ; | CREATE TABLE ;? ????; | ||
定義 | 說明 | 定義 | 說明 |
SET/MULTISET | 定義記錄是否可重復(fù) | 無 | 無,轉(zhuǎn)換時直接刪除 |
Create Table Options? 表選項 | 定義表的物理屬性? Fallback? Journaling? Freespace? | 無 | 無,轉(zhuǎn)換時直接刪除 |
Column Definitions字段定義 | 定義表的各個字段,可以通過format函數(shù)定義數(shù)據(jù)格式 | Column Definitions (字段定義) | 根據(jù)數(shù)據(jù)類型對照表替換,Greenplum不支持通過to_char/to_date函數(shù)定義數(shù)據(jù)格式,Greenplum默認(rèn)日期格式為YYYY-MM-DD,即如果字段默認(rèn)格式為YYYY-MM-DD,那么轉(zhuǎn)換時直接刪除即可 |
Table-level Constraints? 表級約束 | 定義約束? Primary key? Unique? CHECK條件 Foreign key | Table-level Constraints (表級約束) | Greenplum支持定義主鍵,但是不推薦;不支持CHECK條件及創(chuàng)建外鍵 |
Index Definitions索引定義 | 定義表索引 | Index Definitions (索引定義) | Greenplum支持,但是和Teradata類似,需要根據(jù)業(yè)務(wù)要求再次評估是否創(chuàng)建索引 |
PI Definitions索引定義 | 主索引 | DK Definitions (分布鍵定義) | 根據(jù)Teradata主索引直接修改為分布鍵即可 |
partition Definitions分區(qū) | 表分區(qū) | partition Definitions (分區(qū)) | Teradata與Greenplum分區(qū)表語法不同,根據(jù)Greenplum的語法轉(zhuǎn)換 |
2. 數(shù)據(jù)類型轉(zhuǎn)換對照
Teradata與Greenplum中數(shù)據(jù)類型的轉(zhuǎn)換對照如下表所示。Teradata字符類型 | Greenplum字符類型 |
Char(n) | character (n),?char(n) |
Varchar(n) | character varying(n),?varchar(n) |
Long Varchar | text |
SmallInt | smallint,?int2 |
Integer | integer,?int,?int4 |
Dec(m,n) | real,?float4 |
Float | float8,?float |
Date | date |
Time | time |
Timestamp | time with time zone |
3. 物理模型轉(zhuǎn)換規(guī)則
針對上述轉(zhuǎn)換規(guī)則,對于每一個CREATE TABLE 語句,執(zhí)行如下轉(zhuǎn)換邏輯:(1)全局替換規(guī)則s/(CREATE[\s]+MULTISET[\s]+TABLE[\s]+[\w]+\.[\w]+).*$/$1/imgs/ MULTISET / /g;s/,NO FALLBACK ,//g;s/NO BEFORE JOURNAL,//g;s/NO AFTER JOURNAL,//g;s/FREESPACE = 30, //g;s/DATABLOCKSIZE = 10000 BYTES,//g;s/CHECKSUM = DEFAULT//g;s/CHARACTER SET LATIN NOT CASESPECIFIC/ /g;s/FORMAT 'YYYY-MM-DD'/ /g;s/PRIMARY INDEX /DISTRIBUTED BY /g;s/( COMPRESS \([\d\D]+?\))/ /g;s/( COMPRESS '[\d\D]+?')/ /g;s/( COMPRESS [\d\.]+ )//g;s/TITLE _UNICODE '[\d\w]+'XC//g;s/NO RANGE OR UNKNOWN//g;s/?CASESPECIFIC/?/g;(2)獲取TITLE 語句信息,轉(zhuǎn)換生成COMMENTON 語句
COMMENT語法如下:
COMMENT ON TABLE schemaname.tablename.columnname IS ‘column specification’;其中:
schemaname:模式名
tablename:表名
columnname:字段名
column specification:字段描述
(3)轉(zhuǎn)換PARTITION BY 語句語法
Greenplum PARTITION BY語法如下:
PARTITION BY partition_type (column) ?(?partition_spec?)?(4)轉(zhuǎn)換CREATE INDEX索引語句
下圖給出了一個例子。
4.根據(jù)已存在表的結(jié)構(gòu)創(chuàng)建空表
在Teradata中,使用CREATE TABLE AS語法,可以基于已經(jīng)存在的表創(chuàng)建新表。如果只創(chuàng)建表定義,不復(fù)制數(shù)據(jù),則使用WITH NO DATA選項。而在Greenplum中,該功能是通過LIKE關(guān)鍵字實現(xiàn)的,轉(zhuǎn)換模式如下
CREATE TABLE schemaname.new_tablename AS schemaname.old_tablename WITH [NO] DATA轉(zhuǎn)換為:
CREATE?TABLE?schemaname.new_tablename?(LIKE?schemaname.old_tablename)注意:該轉(zhuǎn)換需要手動搜索腳本進行手工轉(zhuǎn)換。
5. Drop table
Teradata與Greenplum刪除表的語法一致,但是如果聲明在刪除表前先判斷表是否存在時,那么Teradata與Greenplum語法有區(qū)別,轉(zhuǎn)換過程如下圖所示。
注意:該轉(zhuǎn)換需要手動搜索腳本進行轉(zhuǎn)換。
6.臨時表轉(zhuǎn)換
臨時表作為一種輔助工具,能夠提高SQL操作的性能。特別是針對下列情況的 SQL操作,臨時表能發(fā)揮非常重要的作用:???? 不能使用規(guī)范化的表。???? 要求多條 SQL 語句完成。???? 臨時表對于頻繁產(chǎn)生的中間結(jié)果或作為后續(xù)工作基礎(chǔ)的中間結(jié)果也非常有用。因此,在各類數(shù)據(jù)庫中,都支持創(chuàng)建臨時表功能,Teradata支持全局臨時表(Global Temporay Table)、可變臨時表(Volatile Temporay Table)兩種類型,而Greenplum只支持可變臨時表(temp/TEMPORARY)。語法轉(zhuǎn)換規(guī)則如下:
???? 直接將VOLATILE替換為temp/TEMPORARY,或者將GLOBAL TEMPORARY替換為temp/TEMPORARY。
???? 在Greenplum中不支持維護交易日志LOG或者不維護交易日志NO LOG關(guān)鍵字,直接刪除即可。在Greenplum 6.0中支持unlogged table,用戶可以根據(jù)業(yè)務(wù)場景靈活進行選擇。
???? 控制事務(wù)提交后是否保留記錄,可使用ON COMMIT PRESERVE ROWS/ON COMMIT DELETE ROWS,這在Greenplum中同樣適用。
???? 其他的DDL定義修改可參考永久物理表轉(zhuǎn)換規(guī)則。
???? 如果臨時表無delete及update操作,那么建議進行壓縮,壓縮語句在分布鍵前進行聲明,語法如下:
CREATE TEMP TABLE schemaname.temp_tablename(like?schemaname.tablename|select?……?from?schemaname.tablename)WITH?(APPENDONLY=TRUE,ORIENTATION=ROW,COMPRESSTYPE=ZLIB,COMPRESSLEVEL=5)DISTRIBUTED?BY?RANDOMLY;注意:臨時表在ETL腳本自動轉(zhuǎn)換工具中可進行80%的自動轉(zhuǎn)換,再針對無法自動轉(zhuǎn)換的語句進行手動轉(zhuǎn)換。
下圖給出了一個臨時表轉(zhuǎn)換的示例。
臨時表轉(zhuǎn)換示例下篇我們將接著向大家介紹如何從Teradata遷移到Greenplum。(未完待續(xù))
Greenplum近期社區(qū)活動
6月13日 14:00-15:00
聽個推資深大數(shù)據(jù)研發(fā)專家 栗子 為你講述《個推如何采用Greenplum提高PB級別數(shù)據(jù)處理能力》
6月19日 16:00-17:00
聽Greenplum原廠研發(fā)郭峰講解《Greenplum內(nèi)核揭秘之查詢優(yōu)化》我知道你
在看
哦
總結(jié)
以上是生活随笔為你收集整理的greenplum客户端工具_如何从Teradata迁移到Greenplum(上篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python绘制数字_#0000在一个图
- 下一篇: ssd测试工具crystaldiskma