问题描述

在微软云环境中,使用python SDK连接存储账号(Storage Account)需要计算Blob大小?虽然Azure提供了一个专用工具Azure Storage Explorer可以统计出Blob的大小:

但是它也是只能一个Blob Container一个的统计,如果Container数量巨大,这将是一个繁琐的工作。而作为开发者,应该让代码来帮助完成。下文使用最快上手的Python代码来计算Blob中容量的大小。

完整代码

import os, uuid, datetime, threading
import logging
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__ def calculateBlob(connect_string, count):
try:
blob_service_client = BlobServiceClient.from_connection_string(connect_string)
except Exception as e:
messages = str(count) + "Connect_String Error, Messages:" + e.args.__str__()
print(messages)
logging.info(messages)
else:
all_containers = blob_service_client.list_containers()
for c in all_containers:
count_name = c.name
print(count_name)
if count_name not in blobSize_Total:
blobSize_Total[count_name] = 0
if count_name not in blobSize_Daily:
blobSize_Daily[count_name] = 0
container_client = blob_service_client.get_container_client(count_name)
generator = container_client.list_blobs() total_size_container = 0
daily_size_container = 0 for blob in generator:
total_size_container += blob.size
blob_create_time = blob.creation_time.strftime("%Y%m%d")
if blob_create_time != now_date:
continue
else:
# Calculate BlobSize in this month
daily_size_container += blob.size
# blobSize_Daily[count_name] += blob.size # /(1024*1024) # content_length - bytes blobSize_Total[count_name] += total_size_container / (1024 * 1024)
blobSize_Daily[count_name] += daily_size_container / (1024 * 1024) return None if __name__ == '__main__':
# connect string
Connection_String_List ="DefaultEndpointsProtocol=https;AccountName=<storagename>;AccountKey=<key>;EndpointSuffix=core.chinacloudapi.cn"
# for i in Connection_String:
start = datetime.datetime.now()
print(start) # 定义全局变量 - blobSize_Daily & blobSize_Total
blobSize_Daily = {}
blobSize_Total = {} now_date = datetime.datetime.now().strftime("%Y%m%d") print("开始计算")
calculateBlob(Connection_String_List, 1)
print("计算完成") print("统计当前新增大小")
print(blobSize_Daily)
print("统计Blob总大小")
print(blobSize_Total)
end = datetime.datetime.now()
print(end)

如运行是没有Azure blob模块,可以使用 pip install azure-storage-blob 安装。以上代码运行结果如下:

如果有多个Storage Account,可以考虑加入多线程的方式来运行,在代码中增加一个myThread类,然后在 __main__ 中把 calculateBlob(Connection_String_List, 1) 运行替换为 many_thread(Connection_String_List) 即可。

class myThread(threading.Thread):

    def __init__(self, threadID, name, connection_string):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.connection_string = connection_string def run(self):
print("开始线程:" + self.name)
calculateBlob(self.connection_string, self.threadID)
print("退出线程:" + self.name) def many_thread(Connection_String_List):
threads = []
for i in range(len(Connection_String_List)): # 循环创建32个线程
t = myThread(i, "Thread-" + str(i), Connection_String_List[i])
threads.append(t)
for t in threads: # 循环启动32个线程 - 对应64个storage account
t.start()
for t in threads:
t.join()

遇见问题

在多线程执行时,可能会遇见问题:("Connection broken: ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None)", ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None)),出现此问题大都是由于客户端使用了已经断开的连接导致所导致的。所以一定要仔细调试多线程关闭代码。是否是把还需要运行的线程给关闭了。导致了以上的错误消息。

附录一:多线程计算Blob的完整代码

import os, uuid, datetime, threading
import logging
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient, __version__ def calculateBlob(connect_string, count):
try:
blob_service_client = BlobServiceClient.from_connection_string(connect_string)
except Exception as e:
messages = str(count) + "Connect_String Error, Messages:" + e.args.__str__()
print(messages)
logging.info(messages)
else:
all_containers = blob_service_client.list_containers()
for c in all_containers:
count_name = c.name
print(count_name)
if count_name not in blobSize_Total:
blobSize_Total[count_name] = 0
if count_name not in blobSize_Daily:
blobSize_Daily[count_name] = 0
container_client = blob_service_client.get_container_client(count_name)
generator = container_client.list_blobs() total_size_container = 0
daily_size_container = 0 for blob in generator:
total_size_container += blob.size
blob_create_time = blob.creation_time.strftime("%Y%m%d")
if blob_create_time != now_date:
continue
else:
# Calculate BlobSize in this month
daily_size_container += blob.size
# blobSize_Daily[count_name] += blob.size # /(1024*1024) # content_length - bytes blobSize_Total[count_name] += total_size_container / (1024 * 1024)
blobSize_Daily[count_name] += daily_size_container / (1024 * 1024) return None class myThread(threading.Thread): def __init__(self, threadID, name, connection_string):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.connection_string = connection_string def run(self):
print("开始线程:" + self.name)
calculateBlob(self.connection_string, self.threadID)
print("退出线程:" + self.name) def many_thread(Connection_String_List):
threads = []
for i in range(len(Connection_String_List)): # 循环创建32个线程
t = myThread(i, "Thread-" + str(i), Connection_String_List[i])
threads.append(t)
for t in threads: # 循环启动32个线程 - 对应64个storage account
t.start()
for t in threads:
t.join() if __name__ == '__main__':
# connect string
Connection_String_List = ['DefaultEndpointsProtocol=https;AccountName=<your storage account 1>;AccountKey=<Key 1>;EndpointSuffix=core.chinacloudapi.cn', 'DefaultEndpointsProtocol=https;AccountName=<your storage account 2>;AccountKey=<Key 2>;EndpointSuffix=core.chinacloudapi.cn']
# for i in Connection_String:
start = datetime.datetime.now()
print(start) # 定义全局变量 - blobSize_Daily & blobSize_Total
blobSize_Daily = {}
blobSize_Total = {} now_date = datetime.datetime.now().strftime("%Y%m%d") many_thread(Connection_String_List)
print("Main Thread End") print(blobSize_Daily)
print(blobSize_Total)
end = datetime.datetime.now()
print(end)

运行效果:

参考资料

快速入门:使用 Python v12 SDK 管理 blobhttps://docs.azure.cn/zh-cn/storage/blobs/storage-quickstart-blobs-python

Python 列表(List)https://www.runoob.com/python/python-lists.html

BlobServiceClient Classhttps://docs.microsoft.com/en-us/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient?view=azure-python

 

【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例的更多相关文章

  1. 使用Python SDK管理Azure Load Balancer

    概述 下面将演示如何使用Python SDK管理中国区Azure Load balancer.关于Azure负载均衡器的详细功能介绍,请参考官方文档. Code Sample import os fr ...

  2. 【Azure Developer】Python 获取Micrisoft Graph API资源的Access Token, 并调用Microsoft Graph API servicePrincipals接口获取应用ID

    问题描述 在Azure开发中,我们时常面临获取Authorization问题,需要使用代码获取到Access Token后,在调用对应的API,如servicePrincipals接口. 如果是直接调 ...

  3. 【Azure Developer】Python代码通过AAD认证访问微软Azure密钥保管库(Azure Key Vault)中机密信息(Secret)

    关键字说明 什么是 Azure Active Directory?Azure Active Directory(Azure AD, AAD) 是 Microsoft 的基于云的标识和访问管理服务,可帮 ...

  4. 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例

    当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例. Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://gith ...

  5. 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization

    Azure Active Directory (Azure AD) is Microsoft's cloud-based identity and access management service, ...

  6. 【Azure Developer】解决Azure Key Vault管理Storage的示例代码在中国区Azure遇见的各种认证/授权问题 - C# Example Code

    问题描述 使用Azure密钥保管库(Key Vault)来托管存储账号(Storage Account)密钥的示例中,从Github中下载的示例代码在中国区Azure运行时候会遇见各种认证和授权问题, ...

  7. 【Azure Developer】【Python 】使用 azure.identity 和 azure.common.credentials 获取Azure AD的Access Token的两种方式

    问题描述 使用Python代码,展示如何从Azure AD 中获取目标资源的 Access Token. 如要了解如何从AAD中获取 client id,client secret,tenant id ...

  8. 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法

    问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...

  9. 【Azure 应用服务】Azure Function集成虚拟网络,设置被同在虚拟网络中的Storage Account触发,遇见Function无法触发的问题

    一切为了安全,所有的云上资源如支持内网资源访问,则都可以加入虚拟网络 问题描述 使用Azure Function处理Storage Account中Blob 新增,更新,删除等情况.Storage A ...

随机推荐

  1. 功能:Java注解的介绍和反射使用

    功能:Java注解的介绍和反射使用 一.注解 1.注解介绍 java注解(Annotation),又称为java标注,是jdk5.0引入的一种机制. Java 语言中的类.方法.变量.参数和包等都可以 ...

  2. 针对缓冲区保护技术(ASLR)的一次初探

    0x01 前言 ASLR 是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一 ...

  3. Windows Pe 第三章 PE头文件-EX-相关编程-1(PE头内容获取)

    获取pE头相关的内容,就是类似如下内容 原理:比较简单,直接读取PE到内存,然后直接强转就行了. #include <windows.h> #include <stdio.h> ...

  4. Insert Pictures In Hexo Blog

    After build my blog following the online course step by step , I began to try to write my own blog️ ...

  5. LINQ之查询语法

    新开一节LINQ的入门讲解. LINQ(Language Integrated Query)语言集成查询,是C#语言的扩展,它的主要功能是从数据集中查询数据,就像通过sql语句从数据库查询数据一样(本 ...

  6. IP子网划分与聚合

    一:IP地址: IP地址是由32位2进制数组成,每8位一组.由点分十进制表达. IP地址可以分为五类 A类(1.0.0.0-126.255.255.255),127.0.0.1 为本地回环地址. B类 ...

  7. UVa OJ 455 Periodic Strings

     Periodic Strings  A character string is said to have period k if it can be formed by concatenating ...

  8. BUAA软件工程_软件案例分析

    写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 软件案例分析 课程目标 培养软件开发能力 本作业对实现目标的具体作用 对案例进行分析以学习软件开发的经 ...

  9. 排坑&#183;IPhone&IOS中不兼容正则中的断言匹配

    阅文时长 | 1.14分钟 字数统计 | 1834.4字符 主要内容 | 1.问题切入 2.什么是断言匹配 3.断言匹配的替换方案 4.声明与参考资料 『排坑·IPhone&IOS中不兼容正则 ...

  10. COS 数据湖最佳实践:基于 Serverless 架构的入湖方案

    01 前言 数据湖(Data Lake)概念自2011年被推出后,其概念定位.架构设计和相关技术都得到了飞速发展和众多实践,数据湖也从单一数据存储池概念演进为包括 ETL 分析.数据转换及数据处理的下 ...