阿里云交互式分析(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数据类型 ↩︎

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