本文介紹如何建立Hologres外部表格,以及如何在外部表格建表語句中指定Hologres資料來源、STS認證資訊或開啟雙簽名開關、映射目標表、JDBC驅動資訊。
功能介紹
Hologres是相容PostgreSQL協議的即時互動式分析資料倉庫,在底層與MaxCompute無縫串連。通過在MaxCompute上建立Hologres外部表格,可以實現基於PostgreSQL JDBC驅動及STS認證資訊查詢Hologres資料來源的資料。該方式無冗餘儲存,無需匯入匯出資料,可實現快速擷取查詢結果。
適用範圍
資料操作(DML)
MaxCompute不支援對建立的Hologres外部表格執行更新(UPDATE)、刪除(DELETE)操作。
不支援對Hologres外部表格執行INSERT OVERWRITE操作:
從Hologres側讀取Hologres映射MaxCompute的外表,通過Hologres的INSERT OVERWRITE語義完成從MaxCompute到Hologres的資料覆蓋寫入,詳情請參見INSERT OVERWRITE。
資料寫入風險
當向Hologres外部表格寫入大量資料時,由於採用並行多進程寫入,會存在小機率某個寫入進程資料重寫的情況,從而導致資料重複。
分區
Hologres的分區表和MaxCompute的分區表沒有對應關係。Hologres外部表格不支援分區,但直讀模式下,查詢MaxCompute的Hologres外部表格映射Hologres的分區父表時,查詢條件匹配分區子表的分區列,可以進行分區裁剪。
Hologres外部表格不支援cluster屬性。
Hologres外部表格不支援映射Hologres的Dynamic Table。
支援資料類型
DECIMAL類型限制:
在MaxCompute中建立的Hologres外部表格,
DECIMAL資料類型預設且固定為decimal(38,18),不能修改。如果源表小數位元較少,可以在MaxCompute外部表格中將該列定義為STRING類型,在使用時再通過CAST函數強制轉換。複雜類型限制:
MaxCompute建立的Hologres外部表格,不支援
Array,Map,Struct等複雜資料類型。其他不相容類型:
Hologres中的
MONEY等資料類型,目前在MaxCompute中沒有對應的資料類型,暫時不支援。
詳情如下表所示:
Hologres資料類型 | MaxCompute資料類型 | JDBC讀 | JDBC寫 | 直讀(odps.table.api.enable.holo.table=true) | 說明 |
INTEGER(別名INT或INT4) | INT |
|
|
| 32位有符號整型。 |
TEXT | STRING、VARCHAR |
|
|
| 字串類型,目前長度限制為8 MB。 |
SMALLINT | SMALLINT |
|
|
| 16位有符號整型。 |
INT2 | SMALLINT |
|
|
| 16位有符號整型。 |
BIGINT(別名INT8) | BIGINT |
|
|
| 64位有符號整型。 |
BYTEA | BINARY |
|
|
| 位元據類型,目前長度限制為8 MB。Hologres的 |
REAL(別名FLOAT4) | FLOAT |
|
|
| 32位二進位浮點型。 |
DOUBLE PRECISION(別名FLOAT8) | DOUBLE |
|
|
| 64位二進位浮點型。 |
BOOLEAN(別名BOOL) | BOOLEAN |
|
|
| BOOLEAN類型。 |
TIMESTAMP | TIMESTAMP_NTZ |
|
|
| 儲存精度為納秒,存在時區的時間誤差。 Hologres的TIMESTAMP類型不包含時區,儲存精度為微秒。 |
TIMESTAMP WITH TIME ZONE(別名TIMESTAMPTZ) | TIMESTAMP |
|
|
| 時間戳記類型,精確到納秒,格式為 MaxCompute與Hologres在底層已經進行了精度轉換。MaxCompute輸出不包含時區格式。 |
DECIMAL(別名NUMERIC) | DECIMAL(precision,scale) |
|
|
| 10進位精確數字類型。
MaxCompute的DECIMAL如果未指定精度,則預設為 |
CHAR(n) | CHAR(n) |
|
|
| MaxCompute的 Hologres的 |
VARCHAR(n) | VARCHAR(n) |
|
|
| MaxCompute的 Hologres的 |
DATE | DATE |
|
|
| 日期類型,格式為 |
INT4[] | ARRAY<INT> |
|
|
| 複雜類型ARRAY。 |
INT8[] | ARRAY<BIGINT> |
|
|
| |
FLOAT4[] | ARRAY<FLOAT> |
|
|
| |
FLOAT8[] | ARRAY<DOUBLE> |
|
|
| |
BOOLEAN[] | ARRAY<BOOLEAN> |
|
|
| |
TEXT[] | ARRAY<STRING> |
|
|
| |
JSONB | JSON |
|
|
| 複雜類型 JSON,直讀模式支援。 |
JSON | STRING |
|
|
| 字串類型,目前長度限制為8 MB。JDBC模式支援Hologres的JSON類型。 |
SERIAL(自增序列) | INT |
|
|
| Hologres的自增序欄欄位,MaxCompute可用INT類型接收,但寫入時無法實現自增功能。 |
RoaringBitmap | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
RoaringBitmap64 | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
BIT(n) | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
VARBIT(n) | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
INTERVAL | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
TIMETZ | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
TIME | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
INET | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
MONEY | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
OID | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
UUID | 不支援 |
|
|
| MaxCompute側沒有映射的類型。 |
建立Hologres外部表格
可以通過如下兩種方式建立Hologres外部表格:STS模式和雙簽名模式。
注意事項
外部表格建立規範
如果Hologres開啟了IP白名單功能,使用者需要採用雙簽名模式建立Hologres外部表格。如果用STS模式建立Hologres外部表格,MaxCompute訪問Hologres時會被IP白名單攔截。
對於Hologres的父表、子表,Hologres外部表格中會指定表名,並執行SQL語句。父表、子表都可以映射至Hologres外部表格,但是父表只能讀不能寫。
向Hologres外部表格寫入資料時,暫不支援Hologres的INSERT ON CONFLICT(UPSERT)機制。如果Hologres源表有主鍵,請避免寫入的資料與Hologres源表中的資料產生主鍵唯一性衝突。
表名和欄位名大小寫不敏感,且在建立表、查詢表及欄位時不支援強制轉換大小寫。
Schema相容性
當Hologres源表中的Schema與外表Schema不一致時:
列數不一致:如果Hologres源表中的列數小於外表DDL的列數,則讀取RDS資料時,系統會報錯。例如
column "xxx" does not exist。當Hologres源表中的列數大於外表DDL的列數時,系統會丟棄超出的列資料。列類型不一致:MaxCompute不支援使用INT類型接收Hologres源表中的STRING類型資料,支援使用STRING類型接收INT類型資料(不推薦)。
文法說明
在建立外部表格時,需要在建表DDL語句中指定StorageHandler,並配置STS認證資訊(或開啟雙簽名開關)、JDBC串連地址,以實現訪問Hologres資料來源。
STS模式建立Hologres外部表格
具體使用範例程式碼,詳情請參見建立Hologres外部表格(STS模式)。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);雙簽名模式建立Hologres外部表格
具體使用範例程式碼,詳情請參見建立Hologres外部表格(雙簽名模式)。
雙簽名Hologres外部表格支援相同RAM使用者可以訪問MaxCompute和Hologres對應有許可權的表,不需要再手工授權。同時支援HologresIP白名單能力,便於使用。
-- 開啟雙簽名開關
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- 建立外部表格
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);參數說明
參數 | 是否必填 | 說明 |
odps.sql.common.table.planner.ext.hive.bridge | 是 | 是否通過雙簽名模式建立Hologres外部表格。值設定為 |
否 | 通過STS模式建立Hologres外部表格不需要填寫。 | |
IF NOT EXISTS | 否 |
|
table_name | 是 | 在MaxCompute上建立的Hologres外部表格的名稱。 |
col_name | 是 | Hologres外部表格的列名稱。 |
data_type | 是 | Hologres外部表格的列的資料類型。 |
STORED BY | 是 | 指定StorageHandler,定義如何查詢Hologres外部表格。 固定取值為 |
ram_arn | 是 | 通過STS模式建立Hologres外部表格必填。指定RAM角色的ARN資訊,用於建立外部表格時STS認證資訊的填寫。
|
否 | 通過雙簽名模式建立Hologres外部表格不需要填寫。 | |
LOCATION | 是 | Hologres執行個體的JDBC串連地址。其中:
|
tblproperties | 是 |
|
使用樣本
準備資料
如果已有Hologres資料庫、Hologres表及測試資料,可忽略該步驟。
建立Hologres資料庫
登入Hologres管理主控台,在左上方選擇地區。
在左側導覽列選擇執行個體列表。
若沒有執行個體,需要先購買Hologres執行個體。
在執行個體列表頁面,單擊目標執行個體名稱。
在執行個體詳情頁面,單擊登入執行個體。
單擊上方中繼資料管理頁簽。
單擊建立資料庫,在彈出的對話方塊中,填寫資料庫名稱,其他參數保持預設。
建立Hologres表
在執行個體詳情頁面,單擊登入執行個體。
單擊上方SQL編輯器頁簽。
輸入如下語句
CREATE TABLE IF NOT EXISTS holo ( id INT PRIMARY KEY, name TEXT ); INSERT INTO holo (id, name) VALUES (1, 'kate'), (2, 'mary'), (3, 'bob'), (4, 'tom'), (5, 'lulu'), (6, 'mark'), (7, 'haward'), (8, 'lilei'), (9, 'hanmeimei'), (10, 'lily'), (11, 'lucy'); SELECT * FROM holo ORDER BY id;
建立Hologres外部表格(STS模式)
前置準備
已準備好待建立Hologres外部表格的目標MaxCompute專案。
建立MaxCompute專案資訊,請參見建立MaxCompute專案。
RAM角色建立及授權
由於Hologres不支援將跨主帳號的RAM Role添加至資料庫執行個體,所以Hologres的STS模式普通角色授權只支援同帳號的RAM Role。
相應的,MaxCompute訪問Hologres的外部表格或外部schema,都只支援同帳號的RAM Role。
建立RAM角色
建立RAM角色擷取ARN資訊,用於建立外部表格時填寫STS認證資訊。建立RAM角色的信任主體類型根據實際需求選擇,本樣本中信任主體類型為雲帳號。
雲帳號:阿里雲帳號下的RAM使用者可以通過扮演RAM角色來訪問雲資源,詳情請參見建立可信實體為阿里雲帳號的RAM角色。
身份供應商:通過設定SSO實現從企業本地帳號系統登入至阿里雲控制台,解決企業的統一使用者登入認證要求。詳情請參見建立可信實體為身份供應商的RAM角色。
操作步驟如下:
登入RAM控制台。
在左側導覽列選擇。
在角色頁面,單擊建立角色。
在建立角色頁面,選擇信任主體類型為雲帳號。
信任主體名稱選擇當前雲帳號。
修改信任策略配置內容
在角色頁面,單擊目標角色名稱,進入該角色詳情頁。
在信任策略頁簽,單擊編輯信任策略,在編輯信任策略頁面選擇指令碼編輯頁簽。
參照如下內容修改信任策略配置
修改信任策略配置內容與選擇的可信實體類型相關。其中
<UID>即阿里雲帳號ID,可在使用者資訊頁面擷取。可信實體類型為阿里雲帳號
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<UID>:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }可信實體類型為身份供應商
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::<UID>:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
添加RAM角色至Hologres執行個體並授權
RAM角色需要有Hologres執行個體的開發許可權,才能在許可權範圍內使用Hologres。由於RAM角色預設沒有Hologres管理主控台的查看和操作執行個體的許可權,因此需要阿里雲帳號完成RAM相關許可權授予才能進行後續操作。將RAM角色添加至Hologres執行個體。授權方式及步驟如下:
通過Hologres管理主控台授權
登入Hologres管理主控台,在左上方選擇地區。
在左側導覽列選擇執行個體列表。
在執行個體列表頁面,單擊目標執行個體名稱。
在執行個體詳情頁面,單擊登入執行個體。
單擊上面資訊安全中心頁簽。
在左側導覽列選擇使用者管理。
在使用者管理頁面,單擊右上方新增使用者,在彈出的新增使用者頁面,添加RAM角色至Hologres執行個體。
在DB授權頁簽,為該RAM角色授予執行個體的開發許可權。
若資料庫的權限原則設定為專家模式,則需在使用者管理頁面將角色類型修改為SuperUser,後續將不再需要進行資料庫授權操作。
在左側導覽列選擇DB 授權。
在DB 授權頁面,單擊目標資料庫對應操作列的使用者授權。
在授權頁面,單擊右上方新增授權,在彈出的新增授權對話方塊,選擇RAM角色並配置Developer 使用者組。
通過RAM存取控制台授權
若是通過RAM使用者扮演RAM角色,RAM使用者預設沒有Hologres管理主控台的許可權,需要阿里雲帳號給RAM使用者在存取控制頁面授予AliyunRAMReadOnlyAccess許可權,否則RAM使用者無法在Hologres管理主控台進行任何操作。詳情請參見文檔授予RAM使用者權限。
登入RAM控制台。
在左側導覽列選擇。
在角色頁面,單擊目標角色名稱所在行操作列的新增授權。
選擇AliyunRAMReadOnlyAccess許可權為當前角色授權。
通過SQL方式授權
通過SQL方式進行授權,授權SQL請參見Hologres許可權模型。
在MaxCompute中建立外部表格
登入MaxCompute用戶端,進入目標MaxCompute專案。
執行如下命令建立Hologres外部表格。
按照準備資料步驟,準備好的Hologres執行個體資訊如下:
Hologres資料庫名稱:
holo_external_test。Hologres資料庫的Schema:
public。Hologres表名稱:
holo。Hologres資料庫傳統網路串連地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc ( id bigint, name string ) stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );執行如下命令基於建立的Hologres外部表格查詢Hologres源表資訊。
-- 訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --開啟JDBC直讀方式 -- 查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc limit 10; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+基於Hologres外部表格與Hologres進行資料交換、聯合分析。
將MaxCompute加工後的資料利用Hologres外部表格,寫入Hologres實現加速分析、線上服務。命令樣本如下。
-- 訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; --開啟JDBC直讀方式 -- 向Hologres外部表格插入資料。 INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- 查詢Hologres外部表格資料。 SELECT * FROM my_table_holo_jdbc; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+頻繁更新的維度資料表儲存在Hologres,滿足即時動態更新需要。MaxCompute通過外部表格方式訪問維度資料表與MaxCompute中事實表進行關聯分析,命令樣本如下。
-- 訪問Hologres外部表格需要添加如下屬性。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; -- 建立MaxCompute內部表。 CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; -- MaxCompute內部表與Hologres外部表格進行關聯分析。 SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id; -- 返回結果。 +------------+------------+------------+------------+ | id | name | id2 | name2 | +------------+------------+------------+------------+ | 9 | hanmeimei | 9 | hanmeimei | | 4 | tom | 4 | tom | | 7 | haward | 7 | haward | | 2 | mary | 2 | mary | | 5 | lulu | 5 | lulu | | 12 | alice | 12 | alice | | 8 | lilei | 8 | lilei | | 10 | lily | 10 | lily | | 1 | kate | 1 | kate | | 11 | lucy | 11 | lucy | | 6 | mark | 6 | mark | | 3 | bob | 3 | bob | +------------+------------+------------+------------+
建立Hologres外部表格(雙簽名模式)
雙簽名是MaxCompute和Hologres共同研發的認證及鑒權協議,在MaxCompute側使用帳號登入資訊加簽名後,把認證資料傳遞給Hologres側,Hologres根據MaxCompute底層達成的協議,進行同名認證及鑒權。因此,只需在MaxCompute與Hologres中使用相同的帳號,便可直接進行外部表格訪問,無需額外設定認證資訊。
前置準備
已準備好待建立Hologres外部表格的目標MaxCompute專案。
建立MaxCompute專案資訊,請參見建立MaxCompute專案。
Hologres中存在跟MaxCompute相同名稱的帳號,並且該帳號具有Hologres中對應表的讀寫權限。
僅Hologres V1.3及以上版本支援MaxCompute使用雙簽名模式建立Hologres外部表格,目前雙簽名模式只支援從Hologres外部表格中讀取資料,不支援寫入資料至Hologres外部表格。
在MaxCompute中建立外部表格
登入MaxCompute用戶端,進入目標MaxCompute專案。
執行如下命令建立Hologres外部表格。
按照準備資料步驟,準備好的Hologres執行個體資訊如下:
Hologres資料庫名稱:
holo_external_test。Hologres資料庫的Schema:
public。Hologres表名稱:
holo。Hologres資料庫傳統網路串連地址:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
-- 建立外部表格 CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );查詢外部表格
-- 查詢外部表格(必須與開啟雙簽名開關命令一起執行) SET odps.sql.common.table.planner.ext.hive.bridge=true; SELECT * FROM holo_mc_external_dbl; -- 返回結果。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+
開啟Hologres外部表格儲存直讀功能
MaxCompute對Hologres外部表格的讀通過JDBC模式實現,目前版本支援MaxCompute直讀Hologres儲存層,能夠帶來以下優勢:
可以大幅降低讀表的延遲,顯著提高查詢資料的速度。
可以大幅度減少Hologres FE的串連數,大多數Query僅需要一個串連數。
使用限制
當開啟Hologres直讀模式時,使用限制如下,在條件不滿足時會回退到JDBC模式。
版本要求
Hologres執行個體版本必須為V1.3.34及以上。低於V1.3.34的版本不支援直讀功能。
表類型限制
不支援直讀Hologres冷存表。
不支援直讀Hologres行存表。
資料類型映射限制
MaxCompute直讀模式使用Timestamp類型映射Hologres中的Timestamp With Time Zone類型會存在細微的時間誤差,具體差異如下:
時間值誤差
Hologres中Timestamp With Time Zone類型列的時間在
1900-12-31 15:54:15之前,MaxCompute查詢出來的時間會多5分44秒。Hologres中Timestamp With Time Zone類型列的時間在
1900-12-31 15:54:16和1969-12-31 23:59:58之間,MaxCompute查詢出來的時間會多1秒。Hologres中Timestamp With Time Zone類型列的時間在
1969-12-31 23:59:59之後,MaxCompute查詢出來的時間與Hologres中的無區別。
時區位移
以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為
2000-01-01 00:00:00,MaxCompute查詢出來的時間為2000-01-01 08:00:00。以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為
1969-01-01 00:00:00,MaxCompute查詢出來的時間為1969-01-01 08:00:01。
同Region限制
由於網路連通性限制,只支援同Region的MaxCompute訪問Hologres執行個體。跨Region訪問會報錯:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3。當Hologres配置為主從架構,僅支援配置串連URL為主執行個體,不支援配置為從執行個體。
Foreign Server模式存在的額外限制:MaxCompute專案需要開啟Schema級文法開關。
開啟方式
在MaxCompute中查詢Hologres外部表格時SQL前加上如下參數。
SET odps.table.api.enable.holo.table=true;設定專案粒度直讀開關。
-- 開啟直讀開關 和直讀時關閉回退成jdbc 都可以設定為專案粒度。
-- 專案粒度開啟直讀開關:
setproject odps.table.api.enable.holo.table=true; --true開啟|false關閉
-- 關閉預設回退JDBC的開關:
setproject odps.table.api.allow.fallback.jdbc=false; --true回退|false不回退直讀驗證
可以在Logview裡查看日誌,判斷查詢是否走了直讀模式,Logview使用詳情請參見使用Logview 2.0查看作業運行資訊。
在Logview的Summary頁簽下,尋找external holo tables欄位查看屬性,屬性格式如下:
<project_name>.<table_name>:<訪問方式>[<(回退原因)>]參數說明:
參數 | 說明 |
project_name | 專案名稱。 |
table_name | 表名稱。 |
訪問方式 | 外部表格的訪問方式,取值如下:
|
回退原因 | 如果訪問方式為
|
開啟了直讀模式啟動並執行任務,偶然觸發直讀限制情境,任務會回退成JDBC模式。如果直讀時業務負載比較大,回退成JDCBC模式會佔用大量的Hologres串連池資源,且JDBC方式資料轉送效率遠低於直讀,佔用資源釋放也會比較慢。
需要關注直讀回退成JDBC方式後,會對Hologres執行個體造成負載壓力,極端情況下會因為大量回退的作業影響其他業務訪問Hologres執行個體。為了預防這種情況,可以提前通過在直讀任務中增加運行參數set odps.table.api.allow.fallback.jdbc=false;關閉自動回退,避免非預期影響。
Hologres資料匯入匯出
常見問題
通過MaxCompute直讀Hologres資料時,報錯ODPS-0130071,如何解決?
問題現象
直讀Hologres資料時,報錯
ODPS-0130071 Failed to split to equal size...max count: 7777。例如:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777產生原因
MaxCompute直讀Hologres中的資料時,按照預設的拆分Mapper策略(輸入資料量/split.size 256MB),導致任務產生的Mapper並發數超過了最大限制數7777。
說明該限制是防止使用者直接提交產生大量Mapper任務,從而對Hologres檔案或網路連接的穩定性產生影響。
解決措施
您可以通過設定以下參數,解決報錯問題。
SET odps.external.holo.mapper.instances=10000; -- 提高並發上限,最高不超過10000。 SET odps.sql.mapper.split.size=512; -- 調整任務並發數,最高不超過512M
基於Hologres外部表格執行SQL作業時,運行慢,如何解決?
使用SDK搜尋MaxCompute外部表格資料速度慢。
問題現象
使用SDK搜尋MaxCompute外部表格資料速度慢。
解決措施
外部表格僅支援全量搜尋,所以較慢,建議您改用MaxCompute內部表。
當Hologres側使用關鍵字作為列名時報錯,如何解決?
問題現象
當Hologres側使用關鍵字作為列名,如果不加特殊配置,會出現如下報錯:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","解決措施
添加參數映射Hologres源表和Hologres外部表格欄位關係:
odps.federation.jdbc.colmapping。例如:Hologres源表包含關鍵字欄位
"offset",則建立Hologres外部表格時需要添加參數為'odps.federation.jdbc.colmapping'='offset:"offset"'。
相關文檔
Hologres外部表格常見問題詳情,請參見湖倉一體/外部表格常見問題。

