Apache Spark – pierwsze początki

wpis w: Apache, Big Data, Python, Spark | 2

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

Pyspark

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

Datasets

 

 

Dostęp do UI Sparka jest  pod adresem

http://localhost:4040

localhost_4040

Dostęp przez SSH

 

Dostęp do maszyny przez SSH jest na porcie 2222 interfejsu lokalnego.

ssh_session_pyspark

 

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.

ssh_auth_pyspark

Po uruchomieniu połączenia i akceptacji klucza logujemy  się na użytkownika vagrant  z pustym hasłem.

ssh_auth_loginvagrant

 

Po zakończeniu pracy wystarczy wyłączyć maszynę wirtualną

vagrant halt
=== lth-pysparkvm: Attempting graceful shutdown of VM...

2 Responses

  1. Pierwszy czytelnik

    No no.
    Prima sort poradnik.
    Bomba !!
    Turbo strzał w 10-tkę.
    Brawa dla autora.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.