Docker ile Hızlı ve Kolay PySpark ve Jupyter Kurulumu

Büyük veri analizi, günümüzün veri odaklı dünyasında giderek daha önemli hale geliyor. PySpark ve Jupyter Notebook, bu alanda en popüler araçlardan ikisi. PySpark, büyük veriyi işlemek için son derece hızlı ve ölçeklenebilir bir araçken, Jupyter Notebook ise PySpark ile etkileşimli veri analizi ve görselleştirme çalışmaları için sade ve konforlu bir ortam sunar.

Ancak, PySpark ve Jupyter Notebook’u geleneksel yöntemlerle kurmak, karmaşık ve zaman alıcı olabilir. Çoğu zaman paket ve versiyon çakışmaları can sıkıcı olabilir. Ayrıca ortam yönetimi gibi sorunlarla uğraşmanız gerekir. Neyse ki, Docker bu zorlukları ortadan kaldırmak için ideal bir çözüm sunar.

Bu blog yazısında, Docker kullanarak PySpark ve Jupyter Notebook’u nasıl hızlı ve kolay bir şekilde kurup, kullanabileceğimizi göreceğiz. Docker’ın izole edilmiş ortamlar yaratarak bağımlılık sorunlarını nasıl ortadan kaldırdığını ve kurulum sürecini nasıl basitleştirdiğini öğreneceksiniz. Yazı sonunda Jupyter üzerinde basit bir PySpark uygulaması geliştirmiş olacağız.

Ben çalışmalarımı linux bir bilgisayar üzerinde yaptım. MacOS için çok bir fark olacağını sanmam ancak Windows kullananlar bu örneği kendilerine uyarlamalılar. Tavsiyem sanal bir linux makine kullanmaları veya Windows’larda artık Windows Subsystem for Linux (WSL) özelliği var onu kullanmaları.

Kurulumun temelinde aslında spark docker imajı olacak. Tek bir konteyner kuracağız. Yine de docker-compose kullanmayı tercih edeceğim belki sizler yanına postgresql veya başka konteynırlar eklersiniz.

Ön gereksinimler

  • Docker kurulu bir bilgisayar
  • İnternet bağlantısı

Kurulum

Kendimize bir çalışma dizini yaratalım

(base) [train@trainvm ~]$ mkdir easy_spark_jupyter
(base) [train@trainvm ~]$ cd easy_spark_jupyter/

Konteynır içinde yapacağımız kurulumlar, notebook, dosya, veri vb. için bir lokal volume oluşturacağım. Bunun için de bir klasör yaratalım ve sahipliğini değiştirelim.

(base) [train@trainvm easy_spark_jupyter]$ mkdir spark_v
(base) [train@trainvm easy_spark_jupyter]$ sudo chown 185:185 -R spark_v/


(base) [train@trainvm easy_spark_jupyter]$ ls -l
drwxrwxr-x. 2 185 185 6 May 5 08:15 spark_v

Peki neden 185?  spark docker imajını incelediğimizde Dockerfile içinde ARG spark_uid=185 ifadesini görüyoruz. Buradan konteynıra bağlandığımızda içeride spark kullanıcısının 185 id numarasına sahip olacağını anlıyoruz. Amacımız konteynır içindeki kullanıcının elini rahatlatmak o yüzden daha konteynır yaratmadan volume olarak kullanılacak klasör yetkilerini spark(185) kullanıcısına veriyoruz.

Docker Compose dosyası

version: '3.8'
services:
  spark:
    image: spark:3.5.1
    container_name: spark
    ports:
      - "4040:4040"
      - "8888:8888"
    volumes:
      - ./spark_v:/home/spark
    command: sleep infinity

Docker compose çalıştıralım

docker-compose up -d


docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3db466fe29dc spark:3.5.1 "/opt/entrypoint.sh …" 27 seconds ago Up 26 seconds 0.0.0.0:4040->4040/tcp, :::4040->4040/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp spark

spark konteynıra bağlanalım.

docker exec -it spark bash

Volume ile bağladığımız /home/spark diznine geçelim.

cd /home/spark/

Burada kendimize bir python virtual environment oluşturalım. Bunun için virtualenv paketini kullanacağız ancak sanırım bu yüklü değil. Kontrol edelim.

python3 -m virtualenv .venv
/usr/bin/python3: No module named virtualenv

pip ile virtualenv kuralım

python3 -m pip install virtualenv

Şimdi virtualenv ile .venv adında bir virtual environment oluşturalım ve aktif hale getirelim.

spark@3db466fe29dc:~$ python3 -m virtualenv .venv
created virtual environment CPython3.8.10.final.0-64 in 1649ms
  creator CPython3Posix(dest=/home/spark/.venv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/spark/.local/share/virtualenv)
    added seed packages: pip==24.0, setuptools==69.5.1, wheel==0.43.0
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

spark@3db466fe29dc:~$ source .venv/bin/activate


(.venv) spark@3db466fe29dc:~$ pwd
/home/spark

En alttan bir üstteki satırda soldaki (.venv) görüyorsunuz. Artık virtual environment hazır. Buraya ne paket yüklerseniz yükleyin konteynır kapatılıp açıldıktan sonra kaybolmayacak. Çünkü burası yani /home/spark dizini volume ile güvence altında.

Paketleri yükleme

pip install jupyterlab findspark pandas

Jupyter Lab başlatma

jupyter lab --ip 0.0.0.0 --port 8888

En alttaki url’i alıp tarayıcınıza yapıştırın. Jupyter karşınıza çıkacaktır. Aşağıdaki örnektir sizde çalışmaz.

http://127.0.0.1:8888/lab?token=e7ef992ff73678072dce9b22a70930bf811587aa4852b480

Eğer ip numaranız 127.0.0.1’den farklı ise 127.0.0.1 yerine kendi ip numaranızı değiştirip kullanın.

PySpark Uygulaması

Yeni bir notebook yaratıp aşağıdaki ekran görüntüsündeki gibi basit bir spark uygulaması yazabilirsiniz.

Şekil-1: Jupyter Lab Ekran Görüntüsü

Benzer şekilde http://127.0.0.1:4040/ adresinden Spark UI görebilirsiniz.

Şekil-2: Spark Web UI

Ortamı Kapatıp Tekrar Açma

Terminalde Ctrl+C ile Jupyter Lab’ı durduralım. Konteynırdan çıkalım ve docker compose ile konteynırı durduralım. Sırasıyla;

Ctrl+C

exit

docker-compose down

Yeniden ortamı hazırlayalım.

docker-compose up -d

docker exec -it spark bash

# Inside container
cd /home/spark/
source .venv/bin/activate

jupyter lab --ip 0.0.0.0 --port 8888

Jupyter’i açtığınızda aynı notebook orada hazır olacaktır. Tekrar çalıştırdığınızda PySpark uygulaması çalışacaktır. Gördüğünüz gibi yeniden hiç bir kurulum, paket yükleme vb. yapmadık.

Data Engineering konusunda çok daha fazlasını öğrenmek ve bir kariyer olarak seçmek isterseniz Data Engineering Bootcamp programımızı tavsiye ederim.

Bir sonraki yazıya dek çav…

Kaynaklar

Kapak Görseli:  ThisisEngineering on Unsplash

Yazar Hakkında
Toplam 176 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara