SCRIPT FACTORY | BI BLOG SCRIPT FACTORY | BI BLOG
INTELIGENTNA PRZYSZŁOŚĆ ZACZYNA SIĘ TU
SCRIPT FACTORY | BI BLOG SCRIPT FACTORY | BI BLOG
lut 04

Undelete na dużej ilości plików

  • 4 lutego 2022
  • Wojciech Zduniak
  • Databricks, Storage, Tricks & Tips

Pewnie spotkałeś/łaś się do tej pory z problemem wykonania operacji Undelete na Azure Storage Account w przypadku kiedy na kontenerze znajdują się miliony plików, i istotna część z nich została usunięta. Jeśli masz na odzyskanie tylko 7dni to może być to nie lada wyzwanie.

Microsoft sugeruje użycie Azure Portal lub Azure Storage Explorer jest jednak w tym podejściu dość istotny problem, mianowicie przy dość intensywnie używanym kontenerze , samo wylistowanie plików do operacji undelete (nie mówiąc o jej zastosowaniu) jest czasochłonne, listowanie może odbywać się z prędkością nawet 2tyś/5-6s do około 20tyś/5s. Używając wspomnianych narzędzi nie ma jednak możliwości wybrania od razu wszystkich wylistowanych plików do operacji undelete. Przy skasowaniu np. 20mln plików jedyną możliwością jest wykonanie tej operacji w inny sposób, sposób który opiszemy poniżej:

Jak uniknąć listowania plików

Microsoft umożliwia nam dwie opcje pominięcia operacji listowania plików czy to w narzędziach powyżej , czy przy użyciu Pythona, Basha, czy innych sposobów

  • $logs

Struktura katalogu to typ usługi->rok->miesiąc->dzień->godzina+minuta->*.log

plik log w katalogu $logs z danymi niezbędnymi do undelete
  • $blobchangefeed (jeśli funkcjonalność uruchomiona jest na poziomie Azure Storage Account)

log/idx/meta (w naszym przypadku log)->00->rok->miesiąc->dzień->godzina+minuta->*.avro

Podgląd na ten kontener jest tylko z poziomu Azure Portal, nie widać go w Azure Storage Explorer.

W obydwu lokalizacjach znajdują się podobne informacje. Istotne z jest znalezienie w nich typu operacji BlobDeleted w zakresie godzin jaki została wykonana operacja. Pamiętajcie jednak że operacja usuwania może odbywać się asynchronicznie. Więc od momentu wykonania operacji kasowania do faktycznego usunięcia blob-a może upłynąć trochę czasu.

Jeśli już wiemy jakie pliki chcemy odzyskać

Jeśli mamy już listę faktycznie usuniętych plików, jak zrobić aby wykonać operację szybko i sprawnie nie pisząc do tego „tony” kodu. Aby tego dokonać trzeba skupić się na sposobie samego odzyskania pojedynczego pliku. Można to zrobić low-level używając API do Azure Storage Account. To zapewni nam uruchomienie odzyskania pliku bez konieczności wykorzystania narzędzi powyżej. Jednak Microsoft przygotował „nakładki” do API Storage Account – my skupimy się na tej przygotowanej w Pythonie https://docs.microsoft.com/en-us/python/api/overview/azure/storage-blob-readme?view=azure-python . Ponieżej znajduje się prosty kod przy użyciu Python , dzięki któremu możemy odzyskać pojedyńczy plik. Jeśli dostarczymy dane w odpowiednim formacie.

import os
from datetime import datetime, timedelta
from azure.core.exceptions import HttpResponseError, ResourceExistsError
from azure.storage.blob import BlobServiceClient

connection_string = "DefaultEndpointsProtocol=https;AccountName=<nazwa storage account>;AccountKey=<klucz do storage account>;EndpointSuffix=core.windows.net"
service = BlobServiceClient.from_connection_string(conn_str=connection_string)

def executeUndelete(path):
  blob_client = service.get_blob_client(container=<nazwa kontenera>, blob=path)
  try:
    blob_client.undelete_blob()
  except:
    return 0
  return 1

Format nazwy pliku to jego ścieżka na kontenerze np. incoming/newprocess1/file.log

Jak odzyskać miliony plików – Undelete

Do odzyskania wielu plików musimy zastosować efekt skali. Jednym z przyjemniejszych sposobów jest wykorzystanie Azure Databricks. Gdzie w ramach usługi utworzymy klaster np. z 16 nodami (maszyny DS13v2) które pozwoli uruchomić odzyskiwanie plików wielowątkowo.

Sam Azure Databricks możemy również wykorzystać do przygotowania danych z plików *.log, czy *.avro opisanych powyżej (tego nie będę opisywał w szczegółach w tym artykule). Dane przygotowane w postaci tabelki można w bardzo prosty i przejrzysty sposób szybko wyświetlić i uruchomić proces odzyskiwania. Aby tego dokonać należy dodać do powyższego kodu poniższe linie i uruchomić poniższego SQLa

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

spark.udf.register("executeUndelete", executeUndelete, StringType())
select *,executeUndelete(sciezka_pliku) status_odzyskania from lista_plikow_do_odzyskania

  • Facebook
  • LinkedIn

About The Author

BI zajmuję się kilkanaście lat, od Microsoft po Teradatę, od on-premise do cloud, od pojedyńczych serwerów po klastrów obliczeniowych. Temat jest tak szeroki i ciekawy że postanowiłem opisać po kolei wszystko co wiem i z czym się zetknąłem. Mam nadzieje że będzie Wam się podobać ta lektura :)

Related Posts

  • Migracja zasobów Azure Databricks cz. 118 lutego 2022
  • Monitoring Azure Databricks9 lutego 2022
  • Jak rozpocząć pracę z Azure Databricks4 lutego 2022
  • Data Warehouse i przetwarzanie plików24 marca 2019

Comments are closed.

Kategorie

  • Apache Hadoop
    • Instalacja
  • Azure
    • Databricks
    • Log Analytics
    • SQL Data Warehouse
    • Storage
    • Synapse
  • DigitalOcena
  • Google
    • Big Query
    • Storage
  • Tricks & Tips

Najnowsze posty:

  • Migracja zasobów Azure Databricks cz. 1
  • Monitoring Azure Databricks
  • Undelete na dużej ilości plików
  • Jak rozpocząć pracę z Azure Databricks
  • Data Warehouse i przetwarzanie plików

Wyszukaj Wpis

© Copyright 2025 SCRIPT FACTORY | BI BLOG