摘要:GaussDB(DWS)支持在相同網絡中,配置一個GaussDB(DWS)集群連接到一個MRS集群,然后將數據從HDFS中的文件讀取到GaussDB(DWS)。
MapReduce服務(MapReduce Service,簡稱MRS)是一個基於開源Hadoop生態環境而運行的大數據集群,對外提供大容量數據的存儲和分析能力,可解決用戶的數據存儲和處理需求。用戶可以將海量業務數據,存儲在MRS的分析集群,即使用Hive/Spark組件保存。Hive/Spark的數據文件則保存在HDFS中。GaussDB(DWS)支持在相同網絡中,配置一個GaussDB(DWS)集群連接到一個MRS集群,然后將數據從HDFS中的文件讀取到GaussDB(DWS)。從MRS導入數據到集群的流程,大致可以分為5個步驟:
- 第一步: MRS集群上的數據准備
- 第二步:手動創建外部服務器
- 第三步:創建外表
- 第四步:執行數據導入
- 第五步:清除資源
1 MRS集群上的數據准備
從MRS導入數據到GaussDB(DWS)集群之前,假設您已經完成了以下准備工作:
(1)已創建MRS集群。
(2)在MRS集群上創建了Hive/Spark ORC表,且表數據已經存儲到該表對應的HDFS路徑上。
如果您已經完成上述准備,則可以跳過本章節。
為方便起見,我們將以在MRS集群上創建Hive ORC表作為示例,完成上述准備工作。在MRS集群上創建Spark ORC表的大致流程和SQL語法,同Hive類似,在本文中不再展開描述。
1.1 數據文件
假設有數據文件product_info.txt,示例數據如下所示:
100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good 205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good! 300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad. 310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice 150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite 200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality. 250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time. 108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy 450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor 260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes 980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small 98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter. 150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective 200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear 300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good 100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good. 350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good 110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good. 230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good
1.2 在MRS集群上創建Hive ORC表
(1)創建了MRS集群。
(2)登錄MRS集群的Hive客戶端。
- (a)登錄Master節點
- (b)執行以下命令切換用戶
sudo su - omm
- (c)執行以下命令切換到客戶端目錄
cd /opt/client
- (d)執行以下命令配置環境變量
source bigdata_env
- (e)如果當前集群已啟用Kerberos認證,執行以下命令認證當前用戶,當前用戶需要具有創建Hive表的權限。配置擁有對應權限的角色。為用戶綁定對應角色。如果當前集群未啟用Kerberos認證,則無需執行此命令,例如,kinit hiveuser。
kinit MRS集群用戶
- (f)執行以下命令啟動Hive客戶端
beeline
(3)在Hive中創建數據庫demo,執行以下命令創建數據庫:
CREATE DATABASE demo
(4)在數據庫demo中新建了一個Hive TEXTFILE類型的表product_info,並將數據文件(product_info.txt)導入到該表對應的HDFS路徑中,執行以下命令切換到demo數據庫:
USE demo;
執行以下命令,創建表product_info,表字段按照數據文件中的數據進行定義:
DROP TABLE product_info; CREATE TABLE product_info ( product_price int not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt int, product_comment_time date, product_comment_num int, product_comment_content varchar(200) ) row format delimited fields terminated by ',' stored as TEXTFILE;
(5)在數據庫demo中創建了一個Hive ORC表product_info_orc,執行以下命令,創建Hive ORC表product_info_orc,表字段與上一步創建的表product_info完全一致:
DROP TABLE product_info_orc; CREATE TABLE product_info_orc( product_price int not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt int, product_comment_time date, product_comment_num int, product_comment_content varchar(200) ) row format delimited fields terminated by ',' stored as orc;
(6)將product_info表的數據插入到Hive ORC表product_info_orc中。
insert into product_info_orc select * from product_info;
查詢表product_info_orc
select * from product_info_orc;
2 手動創建外部服務器
創建外表語法(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))中,需指定一個與MRS數據源連接相關聯的外部服務器。
當您通過GaussDB(DWS)管理控制台創建MRS數據源連接時,數據庫管理員dbadmin會在默認數據庫postgres中自動創建一個外部服務器。因此,如果您希望在默認數據庫postgres中創建外表讀取MRS數據,可以跳過本章節。
如果您希望使用普通用戶在自定義數據庫中創建外表讀取MRS數據,必須先在自定義數據庫中手動創建一個外部服務器。本章節將為您介紹,如何使用普通用戶在自定義數據庫中創建外部服務器。步驟如下:
第一步:請確保GaussDB(DWS)集群已創建MRS數據源連接。
第二步:創建用戶和數據庫並授予外表權限
第三步:手動創建外部服務器
說明:需要注意的是,當您不再需要從該MRS數據源讀取數據時,通過GaussDB(DWS)管理控制台刪除MRS數據源,僅會刪除在默認數據庫postgres中自動創建的外部服務器,手動創建的外部服務器需要您手動刪除。
2.1 創建用戶和數據庫並授予外表權限
以下示例,是新建一個普通用戶dbuser並創建一個數據庫mydatabase,然后使用管理員用戶授予dbuser外表權限。
(1)使用數據庫管理員通過GaussDB(DWS)提供的數據庫客戶端連接默認數據庫postgres,例如,使用gsql客戶端的用戶通過如下語句連接數據庫,根據界面提示輸入密碼。
gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r
(2)新建一個普通用戶,並用它創建一個數據庫。新建一個具有創建數據庫權限的用戶dbuser:
CREATE USER dbuser WITH CREATEDB PASSWORD "Bigdata@123";
- 切換為新建的用戶
SET ROLE dbuser PASSWORD "Bigdata@123";
- 執行以下命令創建數據庫:
CREATE DATABASE mydatabase;
- 查詢數據庫:
SELECT * FROM pg_database;
- 返回結果中有mydatabase 的信息表示創建成功。
(3)使用管理員用戶給普通用戶賦予創建外部服務器的權限和使用外表的權限。使用數據庫管理員用戶通過數據庫客戶端連接新建的數據庫。
- 例如,使用gsql客戶端的用戶可以直接使用如下語句切換為管理員用戶去連接新建的數據庫,根據提示輸入用戶密碼。
\c mydatabase dbadmin;
- 說明:注意,必須先使用管理員用戶連接到將要創建外部服務器和使用外表的數據庫,再對普通用戶進行授權。
- 默認只有系統管理員才可以創建外部服務器,普通用戶需要授權才可以創建,執行以下命令授權:
GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser;
- 其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser為創建SERVER的用戶名。執行以下命令賦予用戶使用外表的權限。
ALTER USER dbuser USEFT;
- 查看用戶,返回結果中,dbuser的信息中包含了UseFT權限,表示授權成功:
select r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil, array( select b.rolname from pg_catalog.pg_auth_members m join pg_catalog.pg_roles b on (m.roleid = b.oid) where m.member = r.oid ) as memberof, r.rolreplication, r.rolauditadmin, r.rolsystemadmin, r.roluseft from pg_catalog.pg_roles r order by 1;
2.2 手動創建外部服務器
(1)使用數據庫管理員通過GaussDB(DWS)提供的數據庫客戶端連接默認數據庫postgres。例如:通過gsql客戶端登錄數據庫的用戶可以使用以下兩種方法中的一種進行連接:
- (a)如果已經登錄了gsql客戶端,可以執行以下命令切換數據庫和用戶,根據提示輸入密碼:
\c postgres dbadmin;
- (b)如果尚未登錄gsql客戶端,或者已經登錄了gsql客戶端執行\q退出gsql后,執行以下命令重新進行連接,根據提示輸入密碼:
gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r
(2)執行以下命令查詢自動創建的外部服務器的信息。
SELECT * FROM pg_foreign_server;
查詢結果中,每一行代表一個外部服務器的信息。與MRS數據源連接相關聯的外部服務器包含以下信息:
- (a)srvname值包含“hdfs_server”字樣以及MRS集群的ID,此ID與MRS管理控制台的集群列表MRS ID相同。
- (b)srvoptions字段中的address參數為MRS集群的主備節點的IP地址及端口。
您可以根據上述信息找到您所要的外部服務器,並記錄下它的srvname和srvoptions的值。
(3)切換為即將創建外部服務器的用戶去連接其對應的數據庫。在本示例中,執行以下命令,使用創建用戶和數據庫並授予外表權限中創建的普通用戶dbuser連接其創建的數據庫mydatabase 。
\c mydatabase dbuser;
(4)創建外部服務器,創建外部服務器的詳細語法,請參見CREATE SERVER。示例如下:
CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca FOREIGN DATA WRAPPER HDFS_FDW OPTIONS ( address '192.168.1.245:25000,192.168.1.218:25000', hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca', type 'hdfs' );
(5) 查看外部服務器,返回結果如下所示,表示已經創建成功:
SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';
3 創建外表
在GaussDB(DWS)數據庫中創建一個Hadoop外表,用來訪問存儲在MRS HDFS文件系統上的Hadoop結構化數據。Hadoop外表是只讀的,只能用於查詢操作,可直接使用SELECT查詢其數據,您可以按照以下步驟創建外表:
第一步: 請確保您已經完成前提條件
第二步:根據創建外表(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))的語法描述,需要先獲取以下信息:
第三步:獲取MRS數據源的HDFS路徑
第四步:獲取MRS數據源連接的外部服務器信息
第五步:創建外表
3.1 前提條件
- 已創建MRS集群,並將數據導入Hive/Spark數據庫中的ORC表。
- GaussDB(DWS)集群已創建MRS數據源連接。
3.2 獲取MRS數據源的HDFS路徑
有兩種方法可以查看:
方法一:
- 對於Hive數據,可以登錄MRS的Hive客戶端,執行以下命令查看表的詳細信息,並記錄下location參數中的數據存儲路徑。
use <database_name>;
desc formatted <table_name>;
- 例如,返回結果中location參數值為“hdfs://hacluster/user/hive/warehouse/demo.db/product_info_orc/”,則記錄HDFS路徑為“/user/hive/warehouse/demo.db/product_info_orc/”。
方法二:
按以下步驟獲取HDFS路徑。
- (a)登錄MRS管理控制台。
- (b)選擇“集群列表 > 現有集群”,單擊要查看的集群名稱,進入集群基本信息頁面。
- (c)單擊“文件管理”,選擇“HDFS文件列表”。
- (d)進入您要導入到GaussDB(DWS)集群的數據的存儲目錄,並記錄其路徑。
3.3 獲取MRS數據源連接的外部服務器信息
- (1)使用創建外部服務器的用戶去連接其對應的數據庫。
是否使用普通用戶在自定義數據庫中創建外表,請根據需求進行選擇:
場景一:是
(a)請先確保,您已按照手動創建外部服務器章節中的步驟,創建了普通用戶dbuser和它的數據庫mydatabase,並在mydatabase中手動創建了一個外部服務器。
(b)使用用戶dbuser通過GaussDB(DWS)提供的數據庫客戶端連接數據庫mydatabase。
(c)如果已經使用gsql客戶端連接至數據庫,可以直接執行如下命令進行用戶和數據庫切換,根據界面提示輸入密碼:
\c mydatabase dbuser;
場景二:否
當您通過GaussDB(DWS)管理控制台創建MRS數據源連接時,數據庫管理員dbadmin會在默認數據庫postgres中自動創建一個外部服務器。因此,如果使用數據庫管理員dbadmin在默認數據庫postgres中創建外表,需要通過GaussDB(DWS)提供的數據庫客戶端工具連接數據庫。例如,使用gsql客戶端的用戶通過如下命令連接數據庫,根據界面提示輸入密碼:
gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -r
- (2)執行以下命令,查看已創建的MRS數據源連接的外部服務器信息。
SELECT * FROM pg_foreign_server;
查詢結果中,每一行代表一個外部服務器的信息。與MRS數據源連接相關聯的外部服務器包含以下信息:
- o srvname值包含“hdfs_server”字樣以及MRS集群的ID,此ID與MRS管理控制台的集群列表MRS ID相同。
- o srvoptions字段中的address參數為MRS集群的主備節點的IP地址及端口。
您可以根據上述信息找到您所要的外部服務器,並記錄下它的srvname和srvoptions的值。
3.4 創建外表
當完成獲取MRS數據源連接的外部服務器信息和獲取MRS數據源的HDFS路徑后,就可以創建一個外表,用於讀取MRS數據源數據。
創建外表的語法格式如下。
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [ { column_name type_name [ { [CONSTRAINT constraint_name] NULL | [CONSTRAINT constraint_name] NOT NULL | column_constraint [...]} ] | table_constraint [, ...]} [, ...] ] ) SERVER dfs_server OPTIONS ( { option_name ' value ' } [, ...] ) DISTRIBUTE BY {ROUNDROBIN | REPLICATION} [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
根據以上信息,創建外表命令如下所示:
DROP FOREIGN TABLE IF EXISTS foreign_product_info; CREATE FOREIGN TABLE foreign_product_info ( product_price integer not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt integer, product_comment_time date, product_comment_num integer, product_comment_content varchar(200) ) SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca OPTIONS ( format 'orc', encoding 'utf8', foldername '/user/hive/warehouse/demo.db/product_info_orc/' ) DISTRIBUTE BY ROUNDROBIN;
4 執行數據導入
4.1 直接查詢外表查看MRS數據源的數據
如果數據量較少,可直接使用SELECT查詢外表,即可查看到MRS數據源的數據,執行以下命令,則可以從外表查詢數據。
SELECT * FROM foreign_product_info;
查詢結果顯示如數據文件中所示的數據,表示導入成功。查詢結果的結尾將顯示以下信息:(20 rows),通過外表查詢到數據后,用戶可以將數據插入數據庫的普通表。
4.2 導入數據后查詢數據
- (1)在GaussDB(DWS)數據庫中,創建導入數據的目標表,用於存儲導入的數據。該表的表結構必須與創建外表中創建的外表的表結構保持一致,即字段個數、字段類型要完全一致。
例如,創建一個名為product_info的表,示例如下:
DROP TABLE IF EXISTS product_info; CREATE TABLE product_info ( product_price integer not null, product_id char(30) not null, product_time date, product_level char(10), product_name varchar(200), product_type1 varchar(20), product_type2 char(10), product_monthly_sales_cnt integer, product_comment_time date, product_comment_num integer, product_comment_content varchar(200) ) with ( orientation = column, compression=middle ) DISTRIBUTE BY HASH (product_id);
- (2)執行“INSERT INTO .. SELECT ..”命令從外表導入數據到目標表,示例:
INSERT INTO product_info SELECT * FROM foreign_product_info;
若出現以下類似信息,說明數據導入成功。
INSERT 0 20
- (3)執行SELECT命令,查看從MRS導入到GaussDB(DWS)中的數據。
SELECT * FROM product_info;
查詢結果顯示如數據文件中所示的數據,表示導入成功。查詢結果的結尾將顯示以下信息:
(20 rows)
5 清除資源
當完成本教程的示例后,如果您不再需要使用本示例中創建的資源,您可以刪除這些資源,以免資源浪費或占用您的配額。
5.1 刪除外表和目標表
(1)(可選)如果執行了導入數據后查詢數據,請執行以下命令,刪除目標表。
DROP TABLE product_info;
(2)執行以下命令,刪除外表。
DROP FOREIGN TABLE foreign_product_info;
5.2 刪除手動創建的外部服務器
如果執行了手動創建外部服務器,請按照以下步驟刪除外部服務器、數據庫和用戶。
(1)使用創建外部服務器的用戶通過GaussDB(DWS)提供的數據庫客戶端連接到外部服務器所在的數據庫。例如,使用gsql客戶端的用戶可以通過以下兩種方法中的一種進行連接:
(a)如果已經登錄了gsql客戶端,可以執行以下命令進行切換:
\c mydatabase dbuser;
(b)如果已經登錄了gsql客戶端,您也可以執行\q退出gsql后,再執行以下命令重新進行連接:
gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r
(2)刪除手動創建的外部服務器。執行以下命令進行刪除,詳細語法請參見DROP SERVER:
DROP SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca;
返回以下信息表示刪除成功:
DROP SERVER
查看外部服務器:
SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';
返回結果如下所示,表示已經刪除成功:
srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions ---------+----------+--------+---------+------------+--------+------------ (0 rows)
5.3 刪除自定義數據庫。
通過GaussDB(DWS)提供的數據庫客戶端連接默認數據庫postgres。如果已經登錄了gsql客戶端,可以直接執行如下命令進行切換:
\c postgres
執行以下命令,刪除自定義數據庫:
DROP DATABASE mydatabase;
返回以下信息表示刪除成功:
DROP DATABASE
5.4 使用管理員用戶,刪除本示例中創建的普通用戶。
使用數據庫管理員用戶通過GaussDB(DWS)提供的數據庫客戶端連接數據庫。如果已經登錄了gsql客戶端,可以直接執行如下命令進行切換:
\c postgres dbadmin
執行以下命令回收創建外部服務器的權限:
REVOKE ALL ON FOREIGN DATA WRAPPER hdfs_fdw FROM dbuser;
其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser為創建SERVER的用戶名,執行以下命令刪除用戶:
DROP USER dbuser;
可使用\du命令查詢用戶,確認用戶是否已經刪除。
本文分享自華為雲社區《GaussDB for DWS數據融合系列第三期:MRS數據導入DWS》,原文作者:西游故事多 。