📅 Dönemlik Ders Planı (Tentative)
Aşağıdaki plan, dersin genel gidişatını göstermek amacıyla hazırlanmıştır. Öğrenci ihtiyaçlarına, ilerleme hızına ve güncel gelişmelere bağlı olarak konu sıralaması ve içeriklerde değişiklikler yapılabilir. Sınav haftalarında ders işlenmez.
Bu ders kapsamındaki tüm sınavlar, ödevler ve projeler 2547 sayılı Yükseköğretim Kanunu ve ilgili yönetmelikler çerçevesinde değerlendirilir. Sınavlarda kopya çekmek, kopya vermek veya buna teşebbüs etmek disiplin suçudur.
- 📌 Kopya fiili tespit edildiğinde ilgili sınav geçersiz sayılır ve tutanak tutulur.
- 📌 Kınama veya daha ağır disiplin cezalarına yol açabilir; tekrarlayan durumlarda uzaklaştırma cezası uygulanabilir.
- 📌 Ödev ve projelerde intihal (plagiarism) de aynı kapsamda değerlendirilir.
📄 2547 Sayılı Yükseköğretim Kanunu: PDF İndir
⚠️ Tüm öğrenciler, kayıtlı oldukları üniversitenin öğrenci disiplin yönetmeliğini okumakla yükümlüdür.
| Hafta | Konu Başlığı | Teori Özet | Uygulama Özet |
|---|---|---|---|
| 1 | Dağıtık Sistemlere Giriş | Dağıtık sistem nedir? Hadoop, MapReduce (kavramsal) | Python tekrarı, map/filter/reduce, Word Count |
| 2 | Veri Modelleme | Veri hiyerarşisi, veri türleri, 5V, DIKW | CSV/JSON okuma-yazma, Pandas'a giriş |
| 3 | Veri İşleme Çerçeveleri | Spark nedir? Batch vs Stream, lazy evaluation | PySpark ile ilk adımlar (Colab) |
| 4 | Veri Depolama | Veritabanı nedir? SQL vs NoSQL | SQLite ile SQL temelleri, MongoDB Atlas tanıtım |
| 5 | Gerçek Zamanlı Veri Akışı | Kafka, Streaming kavramları | Python ile producer-consumer simülasyonu |
| 6 | Veri Analiz Teknikleri | EDA, makine öğrenmesine giriş | Scikit-learn ile temel regresyon |
| 7 | Büyük Veri Altyapı Yönetimi | Ekosistem haritası, araçlar | PySpark SQL sorguları |
| 8 | 📝 ARA SINAV | Bu hafta ders işlenmez — tüm süre sınava ayrılmıştır | |
| 9 | Veri Görselleştirme | Grafik türleri, dashboard kavramı | Matplotlib, Seaborn, Plotly |
| 10 | Büyük Veri Güvenliği | CIA, KVKK, GDPR, anonimleştirme | Python ile veri hashleme, maskeleme |
| 11 | Bulut Tabanlı Çözümler | Bulut bilişim, Databricks | Databricks Community Edition ile PySpark |
| 12 | Veri Entegrasyonu ve ETL | ETL nedir? Veri kaynakları | API'den veri çekme, Pandas ile temizleme |
| 13 | Yönetişim ve Optimizasyon | Veri kalitesi, performans, format karşılaştırma | Veri temizleme + CSV vs Parquet testi |
| 14 | Gelişmiş Analitik | Sınıflandırma, metin analizi, NLP | Duygu analizi uygulaması |
| 15 | Proje Sunumları | Öğrenci proje sunumları + dönem değerlendirmesi | |
| Final | 📝 FİNAL SINAVI | Ders işlenmez — tüm dönem konularından sınav | |
| Derse Katılım & Lab Çalışmaları | %10 |
| Ara Sınav (Hafta 8 — ders yok) | %25 |
| Dönem Projesi (Hafta 15) | %25 |
| Final Sınavı (dönem sonu — ders yok) | %40 |
🎯 Bu Haftanın Kazanımları
- Python'da değişken, liste, sözlük, döngü ve fonksiyon kavramlarını hatırlayıp uygulayabilir
- Nesne yönelimli programlamanın (OOP) temellerini anlayabilir
- Sunucu (server) kavramını ve dağıtık sistemleri açıklayabilir
- MapReduce mantığını kavramsal düzeyde anlayabilir
- Python'da
map(),filter(),reduce()fonksiyonlarını kullanabilir - Basit bir word count uygulamasını Python ile yazabilir
- Git ve GitHub temellerini bilir, GitHub hesabı açabilir
🐍 Bölüm 1: Python Hatırlatma
Bu bölümde geçen dönem öğrendiğiniz Python temellerini hızlıca hatırlayacağız. Her konuyu küçük örneklerle pekiştireceğiz. Eğer bir konuyu unuttuysanız endişelenmeyin — burada adım adım tekrar edeceğiz.
📦 Değişkenler ve Veri Tipleri
Programlamada değişken (variable), bir değeri bellekte saklamamıza yarayan isimlendirilmiş kutulardır. Python'da değişken tanımlamak çok kolaydır — tip belirtmeye gerek yoktur, Python bunu otomatik anlar.
# Değişken tanımlama
isim = "Ahmet" # str (metin/string)
yas = 21 # int (tam sayı)
boy = 1.75 # float (ondalıklı sayı)
ogrenci_mi = True # bool (mantıksal değer)
# Değişkenleri ekrana yazdırma
print(isim) # Ahmet
print(type(isim)) #
print(type(yas)) #
print(type(boy)) #
print(type(ogrenci_mi)) #
# f-string ile formatlı yazdırma
print(f"Merhaba, ben {isim}. {yas} yaşındayım ve boyum {boy} metre.")
str (metin), int (tam sayı), float (ondalıklı sayı) ve bool (True/False). type() fonksiyonu ile herhangi bir değerin tipini öğrenebilirsiniz.
| Veri Tipi | Python Adı | Örnek | Açıklama |
|---|---|---|---|
| Metin | str | "Merhaba" | Tırnak içinde yazılır |
| Tam Sayı | int | 42 | Ondalık kısmı olmayan sayılar |
| Ondalıklı Sayı | float | 3.14 | Noktadan sonra rakam içerir |
| Mantıksal | bool | True / False | Sadece iki değer alabilir |
| Hiçbir Şey | NoneType | None | Değer olmadığını belirtir |
📋 Listeler (Lists)
Liste, birden fazla değeri sıralı bir şekilde saklamak için kullanılan veri yapısıdır. Büyük veri ile çalışırken sürekli listelerle karşılaşacaksınız — çünkü veriler genellikle bir "şeylerin listesi" şeklindedir.
# Liste oluşturma
notlar = [85, 92, 78, 95, 88]
isimler = ["Ahmet", "Ayşe", "Mehmet", "Fatma"]
karisik = [1, "hello", 3.14, True] # Farklı tipler olabilir
# Eleman erişimi (index 0'dan başlar!)
print(notlar[0]) # 85 (ilk eleman)
print(notlar[-1]) # 88 (son eleman)
print(notlar[1:3]) # [92, 78] (1. ve 2. index, 3 dahil değil)
# Liste uzunluğu
print(len(notlar)) # 5
# Eleman ekleme
notlar.append(100) # Sona ekle
notlar.insert(0, 70) # Başa ekle
print(notlar) # [70, 85, 92, 78, 95, 88, 100]
# Eleman silme
notlar.remove(78) # Değere göre sil
silinen = notlar.pop() # Son elemanı çıkar ve döndür
print(f"Silinen: {silinen}")
# Liste sıralama
notlar.sort() # Küçükten büyüğe
print(notlar)
# Faydalı fonksiyonlar
print(f"En yüksek not: {max(notlar)}")
print(f"En düşük not: {min(notlar)}")
print(f"Ortalama: {sum(notlar) / len(notlar):.1f}")
📖 Sözlükler (Dictionaries)
Sözlük (dict), verileri anahtar-değer (key-value) çiftleri halinde saklayan veri yapısıdır. Gerçek hayattaki bir sözlük gibi düşünün: kelimeyi (anahtar) ararsınız, anlamını (değer) bulursunuz.
Büyük veri teknolojilerinde sözlükler çok önemlidir. JSON formatı (buna ileride detaylıca bakacağız), NoSQL veritabanları ve API'ler hep bu anahtar-değer mantığını kullanır.
# Sözlük oluşturma
ogrenci = {
"isim": "Ahmet",
"yas": 21,
"bolum": "Bilişim Teknolojileri",
"notlar": [85, 92, 78],
"aktif": True
}
# Değer okuma
print(ogrenci["isim"]) # Ahmet
print(ogrenci.get("yas")) # 21
print(ogrenci.get("adres", "Belirtilmemiş")) # Belirtilmemiş (varsayılan)
# Değer ekleme/güncelleme
ogrenci["email"] = "ahmet@mail.com" # Yeni anahtar ekleme
ogrenci["yas"] = 22 # Mevcut değeri güncelleme
# Sözlük üzerinde gezinme
for anahtar, deger in ogrenci.items():
print(f"{anahtar}: {deger}")
# Tüm anahtarlar ve değerler
print(ogrenci.keys()) # Anahtarlar
print(ogrenci.values()) # Değerler
# Sözlüğün içinde sözlük (iç içe yapı)
sinif = {
"ogrenci_1": {"isim": "Ahmet", "not": 85},
"ogrenci_2": {"isim": "Ayşe", "not": 92},
"ogrenci_3": {"isim": "Mehmet", "not": 78},
}
print(sinif["ogrenci_2"]["isim"]) # Ayşe
dict yapısı, JSON formatının Python'daki doğal karşılığıdır. JSON'u ileride öğrendiğinizde "bu zaten sözlük gibi" diyeceksiniz!
🔄 Döngüler
Döngüler, aynı işlemi tekrar tekrar yapmak için kullanılır. Büyük veri işleme, aslında milyonlarca kayıt üzerinde döngü kurmak demektir!
for Döngüsü
# Liste üzerinde gezinme
meyveler = ["elma", "armut", "portakal", "muz"]
for meyve in meyveler:
print(f"🍎 {meyve}")
# range() ile sayı döngüsü
for i in range(5): # 0, 1, 2, 3, 4
print(i, end=" ")
print() # Yeni satır
# range(başlangıç, bitiş, adım)
for i in range(1, 10, 2): # 1, 3, 5, 7, 9
print(i, end=" ")
print()
# enumerate() ile index ve değer birlikte
for index, meyve in enumerate(meyveler):
print(f"{index + 1}. {meyve}")
# Sözlük üzerinde döngü
ogrenci = {"isim": "Ahmet", "yas": 21, "bolum": "BT"}
for key, value in ogrenci.items():
print(f"{key} → {value}")
while Döngüsü
# Bir koşul doğru olduğu sürece döner
sayac = 0
while sayac < 5:
print(f"Sayaç: {sayac}")
sayac += 1
# Toplam hesaplama
toplam = 0
sayi = 1
while sayi <= 100:
toplam += sayi
sayi += 1
print(f"1'den 100'e toplam: {toplam}") # 5050
List Comprehension (Liste Üreteci)
List comprehension, döngüyle liste oluşturmanın kısa ve şık yoludur. Python'a özgü ve çok kullanılan bir tekniktir.
# Klasik yol
kareler = []
for i in range(1, 6):
kareler.append(i ** 2)
print(kareler) # [1, 4, 9, 16, 25]
# List comprehension ile aynı şey (tek satır!)
kareler = [i ** 2 for i in range(1, 6)]
print(kareler) # [1, 4, 9, 16, 25]
# Koşullu list comprehension
cift_sayilar = [x for x in range(20) if x % 2 == 0]
print(cift_sayilar) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# String işlemiyle birlikte
isimler = ["ahmet", "ayşe", "mehmet"]
buyuk_isimler = [isim.upper() for isim in isimler]
print(buyuk_isimler) # ['AHMET', 'AYŞE', 'MEHMET']
⚙️ Fonksiyonlar
Fonksiyon, belirli bir görevi yapan ve tekrar tekrar çağrılabilen kod bloğudur. "Yemek tarifi" gibi düşünebilirsiniz: bir kez yazarsınız, istediğiniz kadar kullanırsınız.
# Basit fonksiyon
def selamla(isim):
"""Verilen ismi selamlar."""
return f"Merhaba, {isim}! 👋"
mesaj = selamla("Ahmet")
print(mesaj) # Merhaba, Ahmet! 👋
# Birden fazla parametre
def toplam_bul(sayilar):
"""Bir listedeki sayıların toplamını döndürür."""
sonuc = 0
for sayi in sayilar:
sonuc += sayi
return sonuc
notlar = [85, 92, 78, 95, 88]
print(f"Toplam: {toplam_bul(notlar)}") # 438
# Varsayılan parametre
def bilgi_goster(isim, bolum="Belirtilmemiş"):
print(f"İsim: {isim}, Bölüm: {bolum}")
bilgi_goster("Ahmet", "Bilişim") # İsim: Ahmet, Bölüm: Bilişim
bilgi_goster("Ayşe") # İsim: Ayşe, Bölüm: Belirtilmemiş
# Birden fazla değer döndürme
def istatistikler(sayilar):
"""Min, max ve ortalama döndürür."""
return min(sayilar), max(sayilar), sum(sayilar) / len(sayilar)
en_kucuk, en_buyuk, ortalama = istatistikler(notlar)
print(f"Min: {en_kucuk}, Max: {en_buyuk}, Ort: {ortalama:.1f}")
def anahtar kelimesinden sonra fonksiyon adı, parantez içinde parametreler ve : gelir. Fonksiyon gövdesi girintili (indented) yazılmalıdır — Python'da girinti çok önemlidir!
⚡ Lambda (Anonim Fonksiyonlar)
Lambda, tek satırlık küçük fonksiyonlar oluşturmak için kullanılır. İsim vermeden hızlıca bir fonksiyon tanımlarsınız. Birazdan göreceğimiz map() ve filter() ile sıkça kullanılır.
# Normal fonksiyon
def kare_al(x):
return x ** 2
# Aynısı lambda ile
kare_al = lambda x: x ** 2
print(kare_al(5)) # 25
# İki parametre
topla = lambda a, b: a + b
print(topla(3, 4)) # 7
# Sıralama'da lambda kullanımı
ogrenciler = [
{"isim": "Ahmet", "not": 85},
{"isim": "Ayşe", "not": 92},
{"isim": "Mehmet", "not": 78},
]
# Nota göre sırala (büyükten küçüğe)
sirali = sorted(ogrenciler, key=lambda x: x["not"], reverse=True)
for o in sirali:
print(f"{o['isim']}: {o['not']}")
🔗 Veri Yapıları ve Algoritmalar Ders Notları
Python temellerinizi tazelemek istiyorsanız oradan başlamak iyi bir fikir!
🏗️ Nesne Yönelimli Programlama (OOP — Object-Oriented Programming)
OOP, kodu nesneler (objects) etrafında organize eden bir programlama yaklaşımıdır. Gerçek dünyadaki kavramları (öğrenci, araba, dosya) yazılıma modellememizi sağlar. Büyük veri kütüphaneleri (Pandas, PySpark) OOP yapısındadır — DataFrame aslında bir sınıfın (class) örneğidir (instance).
| Kavram (TR) | İngilizce | Açıklama | Örnek |
|---|---|---|---|
| Sınıf | Class | Nesnenin kalıbı, şablonu | class Ogrenci: |
| Nesne | Object / Instance | Sınıftan oluşturulan somut örnek | ahmet = Ogrenci("Ahmet") |
| Özellik | Attribute / Property | Nesnenin verileri | ahmet.isim, ahmet.yas |
| Metot | Method | Nesnenin davranışları/fonksiyonları | ahmet.selamla() |
| Yapıcı | Constructor (__init__) | Nesne oluşturulunca çalışan fonksiyon | def __init__(self, isim): |
# Basit bir sınıf tanımlama
class Ogrenci:
"""Öğrenci bilgilerini tutan sınıf."""
def __init__(self, isim, numara, bolum="Bilişim"):
# Özellikler (attributes)
self.isim = isim
self.numara = numara
self.bolum = bolum
self.notlar = []
def not_ekle(self, not_):
"""Öğrenciye not ekler."""
self.notlar.append(not_)
def ortalama(self):
"""Not ortalamasını döndürür."""
if not self.notlar:
return 0
return sum(self.notlar) / len(self.notlar)
def bilgi(self):
"""Öğrenci bilgilerini yazdırır."""
print(f"📋 {self.isim} ({self.numara}) - {self.bolum}")
print(f" Notlar: {self.notlar}")
print(f" Ortalama: {self.ortalama():.1f}")
# Nesne (object/instance) oluşturma
ahmet = Ogrenci("Ahmet Yılmaz", "2024001")
ahmet.not_ekle(85)
ahmet.not_ekle(92)
ahmet.not_ekle(78)
ahmet.bilgi()
# Farklı parametrelerle başka bir nesne
ayse = Ogrenci("Ayşe Demir", "2024002", "Elektrik")
ayse.not_ekle(95)
ayse.bilgi()
# Neden önemli? Pandas'ta her DataFrame aslında bir nesne!
# df = pd.DataFrame(...) # DataFrame sınıfından nesne oluşturma
# df.head() # head() bir metot
# df.shape # shape bir özellik (attribute)
pd.DataFrame(), spark.read.csv() gibi ifadelerin hepsi OOP yapısındadır. df.head() dediğinizde aslında DataFrame sınıfının head metodunu çağırıyorsunuz. Bunu bilmek, hata mesajlarını anlamanızı çok kolaylaştırır!
📂 Python ile Dosya Okuma/Yazma
Büyük veri ile çalışırken sürekli dosyaları okuyup yazacağız. Python'un open() fonksiyonu bu iş için temel araçtır.
# ─── Dosyaya yazma ───
with open("merhaba.txt", "w", encoding="utf-8") as dosya:
dosya.write("Merhaba Dünya!\n")
dosya.write("Büyük Veri Teknolojileri dersi.\n")
# ─── Dosyadan okuma ───
with open("merhaba.txt", "r", encoding="utf-8") as dosya:
icerik = dosya.read()
print(icerik)
# ─── Satır satır okuma (büyük dosyalar için!) ───
with open("merhaba.txt", "r", encoding="utf-8") as dosya:
for satir_no, satir in enumerate(dosya, 1):
print(f"Satır {satir_no}: {satir.strip()}")
# ─── Sonuna ekleme (append) ───
with open("merhaba.txt", "a", encoding="utf-8") as dosya:
dosya.write("Bu satır sonradan eklendi.\n")
with open(...) as dosya: yapısı, dosyayı otomatik olarak kapatır. with kullanmazsanız dosya.close() yazmanız gerekir — unutursanız veri kaybı olabilir!
🐙 Bölüm 2: Git, GitHub ve GitHub Classroom
Bu derste ödevler GitHub Classroom üzerinden verilecektir. Bu yüzden Git ve GitHub'ı öğrenmek zorunludur! Ayrıca Git, yazılım dünyasında en temel araçlardan biridir — iş hayatında da sürekli kullanacaksınız.
Git Nedir?
Git, kodlarınızdaki değişiklikleri takip eden bir versiyon kontrol sistemidir (Version Control System — VCS). Bir belgenin "v1, v2, v3..." sürümlerini elle tutmak yerine, Git bunu otomatik ve akıllı bir şekilde yapar.
GitHub Nedir?
GitHub, Git projelerinizi internette sakladığınız bir platformdur. Kodlarınızı yedekler, başkalarıyla paylaşmanızı sağlar ve ekip çalışması için gerekli araçları sunar.
| Kavram | İngilizce | Açıklama |
|---|---|---|
| Depo | Repository (repo) | Proje klasörünüz — tüm dosyalar ve geçmiş burada |
| Kayıt | Commit | Değişikliklerin anlık fotoğrafı (snapshot) |
| Dal | Branch | Ana koddan bağımsız çalışma alanı |
| İtme | Push | Yerel değişiklikleri GitHub'a gönderme |
| Çekme | Pull | GitHub'daki değişiklikleri yerel bilgisayara alma |
| Klonlama | Clone | Bir GitHub deposunu bilgisayara kopyalama |
📝 GitHub Hesabı Açma
- github.com adresine gidin
- "Sign up" butonuna tıklayın
- Kullanıcı adınızı profesyonel seçin (ör:
ahmet-yilmaz, gerçek isminizi kullanın) - Okul e-postanızı kullanırsanız GitHub Student Developer Pack (ücretsiz Pro hesap!) alabilirsiniz
⚙️ Git Kurulumu ve Temel Komutlar
# Git kurulumu
# Windows: https://git-scm.com/download/win
# Mac: brew install git
# Linux: sudo apt install git
# İlk kurulum (bir kez yapılır)
git config --global user.name "Adınız Soyadınız"
git config --global user.email "email@adresiniz.com"
# Yeni bir proje başlatma
mkdir odevim
cd odevim
git init # Bu klasörü Git deposu yap
# Dosya ekleyip kaydetme
echo "Merhaba" > README.md
git add README.md # Dosyayı sahneye al (stage)
git commit -m "İlk commit" # Değişikliği kaydet
# GitHub'a bağlama ve gönderme
git remote add origin https://github.com/kullanici/odevim.git
git push -u origin main # GitHub'a gönder
📊 Temel Git İş Akışı
(Working Directory)"] -->|git add| B["📋 Sahne
(Staging Area)"] B -->|git commit| C["📦 Yerel Depo
(Local Repository)"] C -->|git push| D["☁️ GitHub
(Remote Repository)"] D -->|git pull| A D -->|git clone| A
🏫 GitHub Classroom
GitHub Classroom, öğretmenlerin ödev dağıtması ve toplaması için kullanılan bir araçtır. Bu derste ödevleriniz GitHub Classroom üzerinden verilecek ve teslim edilecektir.
git clone <repo-url> ile bilgisayarınıza indirin. Colab'da da açabilirsiniz.git add, git commit, git push ile gönderin. Son push tarihi teslim tarihidir!📚 Git ve GitHub Kaynakları
| Kaynak | Tür | Link |
|---|---|---|
| Git Resmi Kitap (Pro Git) | 📖 Kitap (Ücretsiz) | git-scm.com/book/tr |
| GitHub Skills | 🎓 İnteraktif kurs | skills.github.com |
| Learn Git Branching | 🎮 Oyunlaştırılmış öğrenme | learngitbranching.js.org |
| GitHub Student Pack | 🎁 Ücretsiz araçlar | education.github.com/pack |
🖥️ Bölüm 3: Sunucu (Server) Kavramı
Dağıtık sistemlere geçmeden önce, sunucu (server) kavramını iyi anlamak gerekiyor. "Sunucu" kelimesini duymuş olabilirsiniz ama tam olarak ne demek?
Sunucu (Server) Nedir?
Bir sunucu, diğer bilgisayarlara (istemcilere / clients) hizmet sunan bir bilgisayardır. Aslında sizin kullandığınız bilgisayardan temelde farklı değildir — sadece görevi farklıdır.
- Diğer bilgisayarlara hizmet sunar
- 7/24 açık kalır, kesintisiz çalışır
- Genellikle monitörü/klavyesi yoktur
- Çok güçlü RAM ve işlemcisi vardır
- Veri merkezlerinde (data center) bulunur
- Sunucudan hizmet ister
- Kullanıcı tarafından açılıp kapatılır
- Monitör, klavye, fare ile kullanılır
- Sizin bilgisayarınız, telefonunuz
- Tarayıcınız bir "web client"tır
Sunucu Türleri
| Sunucu Türü (TR) | İngilizce | Görevi | Örnek |
|---|---|---|---|
| Web Sunucusu | Web Server | Web sitelerini barındırır | Apache, Nginx |
| Veritabanı Sunucusu | Database Server | Verileri saklar ve sorgular | MySQL, PostgreSQL, MongoDB |
| Dosya Sunucusu | File Server | Dosyaları merkezi olarak depolar | NAS, HDFS |
| Uygulama Sunucusu | Application Server | Uygulamaları çalıştırır | Tomcat, Flask |
| DNS Sunucusu | DNS Server | Alan adlarını IP'ye çevirir | google.com → 142.250.x.x |
Temel Ağ Terimleri
| Kavram (TR) | İngilizce | Açıklama |
|---|---|---|
| IP Adresi | IP Address | Her bilgisayarın ağdaki benzersiz numarası (ör: 192.168.1.1) |
| Port | Port | Bir bilgisayardaki hizmetin kapı numarası (ör: 80 = web, 3306 = MySQL) |
| Protokol | Protocol | İletişim kuralları (HTTP, FTP, SSH) |
| API | Application Programming Interface | Programların birbirleriyle konuşma yöntemi |
| Bulut | Cloud | Başka şirketlerin (AWS, Google, Azure) sunucularını kiralamak |
| Düğüm | Node | Bir ağ/kümedeki tek bir bilgisayar |
| Küme | Cluster | Birlikte çalışan bilgisayar grubu |
🌐 Bölüm 4: Dağıtık Sistemler
Dağıtık Sistem Nedir?
Şunu hayal edin: Elinizde 1 TB (1000 GB) boyutunda bir veri dosyası var. Bir bilgisayarda bu dosyayı işlemek saatler sürebilir. Peki ya bu dosyayı 100 bilgisayara bölüp, her birine küçük bir parça verseniz? İşlem dakikalara iner!
İşte dağıtık sistem (distributed system) tam olarak budur: birden fazla bilgisayarın (node/düğüm), bir ağ üzerinde birlikte çalışarak büyük bir görevi paylaşmasıdır.
1 TB veri
⏱️ 10 saat"] -- Dağıtık Sistem --> B["🖥️ Bilgisayar 1
200 GB"] A --> C["🖥️ Bilgisayar 2
200 GB"] A --> D["🖥️ Bilgisayar 3
200 GB"] A --> E["🖥️ Bilgisayar 4
200 GB"] A --> F["🖥️ Bilgisayar 5
200 GB"] B --> G["✅ Sonuç
⏱️ ~2 saat"] C --> G D --> G E --> G F --> G
Günlük Hayattan Dağıtık Sistem Örnekleri
Neden Dağıtık Sistemlere İhtiyaç Duyarız?
| Problem | Tek Bilgisayar | Dağıtık Sistem |
|---|---|---|
| Kapasite | RAM/disk sınırlı (ör. 16 GB RAM) | Düğüm ekleyerek sınırsız ölçeklenme |
| Hız | Tek işlemci ile sıralı işlem | Paralel işlem, çok daha hızlı |
| Güvenilirlik | Bilgisayar bozulursa her şey durur | Bir düğüm düşse, diğerleri devam eder |
| Maliyet | Süper bilgisayar → çok pahalı | Sıradan bilgisayarlardan küme → ucuz |
🐘 Hadoop Ekosistemi
Apache Hadoop, büyük veri işleme dünyasının temel taşlarından biridir. 2006 yılında Yahoo!'da geliştirilmeye başlanmıştır. Adını, yaratıcısı Doug Cutting'in oğlunun oyuncak filinden alır! 🐘
Hadoop'un 3 Temel Bileşeni
Hadoop Distributed File System
Dağıtık Dosya Sistemi"] H --> MR["⚙️ MapReduce
Dağıtık İşleme Çerçevesi
Veriyi paralel işleme"] H --> YARN["🎯 YARN
Yet Another Resource Negotiator
Kaynak yönetimi"] HDFS --> D1["💾 Veriyi parçalara böler"] HDFS --> D2["💾 Birden fazla kopyasını tutar"] MR --> M1["🔄 Map: Veriyi parçala ve dönüştür"] MR --> M2["🔄 Reduce: Sonuçları birleştir"] YARN --> Y1["📊 Hangi iş nerede çalışsın?"] YARN --> Y2["📊 Kaynak tahsisi"]
🗺️ MapReduce Kavramı
MapReduce, büyük verileri işlemek için kullanılan iki aşamalı bir yaklaşımdır:
Veriyi parçalara ayırır ve her parça üzerinde bir dönüşüm uygular.
Örnek: "Her cümlede geçen kelimeleri say"
- Girdi: "elma armut elma"
- Çıktı: [(elma, 1), (armut, 1), (elma, 1)]
Map sonuçlarını birleştirir ve nihai sonucu üretir.
Örnek: "Aynı kelimelerin sayılarını topla"
- Girdi: [(elma, 1), (armut, 1), (elma, 1)]
- Çıktı: {elma: 2, armut: 1}
'elma armut elma
armut portakal elma'"] --> B["🗺️ MAP
Parçala ve dönüştür"] B --> C["(elma, 1)
(armut, 1)
(elma, 1)"] B --> D["(armut, 1)
(portakal, 1)
(elma, 1)"] C --> E["🔀 SHUFFLE
Grupla"] D --> E E --> F["📊 REDUCE
Birleştir"] F --> G["✅ Sonuç
elma: 3
armut: 2
portakal: 1"]
🔧 Bölüm 5: Python'da map, filter, reduce
Python'da map(), filter() ve reduce() fonksiyonları, MapReduce mantığının temellerini oluşturur. Bu fonksiyonlar, bir listedeki her eleman üzerinde işlem yapmamızı sağlar.
🗺️ map() Fonksiyonu
map(fonksiyon, liste) → Bir listedeki her elemanı verilen fonksiyondan geçirir ve yeni bir sonuç üretir.
# Örnek 1: Sayıların karesini alma
sayilar = [1, 2, 3, 4, 5]
# Klasik yol (döngü ile)
kareler_v1 = []
for s in sayilar:
kareler_v1.append(s ** 2)
print(kareler_v1) # [1, 4, 9, 16, 25]
# map() ile
kareler_v2 = list(map(lambda x: x ** 2, sayilar))
print(kareler_v2) # [1, 4, 9, 16, 25]
# Örnek 2: Sıcaklıkları Celsius'tan Fahrenheit'a çevirme
celsius = [0, 20, 37, 100]
fahrenheit = list(map(lambda c: (c * 9/5) + 32, celsius))
print(fahrenheit) # [32.0, 68.0, 98.6, 212.0]
# Örnek 3: İsimlerin ilk harfini büyük yapma
isimler = ["ahmet", "ayşe", "mehmet"]
duzgun_isimler = list(map(str.capitalize, isimler))
print(duzgun_isimler) # ['Ahmet', 'Ayşe', 'Mehmet']
# Örnek 4: Bir fonksiyon tanımlayıp map ile kullanma
def not_degerlendirme(not_):
if not_ >= 90: return "AA"
elif not_ >= 80: return "BA"
elif not_ >= 70: return "BB"
elif not_ >= 60: return "CB"
else: return "FF"
notlar = [95, 82, 67, 45, 78]
harf_notlari = list(map(not_degerlendirme, notlar))
print(harf_notlari) # ['AA', 'BA', 'CB', 'FF', 'BB']
🔍 filter() Fonksiyonu
filter(fonksiyon, liste) → Bir listedeki elemanları, verilen koşula göre süzer. Koşul True döndüren elemanlar kalır.
# Örnek 1: Çift sayıları filtreleme
sayilar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ciftler = list(filter(lambda x: x % 2 == 0, sayilar))
print(ciftler) # [2, 4, 6, 8, 10]
# Örnek 2: Geçen öğrencileri filtreleme (50 ve üstü)
notlar = [45, 82, 33, 91, 67, 28, 75]
gecenler = list(filter(lambda n: n >= 50, notlar))
print(f"Geçenler: {gecenler}") # [82, 91, 67, 75]
print(f"Geçen sayısı: {len(gecenler)}")
# Örnek 3: Boş olmayan stringleri filtreleme
veriler = ["Ahmet", "", "Ayşe", None, "Mehmet", "", "Fatma"]
temiz = list(filter(None, veriler)) # None ve boş string'ler atılır
print(temiz) # ['Ahmet', 'Ayşe', 'Mehmet', 'Fatma']
# Örnek 4: Sözlük listesinden filtreleme
ogrenciler = [
{"isim": "Ahmet", "not": 85},
{"isim": "Ayşe", "not": 42},
{"isim": "Mehmet", "not": 91},
{"isim": "Fatma", "not": 38},
]
basarili = list(filter(lambda o: o["not"] >= 50, ogrenciler))
for o in basarili:
print(f" ✅ {o['isim']}: {o['not']}")
📊 reduce() Fonksiyonu
reduce(fonksiyon, liste) → Bir listeyi tek bir değere indirger. Listedeki elemanları soldan sağa ikişer ikişer işler.
reduce() fonksiyonu Python 3'te functools modülünden import edilmelidir. Diğerleri gibi doğrudan kullanılamaz.
from functools import reduce
# Örnek 1: Toplam hesaplama
sayilar = [1, 2, 3, 4, 5]
toplam = reduce(lambda a, b: a + b, sayilar)
print(f"Toplam: {toplam}") # 15
# Nasıl çalışır?
# Adım 1: 1 + 2 = 3
# Adım 2: 3 + 3 = 6
# Adım 3: 6 + 4 = 10
# Adım 4: 10 + 5 = 15
# Örnek 2: Çarpım hesaplama (faktöriyel gibi)
carpim = reduce(lambda a, b: a * b, sayilar)
print(f"Çarpım: {carpim}") # 120
# Örnek 3: En büyük elemanı bulma
en_buyuk = reduce(lambda a, b: a if a > b else b, sayilar)
print(f"En büyük: {en_buyuk}") # 5
# Örnek 4: Kelime listesini birleştirme
kelimeler = ["Büyük", "Veri", "Teknolojileri"]
cumle = reduce(lambda a, b: a + " " + b, kelimeler)
print(cumle) # "Büyük Veri Teknolojileri"
🔗 map + filter + reduce Birlikte
from functools import reduce
# Senaryo: Bir sınıftaki notlardan...
# 1) 50'nin altını filtrele (kalanlar)
# 2) Her notu 10 puan bonus ekle (map)
# 3) Ortalamasını hesapla (reduce)
notlar = [45, 82, 33, 91, 67, 28, 75, 88, 54, 39]
# Adım 1: Geçenleri filtrele
gecenler = list(filter(lambda n: n >= 50, notlar))
print(f"Geçen notlar: {gecenler}")
# Adım 2: 10 puan bonus ekle (max 100)
bonuslu = list(map(lambda n: min(n + 10, 100), gecenler))
print(f"Bonuslu notlar: {bonuslu}")
# Adım 3: Ortalama hesapla
toplam = reduce(lambda a, b: a + b, bonuslu)
ortalama = toplam / len(bonuslu)
print(f"Ortalama: {ortalama:.1f}")
📝 Bölüm 6: MapReduce Uygulaması — Word Count
Word Count (kelime sayma), dağıtık sistemlerin "Hello World" uygulamasıdır. Her büyük veri kursunda ilk yapılan örnektir. Bir metindeki her kelimenin kaç kez geçtiğini bulacağız.
Basit Word Count
# Basit Word Count - Tek bilgisayar versiyonu
metin = """
Python büyük veri dünyasında çok popüler bir dildir
Büyük veri teknolojileri ile veri analizi yapabiliriz
Python ile veri işleme çok kolaydır
"""
# Metni küçük harfe çevir ve kelimelere ayır
kelimeler = metin.lower().split()
# Kelimeleri say
kelime_sayilari = {}
for kelime in kelimeler:
if kelime in kelime_sayilari:
kelime_sayilari[kelime] += 1
else:
kelime_sayilari[kelime] = 1
# Sonuçları en çok geçenden en az geçene sırala
sirali = sorted(kelime_sayilari.items(), key=lambda x: x[1], reverse=True)
print("=== Kelime Sayıları ===")
for kelime, sayi in sirali:
print(f" {kelime:20s} → {sayi}")
MapReduce Mantığıyla Word Count
Şimdi aynı işlemi MapReduce mantığıyla yapalım. Bu yaklaşımda veriyi parçalara bölüp, her parçayı ayrı ayrı işleyeceğiz.
from functools import reduce
# ─── Veri ───
metin = """
Python büyük veri dünyasında çok popüler bir dildir
Büyük veri teknolojileri ile veri analizi yapabiliriz
Python ile veri işleme çok kolaydır
Dağıtık sistemler büyük veri için gereklidir
"""
# ─── ADIM 1: SPLIT (Veriyi parçalara böl) ───
# Gerçek Hadoop'ta bu farklı bilgisayarlara gönderilir
satirlar = metin.strip().lower().split('\n')
print("📦 Parçalar (her satır ayrı bir düğümde işlenebilir):")
for i, satir in enumerate(satirlar):
print(f" Düğüm {i+1}: '{satir.strip()}'")
# ─── ADIM 2: MAP (Her parçada kelimeleri say) ───
def map_fonksiyonu(satir):
"""Her kelime için (kelime, 1) çifti üret."""
kelimeler = satir.strip().split()
return [(kelime, 1) for kelime in kelimeler]
# Her satırı map fonksiyonundan geçir
map_sonuclari = list(map(map_fonksiyonu, satirlar))
print("\n🗺️ MAP Sonuçları:")
for i, sonuc in enumerate(map_sonuclari):
print(f" Düğüm {i+1}: {sonuc}")
# ─── ADIM 3: SHUFFLE (Düzleştir ve grupla) ───
# Tüm (kelime, 1) çiftlerini tek listeye topla
tum_ciftler = reduce(lambda a, b: a + b, map_sonuclari)
print(f"\n🔀 SHUFFLE - Tüm çiftler: {len(tum_ciftler)} adet")
# ─── ADIM 4: REDUCE (Aynı kelimelerin sayılarını topla) ───
def reduce_fonksiyonu(ciftler):
"""Aynı kelimelerin sayılarını topla."""
sonuc = {}
for kelime, sayi in ciftler:
sonuc[kelime] = sonuc.get(kelime, 0) + sayi
return sonuc
nihai_sonuc = reduce_fonksiyonu(tum_ciftler)
# Sonuçları sırala ve göster
sirali = sorted(nihai_sonuc.items(), key=lambda x: x[1], reverse=True)
print("\n📊 REDUCE - Nihai Sonuç:")
print("=" * 35)
for kelime, sayi in sirali:
bar = "█" * sayi
print(f" {kelime:20s} {sayi:2d} {bar}")
📦 Bölüm 7: Modül ve Kütüphane Kavramı
Bu kavramları şimdiden öğrenmemiz önemli çünkü bundan sonra sürekli kütüphaneler kullanacağız (Pandas, PySpark, Matplotlib vb.).
Modül Nedir?
Modül, Python kodlarını içeren bir .py dosyasıdır. İçinde fonksiyonlar, sınıflar ve değişkenler bulunabilir. Başka bir dosyadan import ile çağırabilirsiniz.
# Python'un yerleşik (built-in) modülleri
import math
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
import random
print(random.randint(1, 100)) # 1-100 arası rastgele sayı
import datetime
simdi = datetime.datetime.now()
print(simdi) # 2026-02-16 14:30:00.123456
# 'from' ile sadece istediğini al
from math import pi, sqrt
print(pi) # 3.141592653589793
print(sqrt(25)) # 5.0
# Takma isim (alias)
import datetime as dt
print(dt.date.today())
Kütüphane (Library) Nedir?
Kütüphane, belirli bir amaca yönelik birden fazla modülün bir araya getirilmiş paketidir. Başkaları tarafından yazılmış hazır kodlardır — tekerleği yeniden icat etmenize gerek yok!
| Kütüphane | Ne İşe Yarar? | Bu Derste? |
|---|---|---|
pandas | Tablo verilerini işleme ve analiz | ✅ Çok kullanacağız |
numpy | Sayısal hesaplama, matris işlemleri | ✅ Pandas'ın altyapısı |
matplotlib | Grafik ve görselleştirme | ✅ Veri görselleştirme |
seaborn | İstatistiksel görselleştirme | ✅ Estetik grafikler |
pyspark | Dağıtık veri işleme (Spark) | ✅ Büyük veri işleme |
scikit-learn | Makine öğrenmesi | ✅ Temel ML |
requests | HTTP istekleri, API'lerden veri çekme | ✅ ETL süreçleri |
pymongo | MongoDB veritabanı bağlantısı | ✅ NoSQL |
pip ile Kütüphane Kurulumu
pip, Python'un paket yöneticisidir. Kütüphaneleri internetten indirip kurmanızı sağlar.
# Kütüphane kurma
pip install pandas
pip install numpy matplotlib seaborn
# Kurulu kütüphaneleri listeleme
pip list
# Belirli bir versiyon kurma
pip install pandas==2.1.0
# Kütüphaneyi güncelleme
pip install --upgrade pandas
# requirements.txt ile toplu kurulum
pip install -r requirements.txt
!pip install kutuphane_adi yazmanız yeterlidir (başındaki ! işaretine dikkat).
💻 Bölüm 8: Jupyter Notebook ve Google Colab
Bu derste kodlarımızı Jupyter Notebook veya Google Colab ortamında yazacağız. Bu ortamlar, kod yazmanızı, çalıştırmanızı ve sonuçları anında görmenizi sağlar.
Jupyter Notebook Nedir?
Jupyter Notebook, web tarayıcısında çalışan interaktif bir kodlama ortamıdır. Kod hücreleri, metin hücreleri ve görsel çıktıları bir arada barındırır. Veri bilimi ve büyük veri dünyasında en çok kullanılan araçtır.
pip install notebook ile kurup, jupyter notebook ile başlatırsınız. Offline çalışır.🚀 Bölüm 9: Günümüzde Dağıtık Sistemler
Hadoop 2006'da çığır açtı ama bugün büyük veri dünyası çok değişti. Artık daha hızlı, daha kolay ve daha modern araçlar var.
Hadoop vs Spark
| Özellik | Hadoop MapReduce | Apache Spark |
|---|---|---|
| Hız | Diske yazar (yavaş) | Bellekte işler (100x hızlı) |
| Kullanım | Java ağırlıklı, karmaşık | Python/Scala/Java, kolay API |
| Gerçek zamanlı | Zayıf | Spark Streaming ile güçlü |
| ML desteği | Mahout (eski) | MLlib (modern) |
| Güncellik | Azalıyor | Endüstri standardı |
Büyük Veri Ekosistemi Haritası
Dönem boyunca bu araçların birçoğuna değineceğiz. Şimdilik "büyük resmi" görmek yeterli:
📋 Bölüm Özeti
- ✅ Python temellerini hatırladık: değişkenler, listeler, sözlükler, döngüler, fonksiyonlar, lambda
- ✅ OOP kavramını öğrendik: sınıf, nesne, metot, özellik
- ✅ Python ile dosya okuma/yazma yaptık
- ✅ Git ve GitHub temellerini, GitHub Classroom'u öğrendik
- ✅ Sunucu (server) kavramını ve istemci-sunucu mimarisini anladık
- ✅ Dağıtık sistemlerin ne olduğunu ve neden ihtiyaç duyulduğunu öğrendik
- ✅ Hadoop ekosistemini (HDFS, MapReduce, YARN) kavramsal olarak tanıdık
- ✅ MapReduce mantığını anladık: Map → Shuffle → Reduce
- ✅ Python'da
map(),filter(),reduce()fonksiyonlarını kullandık - ✅ Word Count uygulamasını hem klasik hem MapReduce yaklaşımıyla yazdık
- ✅ Modül ve kütüphane kavramlarını, pip kullanımını öğrendik
- ✅ Jupyter Notebook / Google Colab'ı tanıdık
- GitHub hesabı açın (profesyonel kullanıcı adı seçin!)
- Google Colab'da bir hesap açın ve ilk notebook'unuzu oluşturun
- Bu derste gördüğümüz kod örneklerini Colab'da çalıştırın
- Kendi Word Count uygulamanızı yazın: Sevdiğiniz bir şarkının sözlerini bulun, en çok geçen 10 kelimeyi listeleyin
- (Bonus)
collections.Counterkütüphanesini araştırıp Word Count'u onunla da yazın - (Bonus) Learn Git Branching sitesinde ilk 5 seviyeyi tamamlayın