一、高频问题及痛点
quickbi官网显示配置maxcompute数据源提示需要购买实例的账号ak
根据用户所在企业所承担的角色责任不同,问题分为 1.业务分析人员 和 2.数据管理或架构人员 两种情况:
- 管理员不提供主账号ak;多次索取主账号ak,易泄露,多个项目数据安全无法保证。(主账号拥有多个maxcompute项目、及项目下所有对象的所有权限,泄露风险较高)
- 有且仅有子账号ak,公司仅一个quickbi实例,多条业务线、总分公司分析人员通过工作空间区分
- 能否和rds-mysql一样通过子(其他)账号的ak配置数据源?
- 子账号ak可以通过联通性测试但数据表列表为空或不全,怎么配置权限?
- 管理员负责配置主账号ak的数据源,提供数据集供使用
- 分析师对业务分析宽表维度要求高,需求多变,如通过“数据集”模块控制权限,授予qbi分析师角色的人员需提工单到开发角色生成数据集后并授权,时效过长,灵活性差。
- 给予分析人员开发角色可以改善数据宽表灵活性的问题,但主账号配置的数据源权限过大,会看到数仓dws层以外的明细表并创建新的数据集,导致“数据集”模块行级权限失效;同时“数据准备”模块拥有所有表的写入权限,可能会存在操作不规范、意外清空库表的情况。
二、解决方案
- 数据源连接串配置使用maxcompute项目中的RAM子账号的ak进行连接串配置
- 在quickbi“用户管理”模块中用户类型设置为“开发者”,相应工作空间成员设置为“开发权限”
- 根据使用quickbi的不同功能在maxcompute项目中授权给子账号不同quickbi功能所需要的权限(权限及说明见下表)
- 项目级权限CreateInstance,List,CreateTable
- 表级权限仅授权dws层的指标汇总表、dwd层的事实及事件明细表、维度码表的Describe及Select权限(尽量授权个人ACL权限且不授权公共角色的Policy权限确保权限控制精准)
- 需要用到数据准备模块的业务线同事仅进行新建表的数据库写入
这样配置在可以同时兼顾主账号及库表安全性,分析所用数据集宽表的灵活性,下级分公司行级权限的约束性
权限级别 |
权限名 |
权限说明 |
qbi对应模块需要 |
项目级 |
CreateInstance |
执行实例SQL作业 |
数据集及仪表板等报表模块 |
List |
查看项目类型列表,show tables |
数据源、数据集 |
|
CreateTable|Write |
建表权限 |
数据准备 |
|
表级 |
Describe |
元数据信息 |
数据源、数据集 |
Select |
查询 |
数据集及仪表版等报表模块 |
|
ALL |
全部权限,主要是写 |
数据准备 |
三、实现案例
1、账号及mc项目基础配置
- maxcompute项目:quickbi_odps_test
- 阿里云主账号:ALIYUN$liupai.lp
- bi分析及报表专用-阿里云RAM子账号:RAM$liupai.lp:xiaos
- 创建maxcompute分析及报表用专用角色“biuser”
- 创建dataworks自定义角色“报表用户”并配置maxcompute项目中的角色“biuser”
- 在quickbi组织成员中添加RAM用户xiaos,并授予“开发者”权限
- 新建工作空间bi_works(若存在则跳过)
- 在bi_works的工作空间内添加用户xiaos,并赋予开发权限
- 使用RAM账号xiaos的accessid和accesskey配置odps数据源
- 项目中存在 d_cust 客户表、d_sales_amt 销售表、table_main 主账号临时测试表均为高权限主账号创建
-- 客户表 CREATE TABLE IF NOT EXISTS d_cust( cust_id INT ,cust_name STRING ,level STRING ,randn FLOAT ) PARTITIONED BY (dt STRING ); -- 销售表 CREATE TABLE IF NOT EXISTS d_sales_amt( event_id INT ,cust_id int ,pay_time DATETIME ) PARTITIONED BY (dt STRING ); -- 主账号创建临时测试表 CREATE TABLE IF NOT EXISTS table_main ( col1 String ,col2 STRING ,col3 INT )partitioned by (dt STRING);
2、权限配置操作
a、数据源模块
- 授予数据源模块可用数据表清单的相关权限
-- 授予project List -- 授予table d_cust和d_sales_amt Describe 权限 GRANT List ON PROJECT quickbi_odps_test to USER RAM$liupai.lp:xiaos; GRANT Describe ON table d_cust to USER RAM$liupai.lp:xiaos; GRANT Describe ON table d_sales_amt to USER RAM$liupai.lp:xiaos; -- 查看用户的权限 SHOW GRANTS for RAM$liupai.lp:xiaos;
- 可以看到xiaos存在项目的List的查看项目类型列表权限以及[d_cust,d_sales_amt]的获取元数据权限
- 在点击数据源同步按钮并同步完成后,可以看到该数据源根据用户的权限匹配出了[d_cust,d_sales_amt]两张表
b、数据集模块
- 授予数据集模块预览数据的相关权限
-- 授予用户 创建实例 的权限 GRANT CreateInstance ON PROJECT quickbi_odps_test to USER RAM$liupai.lp:xiaos; -- 授予用户 相关业务表 查询的权限 GRANT Select ON table d_cust to USER RAM$liupai.lp:xiaos; -- 查看用户的权限 SHOW GRANTS for RAM$liupai.lp:xiaos;
- 可以查看xiaos存在项目的CreateInstance的创建实例的权限及相关业务表的查询权限
- 可以正常预览并创建数据集进行报表及图表的加工
c、数据准备模块
- 授予该用户 CreateTable
-- 授予客户物理表创建的权限 GRANT CreateTable ON PROJECT quickbi_odps_test to USER RAM$liupai.lp:xiaos; GRANT Write ON PROJECT quickbi_odps_test to USER RAM$liupai.lp:xiaos;
- 利用数据准备模块,根据已有权限的表进行轻量级ETL的加工,手动或周期性写入数据库表中:写入表需宣导分析师用户使用自建表
- 该RAM用户仅作为数据准备所创建的表[qbi_etl_test]的ObjectCreator,数仓中其余的明细表或维度表并无写入、删除等高危权限
四、常见报错解析
1、数据源模块
- 重复提交同步元数据请求
maxcompute数据源受到源端限制,同步速度较慢,周期为1小时自动更新一次;手动点击同步按钮一段时候后刷新页面即可显示同步结果,同步时常与配置数据源中项目内物理表的数量有关。
2、数据集模块
- 数据预览失败
数据集的预览相当于数据库客户端,需要RAM用户具备项目执行实例[CreateInstance]及相关表的查询[Select]权限才能查询数据结果并展示。
对于maxcompute数据源分区表在数据预览时被限制不允许全表扫描[specify partition predicates],可以通过如下三种方式:
- 直接从左侧数据表拖拽的数据源,可以通过配置过滤条件正常预览
- 直接从左侧数据表拖拽的数据源,直接点击保存,在数据集模块找到该数据集,将数据集属性中的“全表扫描”功能打开
- 可以通过配置自定义sql结合where条件的方式指定分区键的取值以跳过全表扫描的限制
由于quickbi侧数据预览模块limit关键词的限制,通过设置会话级参数set odps.sql.allow.fullscan=true;的方式不能达到全表扫描的效果
3、数据准备模块
- ETL作业执行失败:the agent task execution failed
maxcompute数据源相关数据处理都要注意分区表fullscan的问题,上述etl任务执行失败需在源端数据配置模块按分区键进行设置,并确认“输入过滤”模块右下角的语法正确性检测为绿色对勾