Hologres從V2.2版本開始,支援通過Hive Metastore訪問儲存於OSS上的資料湖資料,如您使用EMR叢集構建了基於OSS的資料湖環境,可通過簡單配置實現Hologres加速讀寫OSS和OSS-HDFS資料。
前提條件
已開通OSS服務。具體操作,請參見控制台快速入門。
已建立EMR資料湖叢集並構建測試資料。具體操作,請參見建立叢集。Hologres支援的EMR叢集需滿足以下條件:
Hive為3.1.3及以上版本。
未開啟Kerberos身份認證。
中繼資料選擇自建RDS或者內建MySQL。
已購買Hologres執行個體並開啟資料湖加速,然後登入Hologres執行個體並建立資料庫。具體操作,請參見購買Hologres和建立資料庫。
說明開啟資料湖加速方式:訪問Hologres執行個體列表,單擊目標執行個體操作列中的資料湖加速並確認,開啟資料湖加速功能。
已完成網路打通。
您需要先提交網路打通申請(網路打通申請連結請參見網路打通申請)。收到您的申請後,阿里雲Hologres技術支援人員會聯絡並協助您完成以下操作,從而實現網路互連:
登入專用網路管理主控台建立反向終端節點,具體操作請參見建立和管理終端節點。終端節點服務選擇其他終端節點服務,然後輸入EMR叢集所在地區的終端節點服務的名稱。各地區終端節點服務名稱如下。
地區
終端節點服務名稱
北京
com.aliyuncs.privatelink.cn-beijing.epsrv-2zeokrydzjd6kx3cbwmb
上海
com.aliyuncs.privatelink.cn-shanghai.epsrv-uf61fvlfwta7f7dv9n3x
張家口
com.aliyuncs.privatelink.cn-zhangjiakou.epsrv-8vbno4k4wwvys0eg2swp
說明如您所在地區未提供終端節點服務名稱,Hologres會在您提交網路打通申請後為您建立並提供反饋。
Virtual Private Cloud(Virtual Private Cloud)是基於阿里雲構建的一個隔離的網路環境,VPC網路之間、VPC網路與傳統傳統網路之間邏輯上徹底隔離,預設無法進行互訪。Hologres服務先於VPC網路存在,部署在傳統網路裡,因此需要通過配置反向終端節點來實現網路聯通。
當前網路設定是通過IP來進行串連,當EMR叢集IP發生變化後,需要重新設定。
限制條件
Hologres唯讀從執行個體暫不支援開啟資料湖加速功能。
不支援對外部表格執行
UPDATE
、DELETE
及TRUNCATE
等操作。暫不支援通過Auto Load方式映射來自HMS的外部表格。
暫不支援開啟了Kerberos身份認證的Hive叢集。
操作步驟
執行SQL命令,建立EXTENSION。
建立EXTENSION需要Superuser許可權,該操作針對整個DB生效,一個DB只需執行一次。
CREATE EXTENSION IF NOT EXISTS hive_fdw;
基於
hive_fdw
建立Foreign Server(外部伺服器)並配置Endpoint資訊。CREATE SERVER IF NOT EXISTS <server_name> FOREIGN DATA WRAPPER hive_fdw OPTIONS ( hive_metastore_uris 'thrift://<Hive metastore的IP地址>:<連接埠號碼>', oss_endpoint 'oss-<nation>-<region>-internal.aliyuncs.com | <bucket>.oss-<nation>-<region>.oss-dls.aliyuncs.com' );
參數
是否必填
說明
樣本值
server_name
是
自訂Foreign Server名稱。
hive_server
hive_metastore_uris
是
Hive MetaStore的URI。格式為
thrift://<Hive metastore的IP地址>:<連接埠號碼>
,連接埠號碼預設為9083。說明您可以登入E-MapReduce控制台,單擊目的地組群操作列中的節點管理。在節點管理頁簽,擷取master節點的內網 IP,內網IP即Hive metastore的IP地址。
thrift://172.16.0.250:9083
oss_endpoint
是
OSS的Endpoint地址。您可以根據自己實際業務選擇:
原生OSS儲存:為獲得更好的訪問效能,推薦使用OSS的內網Endpoint。
OSS-HDFS儲存:目前僅支援內網訪問。
說明您可以登入OSS管理主控台,進入Bucket檔案的概覽頁面,在訪問連接埠地區,擷取OSS的Endpoint地址。
OSS
oss-cn-shanghai-internal.aliyuncs.com
OSS-HDFS
<bucket_name>.cn-beijing.oss-dls.aliyuncs.com
(可選)建立使用者映射。
Hologres支援通過
CREATE USER MAPPING
來指定其他使用者身份訪問特定的Foreign Server。例如:Foreign Server的Owner可以通過CREATE USER MAPPING
指定RAM使用者(123xxx)來訪問OSS外部資料。CREATE USER MAPPING
詳情,請參見postgres create user mapping。CREATE USER mapping FOR <帳號> server <server_name> options ( dlf_access_id 'accessid', dlf_access_key 'accesskey', oss_access_id 'accessid', oss_access_key 'accesskey' );
樣本如下。
--為目前使用者建立使用者映射 CREATE USER mapping FOR current_user server <server_name> options ( dlf_access_id 'LTAI5txxx', dlf_access_key 'y8LUUyyy', oss_access_id 'LTAI5txxx', oss_access_key 'y8LUUyyy' ); --為RAM使用者123xxx建立使用者映射 CREATE USER mapping FOR "p4_123xxx" server <server_name> options ( dlf_access_id 'LIlY5txxx', dlf_access_key 'KsjkXKyyy', oss_access_id 'LIlY5txxx', oss_access_key 'KsjkXKyyy' ); --刪除使用者映射 Drop USER MAPPING FOR CURRENT_USER server <server_name>; Drop USER MAPPING FOR "p4_123xxx" server <server_name>;
建立外部表格。
Hologres支援以下命令建立外部表格:
CREATE FOREIGN TABLE:一次僅建立一張外部表格,但支援通過指定部分列來自訂建立外部表格,適用於需要建立的外部表格較少且無需映射所有外部表格欄位的情況。
IMPORT FOREIGN SCHEMA:大量建立外部表格,適用於需要建立多張外部表格或者外部資料源批量映射的情境。
說明Hologres支援讀取OSS中的分區表,並且支援將TEXT、VARCHAR和INT作為分區鍵的資料類型。使用CREATE FOREIGN TABLE方式時,由於只進列欄位映射而不實際儲存資料,只需要將分區欄位作為普通欄位來建立即可;而使用IMPORT FOREIGN SCHEMA方式時,則無需關心表欄位,系統會自動處理表欄位對應。
如果OSS外部表格存在和Hologres內部表同名的表,IMPORT FOREIGN SCHEMA會跳過該外部表格的建立。建議使用CREATE FOREIGN TABLE來定義一個非重複表格名來建立。
-- CREATE FOREIGN TABLE方式 CREATE FOREIGN TABLE <holo_schema_name>.<table_name> ( { column_name data_type } [, ... ] ] ) ) SERVER <hive_server_name> OPTIONS ( schema_name '<ext_db_name>', table_name '<ext_table_name>' ); -- IMPORT FOREIGN SCHEMA方式 IMPORT FOREIGN SCHEMA <ext_db_name> [ { limit TO | EXCEPT } ( table_name [, ...] ) ] FROM server <hive_server_name> INTO <holo_schema_name> options( if_table_exist 'update', if_unsupported_type 'error' );
查詢外部表格。
建立外部表格成功後,可以直接查詢外部表格讀取OSS中的資料。
非分區表
SELECT * FROM <holo_schema>.<hive_table>;
分區表
SELECT * FROM <holo_schema>.<hive_partition_table> WHERE <partition_key> = '<partition_value>';