Free Edition – Przygoda z paczką
Ostatnio chciałem rozpoczęć mały projekcik w Databricks Free Edition, i to co mnie tam boli to serverless. Jest fajny bo jest dostępny od zaraz, ale dzisiaj się skupie na jednej z wad – ma ich trochę 😩:
🔸 Scala i R nie są obsługiwane.
🔸 Domyślnym trybem przy pisaniu SQL jest ANSI SQL. Aby z niego zrezygnować, ustaw parametr spark.sql.ansi.enabled na false.
🔸 Interfejsy API Spark RDD nie są obsługiwane.
🔸 Spark Context (sc), spark.sparkContext oraz sqlContext nie są obsługiwane.
🔸 Databricks Container Services nie są obsługiwane.
🔸 Domyślnie każde zapytanie Spark w notesie serverless nie może działać dłużej niż 9000 sekund. Limit można zmienić za pomocą właściwości spark.databricks.execution.timeout.
🔸 Do łączenia się z zewnętrznymi źródłami danych należy używać Unity Catalog. Dostęp do magazynów w chmurze uzyskuj poprzez external locations.
🔸 Obsługiwane źródła danych to wyłącznie: AVRO, BINARYFILE, CSV, DELTA, JSON, KAFKA, ORC, PARQUET, TEXT oraz XML.
🔸 Funkcje definiowane przez użytkownika (UDF) nie mają dostępu do internetu. W związku z tym polecenie CREATE FUNCTION (External) nie jest obsługiwane. Databricks zaleca używanie CREATE FUNCTION (SQL lub Python).
🔸 Pojedynczy wiersz danych nie może przekroczyć 128 MB.
🔸 Spark UI nie jest dostępne. Zamiast tego użyj profilu zapytania (query profile), aby przeanalizować zapytania Spark.
🔸 Logi Spark nie są dostępne w notesach i zadaniach serverless.
🔸 Użytkownicy mają wgląd jedynie w logi aplikacji po stronie klienta.
🔸 Globalne widoki tymczasowe nie są obsługiwane. W razie potrzeby przekazywania danych między sesjami używaj widoków tymczasowych sesji albo twórz tabele.
To co mnie ostatnio zabolało to brak możliwości efektywnego instalowania paczek tak jak już się to tego przyzwyczaiłem, czyli przy definicja Taska w Jobie gdzie można je bardzo łatwo dodać. Potem zostaje już tylko import w notatniku.
Z tym mam obecnie mały problem na projekcie, cały proces ETL uruchamia spore ilości notatników sql i cała masa innych procesów.
Oprócz notatników jest sporo kodu oczywiście w paczce (whl). Jakże by inaczej. Kod typu utils, który jest wykorzystywany w wielu miejscach oczywiście paczkujemy 😁.
I to jest niby fajne, ale strasznie spowalnia development. Żeby przetestować job trzeba go uruchomić, a tu zonk trzeba czekać, aż szanowny Azure postawi VMkę. ⏱️
Wiem co powiesz przecież można jakiś pool postawić i mieć klaster dostępny od zaraz. I niestety tego się nie da zrobić, klient na pool nie pozwala. 😩 ot i tak cierpimy.
Mamy serverless, ale tu instalacja paczek nie pasuje do reszty procesu. Nie da się tak bardzo prosto i ładnie go zainstalować na klastrze typu Job.
Wracając do projektu jakim chce się pobawić w Databricks Free workspace jest tylko serverless. A tu się nie da tak ładnie jak na zwykłym klastrze – zainstalować ze ścieżki tak jak poniżej
Instalacja paczki w Jobie.
resources:
pipelines:
serverless_etl:
name: serverless_etl
catalog: ${var.catalog}
schema: ${var.schema}
serverless: true
root_path: "../src/serverless_etl"
libraries:
- whl: ../dist/my_package-0.1.0-py3-none-any.whl
W serverless też da się zainstalować paczkę, ale trochę inaczej. Trzeba dołożyć !pip do notatnika. Taka opcja jest ok, ale sprawdzi się gdzie wybieramy tylko jeden typ klastra. Ale gdybym używał płatnego workspace to słabo by było mieć generyczny klaster i do tego mieszać z serverless. Trzeba wybrać jedną metodę bo będzie bałagan. 🧹
Ważne tip
Starting with Databricks Runtime 13.0 %pip commands do not automatically restart the Python process. If you install a new package or update an existing package, you may need to use dbutils.library.restartPython() to see the new packages. See Restart the Python process on Databricks.
Write your quote here
%pip install /path/to/my_package.whl
Wiem co powiesz to jest słabe i mało efektywne, ale do małego nie produkcyjnego projektu zadziała. Nawet jeśli wybierzesz dedykowany Workspace Serverless
I to jest taka lekka skaza serverlesa 😄
Osobiście nie specjalnie mi się to podoba, ale cóż da się z tym żyć.
Można taką paczkę pobrać z odległego repozytorium
%pip install git+https://github.com/databricks/databricks-cli
Jest też opcja z jakimś sekretem, gdyby taka paczka była poufna
token = dbutils.secrets.get(scope="scope", key="key")
%pip install --index-url https://:$token@.com/ == --extra-index-url https://pypi.org/simple/
Poniżej link do notatnika gdzie wrzuciłem kilka metod jak to ogarnąć.
