📊 Büyük Veri Teknolojileri
📅 BÖLÜM 1

Dağıtık Sistemlere Giriş ve Python Hatırlatma

Büyük veri dünyasına ilk adım: Python temellerini tazeleyip, dağıtık sistemlerin ne olduğunu ve neden ihtiyaç duyulduğunu öğreniyoruz.

📖 Teori: 2 saat 💻 Uygulama: 3 saat 📊 Seviye: Giriş

📅 Dönemlik Ders Planı (Tentative)

⚠️ Bu plan taslaktır (tentative) ve dönem içinde değişebilir!

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.

⚖️ Yasal Mevzuat ve Akademik Dürüstlük

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.

HaftaKonu BaşlığıTeori ÖzetUygulama Özet
1Dağıtık Sistemlere GirişDağıtık sistem nedir? Hadoop, MapReduce (kavramsal)Python tekrarı, map/filter/reduce, Word Count
2Veri ModellemeVeri hiyerarşisi, veri türleri, 5V, DIKWCSV/JSON okuma-yazma, Pandas'a giriş
3Veri İşleme ÇerçeveleriSpark nedir? Batch vs Stream, lazy evaluationPySpark ile ilk adımlar (Colab)
4Veri DepolamaVeritabanı nedir? SQL vs NoSQLSQLite ile SQL temelleri, MongoDB Atlas tanıtım
5Gerçek Zamanlı Veri AkışıKafka, Streaming kavramlarıPython ile producer-consumer simülasyonu
6Veri Analiz TeknikleriEDA, makine öğrenmesine girişScikit-learn ile temel regresyon
7Büyük Veri Altyapı YönetimiEkosistem haritası, araçlarPySpark SQL sorguları
8📝 ARA SINAVBu hafta ders işlenmez — tüm süre sınava ayrılmıştır
9Veri GörselleştirmeGrafik türleri, dashboard kavramıMatplotlib, Seaborn, Plotly
10Büyük Veri GüvenliğiCIA, KVKK, GDPR, anonimleştirmePython ile veri hashleme, maskeleme
11Bulut Tabanlı ÇözümlerBulut bilişim, DatabricksDatabricks Community Edition ile PySpark
12Veri Entegrasyonu ve ETLETL nedir? Veri kaynaklarıAPI'den veri çekme, Pandas ile temizleme
13Yönetişim ve OptimizasyonVeri kalitesi, performans, format karşılaştırmaVeri temizleme + CSV vs Parquet testi
14Gelişmiş AnalitikSınıflandırma, metin analizi, NLPDuygu analizi uygulaması
15Proje SunumlarıÖğrenci proje sunumları + dönem değerlendirmesi
Final📝 FİNAL SINAVIDers işlenmez — tüm dönem konularından sınav
📊 Değerlendirme (Tentative)
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ı

🐍 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.")
💡 Bilgi
Python'da 4 temel veri tipi vardır: str (metin), int (tam sayı), float (ondalıklı sayı) ve bool (True/False). type() fonksiyonu ile herhangi bir değerin tipini öğrenebilirsiniz.
Veri TipiPython AdıÖrnekAçıklama
Metinstr"Merhaba"Tırnak içinde yazılır
Tam Sayıint42Ondalık kısmı olmayan sayılar
Ondalıklı Sayıfloat3.14Noktadan sonra rakam içerir
MantıksalboolTrue / FalseSadece iki değer alabilir
Hiçbir ŞeyNoneTypeNoneDeğ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
💜 İpucu
Sözlüklerin 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}")
⚠️ Dikkat
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']}")
📚 Daha Fazla Python İçin
Geçen dönem Veri Yapıları ve Algoritmalar dersinde Python'u daha detaylı öğrenmiştik. O dersin notlarına aşağıdaki linkten ulaşabilirsiniz:

🔗 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)İngilizceAçıklamaÖrnek
SınıfClassNesnenin kalıbı, şablonuclass Ogrenci:
NesneObject / InstanceSınıftan oluşturulan somut örnekahmet = Ogrenci("Ahmet")
ÖzellikAttribute / PropertyNesnenin verileriahmet.isim, ahmet.yas
MetotMethodNesnenin davranışları/fonksiyonlarıahmet.selamla()
YapıcıConstructor (__init__)Nesne oluşturulunca çalışan fonksiyondef __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)
💜 Neden OOP Bilmek Lazım?
Bu derste sürekli kullanacağımız 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 bloğu nedir?
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.

💡 Analoji
Git'i Google Docs'taki "Sürüm geçmişi" (Version History) gibi düşünebilirsiniz. Her değişikliği kaydeder, istediğiniz zaman geriye dönebilirsiniz. Ama Git çok daha güçlüdür — birden fazla kişi aynı anda çalışabilir!

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İngilizceAçıklama
DepoRepository (repo)Proje klasörünüz — tüm dosyalar ve geçmiş burada
KayıtCommitDeğişikliklerin anlık fotoğrafı (snapshot)
DalBranchAna koddan bağımsız çalışma alanı
İtmePushYerel değişiklikleri GitHub'a gönderme
ÇekmePullGitHub'daki değişiklikleri yerel bilgisayara alma
KlonlamaCloneBir GitHub deposunu bilgisayara kopyalama

📝 GitHub Hesabı Açma

🚀 Hemen Yapın!
  1. github.com adresine gidin
  2. "Sign up" butonuna tıklayın
  3. Kullanıcı adınızı profesyonel seçin (ör: ahmet-yilmaz, gerçek isminizi kullanın)
  4. 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ışı

graph LR A["📂 Çalışma Alanı
(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
Git iş akışı: dosya değişikliklerinin GitHub'a ulaşma süreci

🏫 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.

1️⃣
Davet Linkine Tıklayın
Hoca size bir ödev linki paylaşır. Tıklayınca sizin adınıza otomatik bir repo oluşturulur.
2️⃣
Repo'yu Klonlayın
git clone <repo-url> ile bilgisayarınıza indirin. Colab'da da açabilirsiniz.
3️⃣
Çalışıp Gönderin
Ödevi yapın, git add, git commit, git push ile gönderin. Son push tarihi teslim tarihidir!

📚 Git ve GitHub Kaynakları

KaynakTürLink
Git Resmi Kitap (Pro Git)📖 Kitap (Ücretsiz)git-scm.com/book/tr
GitHub Skills🎓 İnteraktif kursskills.github.com
Learn Git Branching🎮 Oyunlaştırılmış öğrenmelearngitbranching.js.org
GitHub Student Pack🎁 Ücretsiz araçlareducation.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.

🖥️ Sunucu (Server)
  • 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
💻 İstemci (Client)
  • 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
💡 Günlük Hayattan Örnek
Instagram'da bir fotoğrafa baktığınızda: telefonunuz (istemci/client) → Instagram'ın sunucularına (server) istek gönderir → sunucu fotoğrafı bulup size geri gönderir. Bu istemci-sunucu mimarisi (client-server architecture) denir.

Sunucu Türleri

Sunucu Türü (TR)İngilizceGöreviÖrnek
Web SunucusuWeb ServerWeb sitelerini barındırırApache, Nginx
Veritabanı SunucusuDatabase ServerVerileri saklar ve sorgularMySQL, PostgreSQL, MongoDB
Dosya SunucusuFile ServerDosyaları merkezi olarak depolarNAS, HDFS
Uygulama SunucusuApplication ServerUygulamaları çalıştırırTomcat, Flask
DNS SunucusuDNS ServerAlan adlarını IP'ye çevirirgoogle.com → 142.250.x.x

Temel Ağ Terimleri

Kavram (TR)İngilizceAçıklama
IP AdresiIP AddressHer bilgisayarın ağdaki benzersiz numarası (ör: 192.168.1.1)
PortPortBir bilgisayardaki hizmetin kapı numarası (ör: 80 = web, 3306 = MySQL)
ProtokolProtocolİletişim kuralları (HTTP, FTP, SSH)
APIApplication Programming InterfaceProgramların birbirleriyle konuşma yöntemi
BulutCloudBaşka şirketlerin (AWS, Google, Azure) sunucularını kiralamak
DüğümNodeBir ağ/kümedeki tek bir bilgisayar
KümeClusterBirlikte çalışan bilgisayar grubu
💜 Dağıtık Sistem = Küme (Cluster)
Bir dağıtık sistem, aslında birden fazla sunucunun bir küme (cluster) oluşturmasıdır. Hadoop, Spark gibi araçlar bu kümelerde çalışır. Her sunucu bir düğüm (node) olarak adlandırılır.

🌐 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.

graph LR A["🖥️ Tek Bilgisayar
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
Şekil 1: Tek bilgisayar vs dağıtık sistem — aynı işi parçalara bölerek çok daha hızlı bitirmek

Günlük Hayattan Dağıtık Sistem Örnekleri

🔍
Google Arama
Milyarlarca web sayfasını saniyeler içinde aramanız, binlerce sunucunun paralel çalışması sayesinde mümkündür.
📺
Netflix / YouTube
Dünya genelinde milyonlarca kişi aynı anda video izleyebilir çünkü içerikler birçok sunucuya dağıtılmıştır.
💬
WhatsApp
2 milyardan fazla kullanıcının mesajları dağıtık sunucularda işlenir ve iletilir.
🛒
E-Ticaret Siteleri
Black Friday gibi yoğun günlerde milyonlarca eşzamanlı kullanıcıyı karşılayabilirler.

Neden Dağıtık Sistemlere İhtiyaç Duyarız?

ProblemTek BilgisayarDağıtık Sistem
KapasiteRAM/disk sınırlı (ör. 16 GB RAM)Düğüm ekleyerek sınırsız ölçeklenme
HızTek işlemci ile sıralı işlemParalel işlem, çok daha hızlı
GüvenilirlikBilgisayar bozulursa her şey dururBir düğüm düşse, diğerleri devam eder
MaliyetSü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

graph TB H["🐘 Apache Hadoop"] --> HDFS["📁 HDFS
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"]
Şekil 2: Hadoop'un üç temel bileşeni
💡 Not
Bu derste Hadoop'u kurmayacağız — kurulumu karmaşık ve ağırdır. Bunun yerine, Hadoop'un MapReduce mantığını Python ile simüle ederek anlayacağız. Gerçek büyük veri ihtiyaçları için ileride Apache Spark kullanacağız (Hadoop'un modern ve daha hızlı alternatifi).

🗺️ MapReduce Kavramı

MapReduce, büyük verileri işlemek için kullanılan iki aşamalı bir yaklaşımdır:

🗺️ MAP Aşaması

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)]
📊 REDUCE Aşaması

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}
graph LR A["📄 Girdi Verisi
'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"]
Şekil 3: MapReduce işlem akışı — Word Count örneği

🔧 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.

⚠️ Önemli
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}")
🎉 Tebrikler!
Az önce MapReduce mantığını Python ile simüle ettiniz! Gerçek bir Hadoop kümesinde aynı mantık, yüzlerce bilgisayar üzerinde petabaytlarca veriyle çalışır. İleriki haftalarda bunu PySpark ile çok daha kolay ve verimli bir şekilde yapacağız.

📦 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üphaneNe İşe Yarar?Bu Derste?
pandasTablo verilerini işleme ve analiz✅ Çok kullanacağız
numpySayısal hesaplama, matris işlemleri✅ Pandas'ın altyapısı
matplotlibGrafik ve görselleştirme✅ Veri görselleştirme
seabornİstatistiksel görselleştirme✅ Estetik grafikler
pysparkDağıtık veri işleme (Spark)✅ Büyük veri işleme
scikit-learnMakine öğrenmesi✅ Temel ML
requestsHTTP istekleri, API'lerden veri çekme✅ ETL süreçleri
pymongoMongoDB 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
💜 Google Colab'da
Google Colab'da çoğu kütüphane zaten kurulu gelir. Kurulu olmayan bir kütüphaneyi kurmak için hücreye !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.

📓
Jupyter Notebook
Bilgisayarınıza kurulur. pip install notebook ile kurup, jupyter notebook ile başlatırsınız. Offline çalışır.
☁️
Google Colab
Google'ın ücretsiz bulut hizmeti. Kurulum gerektirmez, tarayıcıda çalışır. GPU bile ücretsiz! colab.research.google.com
✅ Önerimiz
Bu ders için Google Colab kullanmanızı öneriyoruz. Hiçbir kurulum gerektirmez, Google hesabınızla giriş yapıp hemen kodlamaya başlayabilirsiniz. Dosyalarınız Google Drive'da otomatik kaydedilir.

🚀 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

ÖzellikHadoop MapReduceApache Spark
HızDiske yazar (yavaş)Bellekte işler (100x hızlı)
KullanımJava ağırlıklı, karmaşıkPython/Scala/Java, kolay API
Gerçek zamanlıZayıfSpark Streaming ile güçlü
ML desteğiMahout (eski)MLlib (modern)
GüncellikAzalıyorEndüstri standardı
💡 Dersin Gidişatı
Bu derste Hadoop'u kavramsal olarak öğrendik. Bundan sonraki haftalarda Apache Spark'ı Python (PySpark) ile kullanacağız. Spark, Hadoop'un yaptığı her şeyi yapabilir — hem de çok daha hızlı ve kolay!

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:

graph TB subgraph Toplama ["📥 Veri Toplama"] K["Kafka"] API["API'ler"] WS["Web Scraping"] end subgraph Depolama ["💾 Depolama"] HDFS["HDFS"] SQL["SQL DB"] NoSQL["MongoDB"] end subgraph Isleme ["⚙️ İşleme"] Spark["Apache Spark"] Pandas["Pandas"] end subgraph Analiz ["📊 Analiz & Görselleştirme"] ML["Makine Öğrenmesi"] Viz["Matplotlib / Seaborn"] end Toplama --> Depolama --> Isleme --> Analiz
Şekil 4: Büyük veri pipeline'ı — verinin yolculuğu

📋 Bölüm Özeti

Neler Öğrendik?
  • ✅ 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
📝 Ev Ödevi
  1. GitHub hesabı açın (profesyonel kullanıcı adı seçin!)
  2. Google Colab'da bir hesap açın ve ilk notebook'unuzu oluşturun
  3. Bu derste gördüğümüz kod örneklerini Colab'da çalıştırın
  4. Kendi Word Count uygulamanızı yazın: Sevdiğiniz bir şarkının sözlerini bulun, en çok geçen 10 kelimeyi listeleyin
  5. (Bonus) collections.Counter kütüphanesini araştırıp Word Count'u onunla da yazın
  6. (Bonus) Learn Git Branching sitesinde ilk 5 seviyeyi tamamlayın
Python motoru yükleniyor...