阿里雲交互式分析(Hologress)的常見問題

阿里雲交互式分析(Hologress),可用於數倉查詢加速。

因其底層採用(借鑑)了postgreSQL引擎,所以在語法、問題解決方案上,有很多是互通的。
其jdbc配置方式與PG完全一致,可參考《JDBC連接PostgreSQL》

下面列舉常見問題。

下列問題從2020年1月開始陸續整理。考慮官方會陸續優化,問題和方案存在過時可能。
建議先按官方文檔使用和排查,如未解決再通過本文解決問題。

實例管理

關聯MaxCompute項目

HoloStudio中,找不到MaxCompute項目

Holo實例使用前,需與MaxCompute關聯。
在關聯前,可以在Holo中先建立一個真正要用的數據庫,提高關聯操作的效率。

下面開始關聯MaxCompute項目和Hologress實例。

MaxCompute項目首次配置Holo

如果工作空間是首次配置Holo,需要開通Holo服務,要在MaxCompute工作空間列表中處理:
在這裏插入圖片描述
在這裏插入圖片描述
點擊下一步,會進入Holo實例關聯頁面。關聯頁面的操作邏輯,見下個章節的介紹。

非首次開通Holo

如果是已經開通過Holo的項目,有兩種方式進入Holo關聯:

  1. MaxCompute工作空間列表中,點擊“工作空間配置",在新窗口點擊更多配置,進入工作空間管理。
    在這裏插入圖片描述
  2. 在HoloStudio中,點擊右上角工作空間管理,進入MaxCompute工作空間管理
    在這裏插入圖片描述

兩種方式最終都會進入工作空間配置頁面。在該頁面中,可以找到交互式分析的配置,直接綁定交互式分析DB,參見下圖:
在這裏插入圖片描述
點擊綁定,會打開Holo實例關聯的窗口。關聯頁面的操作邏輯,見下個章節的介紹。

關聯配置

在彈出窗口輸入信息,即可完成綁定。
在這裏插入圖片描述

MaxCompute項目無法開通Holo服務

前面提到過Holo中使用MaxCompute項目,需要提前在MaxCompute項目中關聯Holo服務。
如果你在MaxCompute項目關聯Holo時,選擇Holo實例的下拉框無內容、但實際上有Holo實例,可能是因爲該實例已經被其他項目配置。

在Holo的設計上,Holo實例/庫,與MaxCompute項目是多對多的關係。
但暫時頁面上只支持一對一配置:即一旦一個Holo實例關聯了MaxCompute項目,則不能被其他項目關聯。
阿里雲正在優化該配置,同時一旦Holo實例關聯過MaxCompute項目,那麼該阿里雲賬號下、同地域的項目都可以直接使用了。
在這裏插入圖片描述

若無Holo實例請先行購買。有否實例可在Holo實例列表中查看

HoloStudio

存在多個Holo實例,在studio中怎麼找不到第一個實例

在數據開發中的文件夾中、以及PG管理中,會顯示所有Holo實例的庫。
在這裏插入圖片描述 在這裏插入圖片描述
如果新建的實例沒有Holo庫,那麼這裏是不會顯示的。

另外該頁面有比較頑固的緩存,建議清理cache後刷新頁面查看。

清理緩存有個快速的方式:打開chrome devtools,在network中選中disable cache。以後每次刷新頁面時先打開devtools、再刷新頁面即可。
在這裏插入圖片描述

數據開發的文件夾展開後沒有內容

如果確定文件夾下添加過內容,那麼很可能你遇到了一個頁面處理的bug。

有兩種方式處理:

  1. 打開chrome devtools,在network中選中disable cache。以後每次刷新頁面時先打開devtools、再刷新頁面即可。
    在這裏插入圖片描述
  2. 進入HoloStudio後,不要做任何操作,先進入PG管理、展開表。再回到數據開發,展開文件夾即可看到內容。親測過該方法有效,但偶爾也會失敗,所以個人推薦第一種方法。

我的理解這是阿里雲頁面的BUG,但官方尚未反饋有修復計劃。

賬號權限

下列權限問題,在2020年2月前尚未支持。官方有優化計劃,具體見阿里雲通知。

專家模式與簡單權限模式的區別

簡單權限模式有預置的角色/權限組,可以通過將用戶添加到角色/權限組,快速實現用戶權限設置。
專家模式則只有默認的權限項,你可以給任意用戶設置任意權限,也可以自己做角色/權限組、實現類似簡單權限的模式。

總結:

  • 前者可以快速上手、能滿足大部分DB日常管理需要。可通過Holo實例管理頁面完成授權管理,也可以通過命令行管理。
  • 後者靈活,適合管理複雜多樣的場景。只能通過命令行管理。

賬號不存在

Caused by: org.postgresql.util.PSQLException: FATAL: role "[email protected]:xx_user" does not exist
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2497)
	at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2618)
	at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:135)
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:250)
	at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
	at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
	at org.postgresql.Driver.makeConnection(Driver.java:458)
	at org.postgresql.Driver.connect(Driver.java:260)
	at org.apache.commons.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:39)
	at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:256)
	at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2301)
	at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2287)

上面這個問題,表示沒有用戶和角色(用戶和角色的區別到底是啥呢?都是create user,是按能否登陸區別user和role?但權限的部分完全一樣?)。
實際上已經用官方文檔說明的create user "p4_賬號uid(RAM頁面獲取的xx_user的uid)";方式添加過用戶;看到這個提醒,懷疑上面這個無效,用CREATE USER "[email protected]:xx_user"的方式再添加了一遍,就不提示無用戶了。

沒有表權限

上面問題解決後,又遇到了java.sql.SQLException: ERROR: permission denied for foreign table xxx錯誤。

先檢查holostudio權限的配置:
我是通過GRANT SELECT,INSERT,UPDATE ON ALL TABLES IN SCHEMA public to PUBLIC;的方式給所有用戶授權了,在HoloStudio運行SQL查詢是正常的。

  • to PUBLIC是指授給所有用戶;
  • holo目前還不支持create schema,默認的schema是public。這個schema與mysql的schema不是一個概念:MySQL schema等同於database,holo的schema與其他對象的關係如下:
    在這裏插入圖片描述

在jdbc中還是會報錯。最終在url中添加preferQueryMode=simple&tcpKeepAlive=true參數後,權限正常。

語法

Holo不支持`字符和COMMENT關鍵字

`字符直接去掉即可,Holo的保留字限定範圍很小,幾乎不會重複。
COMMENT去掉。

表和數據類型

Holo外部表與ODPS表列無需完全對應

無需對應的部分是指:

  • 外部表的字段可以比ODPS表少
  • 外部表名稱與ODPS表無需保持一致

需要嚴格對應的部分有:

  • 外部表與ODPS表的分區列一定要一致
  • 外部表中列的類型與ODPS表的列要保持一致

注意:201903最新測試發現,HOLO表與ODPS表的列順序要保持一致,否則查詢所有列時(select *)會報錯,指定列查詢則無該問題。
錯誤日誌類似這樣:

執行失敗,失敗原因:ERROR: Query:[20010311602666746] Get result failed: 
		expected column type Oid:25, however real type Oid:20 of data row whose column index:1

HoloStudio的pg管理支持一鍵映射外部表,但容易出錯

一旦有類型映射不同,pg管理中會直接報錯。

  • 這裏支持的類型與實際支持類型會有出入。
  • 會映射全部字段,如果odps表存在holo不支持的類型、但其實Holo本身也不需要的字段,會導致映射失敗。

因爲上述問題,使用一鍵映射要注意類型問題。 如果暫時建議還是使用數據開發手工組織ddl腳本。如果有一天該功能支持了自動更新schema,可以再用起來。

一鍵映射外部表,不支持指定schema

一鍵映射頁面並未提供單獨指定schema的輸入框,但我們可以在輸入holo表名時加上schema作爲前綴,如下圖:
在這裏插入圖片描述
看生成的ddl,可以確定這個方式的腳本是可行的。
但holo studio編輯器顯示有些問題,創建完會顯示掛在public schema下面,點一下pg管理的刷新按鈕即可。

數據類型1

ODPS2開始,已經新增了較多的數據類型,如tinyint、date、decimal等。但Holo對ODPS的支持並未完全同步,官方文檔說明了映射關係:
在這裏插入圖片描述
但實測後有如下問題:

不支持tinyint、smallint類型

holo完全不支持這三種類型:
tinyint和smallint,需要在odps表中的列類型改爲int或bigint,才能通過holo訪問表。

官方文檔說smallint可以轉化爲int2,親測尚未支持。

注意:
odps表的類型一定要改掉。odps不改、只在holo ddl中修改,雖然Holo外部表可以建立,但執行時會報錯:ERROR: Query:[20051919746691163] Get result failed: expected column type Oid:23, however real type Oid:21 of data row whose column index:1

不支持date類型

date類型建議在odps表改爲STRING或DATETIME。

在holo ddl中直接聲明爲date不會報錯,但一旦使用該列作爲條件或結果,會報錯:
ERROR: Query:[20032452110981017] Get result failed: exec sql failed => status:7 msg:ERROR: AXF Exception: Open ORC file failed for schema mismatch. Reader schema: column_xxx1:VT_INTEGER,column_xxx2:VT_INTEGER,column_xxxn:VT_INTEGER
這個錯誤是看不出任何關係的,查了好久。

不支持DATETIME類型,但可以轉化爲TIMETAMPTZ

即帶時區的時間類型,timestamptz等價於timestamp with tz

不支持STRING類型,但可以轉化爲TEXT

語義和效果一樣,只是關鍵字的區別。

精度問題

Holo外表使用numeric和decimal時,對精度無嚴格校驗。但內表會嚴格校驗精度,如果未寫精度則會報錯:
[Parsing Error]: Please always specify the precision and scale explicitly(0 <= scale <= precision, 0 < precision <= 38)
如果odps表只是使用了BigDecimal,並無特殊精度設計,Holo中對應的類型可聲明爲numeric(38,18)

常見的類型聲明錯誤

  • 如果是HOLO不支持的類型,在holoStudio寫DDL時就會提示。
  • 如果是ODPS類型與HOLO類型映射錯誤,在SQL運行時纔會提示,錯誤日誌如下:
    ERROR: Query:[20051919746691163] Get result failed: expected column type Oid:23, however real type Oid:21 of data row whose column index:1

性能問題

不要使用默認數據庫postgres

holo實例默認會建一個postgres庫,但該庫分配資源少。
官方建議新增一個數據庫用來處理實際業務,可參考《在HoloStudio中新增數據庫》

如果在HoloStudio中看不到新增的庫,可能有兩個原因:

  • 沒有刷新HoloStudio頁面
  • 新增庫後,刪掉了postgres庫的關聯,可能會導致該問題

掃描分區數默認不超過50個

如果執行SQL時遇到下面的報錯:

ERROR: Query:[20011148508652324] Get result failed: 
	exec sql failed => status:7 msg:
		ERROR:  AXF Exception: specified partitions count in odps table: odps_workspace.table_xxx is: 89, 
		        exceeds the limitation of 50, please add stricter partition filter or set axf_odps_partition_limit.

這表示你掃描的分區超過了默認限定的50
Holo出於檢索效率、內存資源的考慮,限制掃描分區數默認不超過50個,最大不能超過1024個。
對於這個限制有幾種解決方式:

  • 優化分區裁剪

  • 使用cluster table替代分區
    odps的cluster table,多bucket可以實現並行計算,只是不能像分區可以重建。按業務情況選用

  • 調大默認配置,如使用命令set seahawks.axf_odps_partition_limit = 512,或聯繫阿里雲技術支持後臺調整。
    使用命令注意:

    • 命令對session有效,意味着每次查詢前都要執行。
    • 該命令在HoloStudio終端菜單中可執行、SQL開發中不能執行。JDBC在執行查詢語句前,先執行該句。

    MyBatis中在sql前加上這句是不行的,需要使用同個連接、在執行sql前單獨執行一次該語句。

    該方式的問題在於:掃描的分區多了,查詢時性能肯定會變差,這個要做好權衡。

  • 外部表改爲內部表
    按官方說法,內部表效率比外部表高十倍,親測過同樣的sql通過內表查詢能提升3~10+倍,不過也要結合後臺資源分配來看。
    使用內部表,需要配置odps到holo的數據同步任務,並且需按分區指定增量同步。這上面會有額外的開發工作,也需要單獨購買Holo的存儲資源。

外部表查詢容易OOM

如果你遇到了如下錯誤,則表示holo內部出現了OOM異常:

### Cause: java.sql.SQLException: 
	ERROR: Query:[10001157026468764] Get result failed: exec sql failed => status:7 msg:
		ERROR:  Error dispatching to seg123 11-199-8-163.changba-102-hm.default.svc.cluster.local:22342 pid=55615: (dispatcher.c:1874)
				 SQL: [select xxx from table_xxx where xxx;]; 		
				 uncategorized SQLException for SQL []; SQL state [XX000]; error code [0]; 
				 	ERROR: Query:[10001157026468764] Get result failed: exec sql failed => status:7 msg:ERROR:  Error dispatching to seg123 11-199-8-163.changba-102-hm.default.svc.cluster.local:22342 pid=55615: (dispatcher.c:1874)
  • 後臺調整外部表分配比例
    要聯繫小二評估實際情況,決定是否給調整
  • 提高holo實例配置

資源佔用超過規格報錯

執行一個SQL遇到了如下報錯:

ERROR:  XX000: Query:[10140720581564794] 
	Get result failed: exec sql failed => status:7 msg:
LOCATION:  HoloExecutorRun, holo_backend.cpp:575

溝通小二確定是執行SQL時調用的資源超過了規格佔用資源報錯。
實際上Holo的CPU資源是共享的,超過一點沒關係,但我的超過了20%、而且執行了很久,所以被終止了。

HOLO服務端問題

could not translate host name "xxx" to address: Name or service not known

遇到過一個Holo服務端在調整、導致holo查詢報錯的問題:

connect [xxx-in-shanghai-117-shkm.default.svc.cluster.local:22340] failed:could not translate host name "xxx-in-shanghai-117-shkm.default.svc.cluster.local" to address: Name or service not known

該問題原因是服務端在調整配置,重啓生效期間會出現該錯誤。

An I/O error occurred while sending to the backend

該問題原因可能比較多,服務端進程掛掉就會拋出這個錯誤。
列舉幾個目前遇到過的問題:

  • odps表有三級分區,holo外表查詢報錯。該問題阿里雲反饋已修復。
  • odps表有多級分區,但holo外表只映射了部分。當sql查詢時,如果實際掃描分區超出限制,不會報掃描分區數超限,反而會報IO異常。
  • 其他未知情況可能導致的服務端進程掛掉,猜測可能有負載過高等等。

費用問題

通過Holo外表查詢MaxCompute(ODPS)的數據,不會在ODPS產生任何費用。

Holo自身按存儲和計算資源收費,建議購買前做一些壓測確定所需規格。
定價鏈接見:https://help.aliyun.com/document_detail/113666.html,最早按年並沒有優惠,購買時多留意下。

另附阿里雲產品的優惠鏈接,有需要的自取。

  • 阿里雲¥2000紅包
  • ECS 8月特惠2折,低至¥500/臺/三年
  • ECS 3折特惠,低至¥300/臺/年

  • 以上。感謝您的閱讀。

    待更新:

    • 添加更多新問題和解決方案

    1. Hologress數據類型 ↩︎

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