阿里云交互式分析(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关联:
- MaxCompute工作空间列表中,点击“工作空间配置",在新窗口点击更多配置,进入工作空间管理。
- 在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。
有两种方式处理:
- 打开chrome devtools,在network中选中disable cache。以后每次刷新页面时先打开devtools、再刷新页面即可。
- 进入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/台/年
以上。感谢您的阅读。
待更新:
- 添加更多新问题和解决方案