Instalacja Apache Spark w środowisku WSL (Windows Subsystem for Linux)

Apache Spark w WSL (dla testów) jest lepszym pomysłem niż instalacja tego oprogramowania w Windows lub VM Hyper-V, bo WSL łączy zalety natywnego Linuxa z wygodą Windows, bez ciężaru pełnej maszyny wirtualnej, co idealnie nadaje się do testów Spark. Instalacja Apache Sparka bezpośrednio w Windowsie nie jest dobrym pomysłem, ponieważ wiele funkcji i integracji zaprojektowanych pod Linuxa może nie działać poprawnie, a ścieżki i narzędzia systemowe często powodują problemy kompatybilności. Dodatkowo wydajność operacji wejścia/wyjścia i procesów jest zazwyczaj niższa niż w środowisku Linux, co utrudnia realistyczne testy.

  • Środowisko Linuxa – Spark jest natywnie tworzony dla Linuxa, więc w WSL działa tak, jak na produkcyjnym Linuxie.

  • Szybkie uruchamianie – WSL startuje w kilka sekund, w przeciwieństwie do VM, która wymaga pełnego bootu.

  • Niska konsumpcja zasobów – WSL używa mniej RAM/CPU niż pełna VM.

  • Integracja z Windows – łatwy dostęp do plików, narzędzi i edytorów Windows bez kopiowania danych między systemami.

  • Łatwa konfiguracja i testy – instalacja pakietów Linuxowych, Python, Java działa bez problemów, tak jak w Linuxie produkcyjnym.

Sprawdzanie czy masz już gotowe środowisko WSL

Jeśli nie wiesz czy masz już środowisko WSL na swoim PC, uruchom terminal Powershell jako administrator i wpisz komendę:

wsl --list --all

Jeśli WSL jest zainstalowane, zobaczysz coś podobnego:

Windows Subsystem for Linux Distributions:
Ubuntu (Default)
docker-desktop

Możesz wtedy zaktualizować środowisko wpisując:

wsl --update

W przypadku jeśli nie masz środowiska WSL, zainstaluj je wpisująć polecenie:

wsl --install

Domyślnie zainstalujesz w ten sposób dystrybujcę Ubuntu.

Uruchamianie WSL

Uruchom okno Powershell z uprawnieniami administratora i wpisz polecenie:

wsl

Jeśli masz więcej niż jedną zainstalowaną dystrybucję, możesz uruchomić konkretną, w tym przypadku Ubuntu:

wsl -d Ubuntu

Jeśli zobaczysz komunikat jak poniżej, oznacza to że Twoja maszyna nie ma włączonej wirtualizacji.

WSL2 is not supported with your current machine configuration. Please enable the "Virtual Machine Platform" optional component and ensure virtualization is enabled in the BIOS. Enable "Virtual Machine Platform" by running: wsl.exe --install --no-distribution For information please visit https://aka.ms/enablevirtualization Error code: Wsl/Service/CreateInstance/CreateVm/HCS/HCS_E_HYPERV_NOT_INSTALLED

Wykonaj wtedy dwie czynności. Włącz wirtualizacje w BIOS dla procesora oraz uruchom komponent wirtualnej maszyny w Windows (Powershell):

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Po poprawnym uruchomieniu WSL aktualną scieżką jest katalog 'c/Windows/System32' - przejdz do głownego katatalogu domowego WSL wpisując:

cd ~

Instalacja Apache Spark

Zakutalizuj manager pakietow poleceniem:

sudo apt update

Najnowsza wersja Apache Spark zostala skompilowana z wersja 17 Java. Zainstaluj odpowieni JDK w WSL:

sudo apt install openjdk-17-jdk -y

Pobierz plik z instalacją Apache Spark. W tej chwili najnowsza wersja to 4.0.1:

wget https://dlcdn.apache.org/spark/spark-4.0.1/spark-4.0.1-bin-hadoop3.tgz

Po pobraniu rozpakuj plik i przenieś go do docelowego katalogu

sudo tar -xzf spark-4.0.1-bin-hadoop3.tgz
sudo mv spark-4.0.1-bin-hadoop3 /opt/spark

Dodaj Spark do zmiennych środowiskowych: Otwórz plik ~/.bashrc w edytorze (np. nano):

nano ~/.bashrc

Dodaj na końcu pliku następujące linie:

export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export PYSPARK_PYTHON=python3

Zapisz plik i załaduj zmiany:

source ~/.bashrc

Aby przetestować instalację, uruchom Spark Shell:

spark-shell

Powinieneś zobaczyć konsolę Spark:

      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 4.0.1
      /_/

Using Scala version 2.13.16 (OpenJDK 64-Bit Server VM, Java 17.0.16)
Type in expressions to have them evaluated.
Type :help for more information.
25/09/24 11:04:36 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark context Web UI available at http://10.255.255.254:4040
Spark context available as 'sc' (master = local[*], app id = local-1758704677347).
Spark session available as 'spark'.

Jak widzisz znajduje się tam informacja o url pod jakim dostępna jest interfejs webowy Spark. Nie jest to do końca prawda. Adres 10.255.255.255 pochodzi z prywatnej puli WSL. Z poziomu Twojego PC będzie to http://localhost:4040

Jest to własny GUI Apache Spark (port 4040) dostępny w czasie sesji którą uruchomiłe(a)ś wykonując polecenie spark-shell. GUI ten nie będzie dostępny jeśli zamkniesz sesję. Podobnie kiedy wykonasz job Sparka poleceniem spark-submit, GUI będzie widoczny tylko w trakcie wykonywania job'a.

Uruchamianie History Server

History Server → centralny serwer, który daje GUI dla wszystkich zakończonych jobów, niezależnie od źródła. Rozpocznij od utwórzenia katalogu dla logów Sparka:

mkdir -p /opt/spark/spark-events

Ustaw prawa do zapisu, jeśli uruchamiasz jako inny użytkownik:

chmod 777 /opt/spark/spark-events

Przejdz do katalogu w ktorym zainstalowany jest Spark (cd /opt/spark), podkatalogu 'conf' i na podstawie template utwórz nowy config (jeśli go jeszcze nie ma):

cp spark-defaults.conf.template spark-defaults.conf

Dodaj/zmień wpisy dla History Server (poleceniem 'nano spark-defaults.conf'):

# Włączanie zapisywania logów
spark.eventLog.enabled           true
# Katalog, w którym Spark zapisuje eventy
spark.eventLog.dir               file:///opt/spark/spark-events
# Katalog, który czyta History Server
spark.history.fs.logDirectory    file:///opt/spark/spark-events

Jeśli to jest instalacja Spark którą używasz do testów, nie potrzebujesz przechowywać logów - użyj katalogu temp to przechowywania tymczasowych plików eventów. Uruchom History Server:

$SPARK_HOME/sbin/start-history-server.sh

GUI będzie dostępne pod: http://localhost:18080

Teraz kiedy masz zasintalowany Spark, przejdź do do następnego tutoriala: wprowadzenie do Apache Spark