Python中文社区 2017-07-06
背景:
之前各种数据开发、数据支持、数据挖掘都在同一个项目中,随着公司规模的不断壮大,参与大数据开发的部门(团队)也越来越多,单项目的弊端慢慢显现出来:
弊端:
权限管理混乱,任务和数据经常被他人修改、覆盖
开发人员众多,水平参差不齐,任务依赖比较混乱,一旦有任务失败,会导致多条业务线无法正常产出数据
争抢计算资源,导致重要任务因抢不到资源无法如期完成
由于人员众多数据权限设置不规范,常常都是给多个角色权限的,风险比较高
各团队成本核算问题,无法准确评估各个团队所占用的资源情况
基于以上的种种弊端,经评估决定引入多个项目,先来个整体架构图
多项目架构图:
这样子各个团队都有自己的项目,自己管理自己的项目,优点就很明显
优点
通过项目隔离,有效的防止数据和任务被其他团队修改和删除等问题
除非是pro项目任务出错,否则不会影响到其他业务线的任务,最大程度降低各业务间的影响
针对不同的项目可以配置不同的收费策略:例如mining项目,可能只有当做数据挖掘的时候会消耗大量的计算资源,而通常可能一周才会训练一次;因此按量计费会比较划算,也避免抢占其他项目任务的资源(计量计费说明参看:https://help.aliyun.com/document_detail/27989.html?spm=5176.doc35455.6.557.7aee7V)
各个项目的资源独立计费,每个团队的资源消耗情况如下图各个项目所使用情况一目了然
各个项目由各自团队管理,减少项目管理员的工作量,并且可以根据各自团队的实际情况细分权限
虽然有以上这些优点,但是同时也会带来其他的不便
缺点
项目间的数据表,资源,udf共享(主要还是读操作)
解决方案
现在介绍如果解决跨项目带来的不便:
MaxCompute有个package的概念,现在我就通过命令行的方式向大家介绍如何通过package来解决跨项目的共享问题:**以pro项目中的Table共享给其他项目:BI为例**(其他项目类似)
操作步骤
在pro项目中创建1个package (可根据实际情况创建,我这边是创建3个package:tables_package,functions_package,resources_package) 命令是: use pro ; create package tables_package;
(以下以tables_package为例,其他的类似)
往tables_package中添加数据表(function,资源): add Table ** to package tables_package ;
( add function ** to package function_package ; | add resource ** to package resources_package ;)
在pro项目中允许其他(BI)项目install package 包: allow project BI to install package tables_package;
在BI项目中,安装package tables_package 包: use BI ; install package pro.tables_package ;
在BI项目中,授权给用户或角色:use BI ; grant read on package pro.tables_package to user [email protected];
(具体授权可以参考MaxCompute官方帮助文档:https://help.aliyun.com/document_detail/27935.html?spm=5176.doc27807.2.6.D6aL6R)
在B项目从查询tables_package所包含的表、资源、UDF: desc package pro.tables_package;
在B项目中使用pro项目的表,udf: select pro:udf() from pro.table where **** ;
udf调用时项目名加冒号pro:udf(),表调用时项目名加点pro.table.
需要注意的是: 第5项这样是针对特定的人或角色,我们目前的做法是将pro项目下的表和udf以只读的方式共享给其他的项目的所有成员,因此可以通过Policy授权的方式统一授权只读权限给B项目下的所有人(policy相关的官方文档:),方法如下:
use BI; install package pro.tables_package; put policy /tmp/policy.txt;
/tmp/policy.txt内容如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "odps:Read",
"Resource": [
"acs:odps:*:projects/BI/packages/pro.functions_package"
]
}
]
}
最后在这提出一点可以再改进的地方:
在pro项目中新增表的时候,希望能够自动add到对应的package里,免得每新建一张表就得再执行add table *** to package *** ;
以上是我公司在使用MaxCompute的一个最佳实践