Azure Powershell: как быстро найти файлы в хранилище BLOB?

Мы храним файлы журналов в учетной записи хранения Azure, отсортированные по каталогам, по дате и клиенту, например так:

ГГГГ/ММ/ДД/customerNo/.../.../somestring.customerNo.applicatoinID.log

Мне нужно автоматически анализировать некоторые из этих файлов каждый день, и это работает нормально. Однако все, что я знаю, это префикс, упомянутый выше, и суффикс, они могут быть в разных подкаталогах.

Итак, вот как я это сделал:

$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$customerId.$appID.txt" }

Это было быстро, пока не было никаких файлов журнала, но теперь, спустя год, этот поиск занимает целую вечность. Я читал где-то, что поиск по префиксу будет быстрее, чем по суффиксу. К сожалению, мне приходится использовать суффикс, но теперь я также использую дату в качестве префикса. Я попытался улучшить его, сделав это:

$date = Get-Date -UFormat "%Y/%m/%d"
$prefix = "$date/$customerId/"
$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

Тем не менее, никакого улучшения нет, просто это длится так же долго, как и раньше. И кажется, что время, необходимое для поиска, увеличивается в геометрической прогрессии с увеличением количества файлов журнала (несколько сотен тысяч в очень нескольких десятках ГБ).

Я получаю сообщение о состоянии, которое остается там буквально в течение получаса:

Azure Powershell: как быстро найти файлы в хранилище BLOB?

Насколько я понимаю, хранилище больших двоичных объектов Azure не имеет иерархической файловой системы, поддерживающей папки, поэтому «/» являются частью имени BLOB и интерпретируются клиентским программным обеспечением как папки.

Однако это не помогает мне ускорить поиск. Есть предложения, как улучшить ситуацию?

Правильно — по умолчанию хранилище BLOB-объектов — это просто container/blob, а каталоги — это просто часть имени. Если вы хотите иметь структуру, более похожую на папку, вам потребуется учетная запись хранения с включенными иерархическими каталогами (например, ADLS gen 2). В противном случае невозможно избежать просеивания ваших нескольких сотен тысяч имен файлов. Или... сохраните свои URI больших двоичных объектов в соответствующем хранилище базы данных (например, Cosmos DB, SQL DB и т. д.), где вы сможете выполнять правильно индексированный поиск по именам.

David Makogon 12.05.2022 15:59
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хранилище BLOB-объектов Azure поддерживает фильтрацию BLOB-объектов на стороне сервера по префиксу, однако ваш код не использует это преимущество.

$files = (Get-AzStorageBlob -Container logfiles -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

По сути, приведенный выше код перечисляет все большие двоичные объекты, а затем выполняет фильтрацию на стороне клиента.

Чтобы ускорить поиск, измените код на что-то вроде:

$files = (Get-AzStorageBlob -Container logfiles -Prefix $prefix -Context $context) | Where-Object { $_.Name -like "$prefix*$customerId.$appID.txt" }

Я просто передал префикс в параметре Prefix. Теперь вы получите только те большие двоичные объекты, имена которых начинаются с префикса .

Большое спасибо, я не знал о параметре -Prefix! Теперь работает как шарм. То, что изменение в поисковой строке Where-Object -like ничего не меняет, я действительно должен был догадаться сам, спасибо! Однако я очень удивлен, что сотрудник Microsoft, ответивший на аналогичный вопрос по ссылке, которую я разместил выше, не предложил это решение. Спасибо еще раз!

Aileron79 13.05.2022 07:59

Другие вопросы по теме