Power BI Embedded自动缩放容量,为公司每个月节省上万元
哎,不知道今年行情怎么就这样了,大厂一边大批毕业生,一边大量招人。难道是今年的新人便宜?就连道哥(吴翰清,阿里P10,中国顶级黑客)都从阿里离职了,当年年少不懂学计算机,就是想当一名白帽子的。。。
在上一篇文章[[Power BI许可证差异(免费、Pro、PPU、Embedded、Premium)]]中有介绍Power BI各个版本的功能差异,其中有介绍当人数超过80人时,从成本上讲是推荐Power BI Embedded的,Power BI Embedded不同的SKU价格也是不同的,具体使用哪个SKU价位层不止和使用人数有关,和报告的模型复杂度也是有关的,具体哪个容量符合使用,可以进行压力测试,可参考以下博客:Power BI Embedded: Stress Testing & Capacity Planning – Data on Wheels – Steve & Kristyna Hughes — Power BI Embedded: Stress Testing & Capacity Planning – Data on Wheels – Steve & Kristyna Hughes (wordpress.com)
比如高峰期有1000人同时访问,这时可能至少要A3容量才符合,但是下班时间,或者周末,可能最多才会有几十个人同时访问,这时可能A1容量就可以满足要求。微软Azure云服务最大的好处就是弹性的,可缩放,当需求量大量采用A3,需求量低时采用A1甚至暂时关闭都是可以的。我们可以手动在网页端进行容量的更改,但这并不够智能,人也不可能总是记得去更改容量。
Power BI Premium是支持自动缩放容量的,但是也是单独收费的Using Autoscale with Power BI Premium – Power BI | Microsoft Learn — 将自动缩放与 Power BI 高级版结合使用 – Power BI |微软学习
那么Power BI Embedded要怎么自动缩放容量呢?继续查找微软的文档,缩放 Power BI Embedded 容量 – Power BI | Microsoft Learn文档显示是有REST API可供调用的
继续查看文档Capacities – Update – REST API (Azure Power BI Embedded) | Microsoft Learn — 容量 – 更新 – REST API(Azure Power BI Embedded) |微软学习那么剩下的问题就是调用API时相应的世纪互联相应的URL的是什么了,具体的对应可查看以下文档
中国区 Azure 开发人员指南 | Azure Docs
这里主要用的就是management.chinacloudapi.cn这个url来更改Power BI Embedded的容量。
这里其实还走了弯路,因为一开始缩放容量时总是不成功,在Azure门户中查看活动日志,日志中显示的是https://management.core.chinacloudapi.cn这个地址,我就一直使用这个地址来请求缩放容量,其结果就是一直失败。。。
新建应用
登录Azure门户,进入到Azure Active Directory,然后选择应用注册
进行创建的应用,选择证书和密码,新建客户端密码,这里一定要注意及时保存,密码只在第一次创建时显示
创建安全组
同样进行Azure Active Directory,选择组,进去之后新建安全组
新建组之后,进去组,然后添加成员,成员即为上面创建的应用
Power BI Embedded资源添加管理权限
进行到Power BI Embedded资源界面,选择Power BI容量管理员,然后添加安全组为管理员
切换到访问控制,点击添加角色分配
我这里使用的是所有者角色,可根据具体需要选择合适的角色 ,之后在成员中添加上面创建的安全组,完成创建即可
Power BI中添加安全组
在Power BI门户中进入到管理门户,然后在允许服务主体使用Power BI API中加入上面创建的安全组
使用python来缩放容量
首先是获取token,获取token需要一些参数,比如租户id(租户id在Azure Active Directory的概述中可以查看,也可参考[[PowerBI REST API 进阶]]),应用id和应用密码用上面创建应用时的即可。这里还参考了 Assign Power BI workspaces to a capacity automatically – PBI Guy — 自动将 Power BI 工作区分配给容量 – PBI Guy (pbi-guy.com) 该博客的博主是微软的员工,去年有问题时也有邮件向他提问,他也是有邮件回复的,这里推荐下他的博客,很多干货的。
import requests
token_endpoint = 'https://login.chinacloudapi.cn//{tenant_id}/oauth2/token'
tenant_id = ''
client_id = ''
client_secret = ''
data = {
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret,
'resource': 'https://management.chinacloudapi.cn/'
}
response = requests.post(token_endpoint.format(tenant_id=tenant_id), data=data)
access_token = response.json()
token = access_token['access_token']
获取token后就可以缩入容量了,相关参数可在Power BI Embedded订阅概述中查看,这里要注意代码中body参数添加了位置,位置也要改成自己的服务所在的位置
subscription_id = "" #订阅id
resource_group = "" #资源名称
capacity_name = "" #资源组
new_size = "A3"
url = f"https://management.chinacloudapi.cn/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.PowerBIDedicated/capacities/{capacity_name}?api-version=2021-01-01"
headers = {
'Content-Type': 'application/json',
"Authorization": "Bearer " + token
}
body = {
"sku": {
"name": new_size,
"tier": "PBIE_Azure"
},
"location": "chinaeast"
}
response = requests.put(url, json=body,headers=headers)
if response.status_code == 200:
print("Capacity size updated successfully")
else:
print(f"Error: {response.text}")
数据工厂中设置定时任务
在[[数据工厂中刷新PowerBI数据集]]中就介绍当处理完ETL任务后,就刷新Power BI数据集,其中就有介绍怎么获取token,然后再调用REST API刷新Power BI数据集,那么同样的,我们也可以在数据工厂中使用同样的方法来缩放Power BI Embedded容量,并且可以设置解发器,不同时间段调整为不同的容量。