Poradnik:
Jak uruchomić na komputerze z MS Windows lokalną instancję Apache Sparka pracującą na jednym nodzie z gotową obsługą skryptów w Pythonie (pyspark) i przykładowymi zbiorami danych.
Na podstawie materiałów ze strony
http://semantica.cs.lth.se/pyspark/#/pyspark-vm
Dla tych, którzy na co dzień korzystają ze stacji roboczej MS Windows.
Potrzebne oprogramowanie
a) Virtual Box ( wirtualizator)
https://www.virtualbox.org/wiki/Downloads
Instalujemy najwyższą wersję , jaką aktualnie obsługuje Vagrant
GUI VirtualBoxa nie będzie wogóle wykorzystywane.
b) Vagrant (nakładka na wirtualizator)
https://www.vagrantup.com/downloads.html
Instalujemy obraz
vagrant box add http://semantica.cs.lth.se/pyspark/vm.json
To chwilę trwa, cierpliwości, obraz ponad 1 GB objętości.
Sprawdzamy zainstalowane obrazy maszyn wirtualnych.
vagrant box list
lth-pysparkvm (virtualbox, 1.0.1)
Sprawdzamy status maszyn
vagrant status
Current machine states:
lth-pysparkvm poweroff (virtualbox)
The VM is powered off. To restart the VM, simply run `vagrant up`
Uruchamiamy maszynę wirtualną
vagrant up lth-pysparkvm
Bringing machine 'lth-pysparkvm' up with 'virtualbox' provider...
==> lth-pysparkvm: Checking if box 'lth-pysparkvm' is up to date...
==> lth-pysparkvm: Clearing any previously set forwarded ports...
==> lth-pysparkvm: Clearing any previously set network interfaces...
==> lth-pysparkvm: Preparing network interfaces based on configuration...
lth-pysparkvm: Adapter 1: nat
==> lth-pysparkvm: Forwarding ports...
lth-pysparkvm: 8888 (guest) => 8081 (host) (adapter 1)
lth-pysparkvm: 8002 (guest) => 8082 (host) (adapter 1)
lth-pysparkvm: 4040 (guest) => 4040 (host) (adapter 1)
lth-pysparkvm: 4041 (guest) => 4041 (host) (adapter 1)
lth-pysparkvm: 4042 (guest) => 4042 (host) (adapter 1)
lth-pysparkvm: 4043 (guest) => 4043 (host) (adapter 1)
lth-pysparkvm: 4044 (guest) => 4044 (host) (adapter 1)
lth-pysparkvm: 4045 (guest) => 4045 (host) (adapter 1)
lth-pysparkvm: 22 (guest) => 2222 (host) (adapter 1)
==> lth-pysparkvm: Running 'pre-boot' VM customizations...
==> lth-pysparkvm: Booting VM...
==> lth-pysparkvm: Waiting for machine to boot. This may take a few minutes...
lth-pysparkvm: SSH address: 127.0.0.1:2222
lth-pysparkvm: SSH username: vagrant
lth-pysparkvm: SSH auth method: private key
==> lth-pysparkvm: Machine booted and ready!
==> lth-pysparkvm: Checking for guest additions in VM...
lth-pysparkvm: The guest additions on this VM do not match the installed version of
lth-pysparkvm: VirtualBox! In most cases this is fine, but in rare cases it can
lth-pysparkvm: prevent things such as shared folders from working properly.
If you see
lth-pysparkvm: shared folder errors, please make sure the guest additions within the
lth-pysparkvm: virtual machine match the version of VirtualBox you have installed on
lth-pysparkvm: your host and reload your VM.
lth-pysparkvm:
lth-pysparkvm: Guest Additions Version: 4.3.30
lth-pysparkvm: VirtualBox Version: 5.1
==> lth-pysparkvm: Mounting shared folders...
lth-pysparkvm: /home/vagrant/notebooks/host => D:/developing/Vagrant/bin
Jak wygląda plik VagrantFile, warto na niego spojrzeć, w szczególności na numery portów, które są forwardowane.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.define "lth-pysparkvm" do |master|
master.vm.box = "lth-pysparkvm"
master.vm.network :forwarded_port, host: 8081, guest: 8888, auto_correct: true # Jupyter port
master.vm.network :forwarded_port, host: 8082, guest: 8002, auto_correct: true # Updater port
master.vm.network :forwarded_port, host: 4040, guest: 4040, auto_correct: true # Spark UI (Driver)
master.vm.network :forwarded_port, host: 4041, guest: 4041, auto_correct: true # Spark UI (Driver)
master.vm.network :forwarded_port, host: 4042, guest: 4042, auto_correct: true # Spark UI (Driver)
master.vm.network :forwarded_port, host: 4043, guest: 4043, auto_correct: true # Spark UI (Driver)
master.vm.network :forwarded_port, host: 4044, guest: 4044, auto_correct: true # Spark UI (Driver)
master.vm.network :forwarded_port, host: 4045, guest: 4045, auto_correct: true # Spark UI (Driver)
master.vm.usable_port_range = 4040..4090
master.vm.provider :virtualbox do |vb|
vb.name = "lth-pysparkvm"
# Assign 2 CPUs
vb.customize ["modifyvm", :id, "--cpus", "2"]
# Assign 2 GB Memory
vb.customize ["modifyvm", :id, "--memory", "2048"]
# Disable USB
vb.customize ["modifyvm", :id, "--usb", "off"]
vb.customize ["modifyvm", :id, "--usbehci", "off"]
end
end
config.vm.synced_folder ".", "/home/vagrant/notebooks/host"
end
Uwagi, które mogą zmniejszyć frustrację:
Jeśli zainstalujemy zbyt nową wersję VirtualBoxa Vagrant jej nie wykryje, a co więcej będzie komunikować nas o braku HyperV.
Co ciekawe na komputerach z windows 7 pro instalacja tego typu oprogramowania jest możliwa, ale tej wersji nie testowałem,
pozostajemy przy oprogramowaniu Virtualbox.
Dla dociekliwych:
https://www.altkomakademia.pl/baza-wiedzy/qna/discussion/2763/instalacja-hyper-v-manager-w-windows-7-
Na stacjach z Windows 7 standardowo zainstalowany jest powershell w versji 2.0. Wykonanie polecenia Vagrant up nie kończy się. Należy zaktualizować framework np. do wersji 4.0.
Wersja PowerShella przed:
PS C:\Users\User> $PSVersionTable
Name Value
---- -----
CLRVersion 2.0.50727.8762
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
Po instalacji ze strony Microsoftu
https://www.microsoft.com/en-us/download/details.aspx?id=40855
Wersja powershella po:
PS C:\Users\User> $PSVersionTable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.18728
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
PS C:\Users\User>
W wersji VirtualBox (5.1) domyślnie nie ma dostępu do sieci zewnętrznej od środka maszyny, przez co nie można zaktulizować jej oprogramowania. Pomaga poprawa w pliku konfiguracyjnym Vagrantfile
Należy dodać w pliku Vagranfile dodatkowe linie kodu
# run net outside VM
vb.customize ['modifyvm', :id, '--natdnsproxy1', 'on']
vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
vb.customize ['modifyvm', :id, '--cableconnected1', 'on']
Pierwsze kroki
1. Uruchomienie skryptu Pythona w notatniku Jupiter
Uruchamiany stronę http://localhost:8081
Jako silnik wybieramy pyspark
W pierwszej komórce wpisujemy
#show SparkContext object
sc
Wyjście
Out[1]:
W drugiej komórce
#show type of SparkContext
type(sc)
Wyjście:
Out[2]: pyspark.context.SparkContext
Przykładowy wygląd notatnika
2. Aktualizujemy dostępne pliki z danymi
Uruchamiamy stronę http://localhost:8082
Naciskamy przycisk “Update all” i czekamy cierpliwie na aktualizację, jeden z plików ma ponad 2GB danych.
Po aktualizacji wygląda to tak
Dostęp do UI Sparka jest pod adresem
Dostęp przez SSH
Dostęp do maszyny przez SSH jest na porcie 2222 interfejsu lokalnego.
Z pliku private_key należy wygenerować klucz prywatny , który będzie mógł być użyty przez PuttySSH.
U mnie plik znajduje się w podkatalogu, w którym zainstalowano przez Vagranta wirtualną maszynę:
....Vagrant\bin\.vagrant\machines\lth-pysparkvm\virtualbox
tak wygenerowany klucz prywatny należy wskazać na zakladce Connection/SSH/Auth.
Po uruchomieniu połączenia i akceptacji klucza logujemy się na użytkownika vagrant z pustym hasłem.
Po zakończeniu pracy wystarczy wyłączyć maszynę wirtualną
vagrant halt
=== lth-pysparkvm: Attempting graceful shutdown of VM...
Pierwszy czytelnik
No no.
Prima sort poradnik.
Bomba !!
Turbo strzał w 10-tkę.
Brawa dla autora.
mmoskit
Przydatny materiał. Dzięki wielkie za ten wpis.