Ders 14 / 18
Büyük Veri Kavramı
Hacim, hız ve çeşitliliğin nitel iddia yerine sayılabilir birimlere indirgenmesi: kurgu ölçüm ağının 3.199 satırı bellekte 889.337 bayt tutar, satır başına 278,0 bayttır ve tek makineye sığmama eşiği çalışma alanı ile ara sonuç payı kararlarına göre 7.724.631 ile 247.188.193 satır arasında değişir. Aynı 1.260 sayaç dönemsel okumada 1.260, on beş dakikalık okumada 3.628.800 satır/dönem üretir; eşiğe kalan dönem 18.390'dan 7'ye, dönem başına yüzde 4 büyüyen ağda 169'dan 6'ya iner. Beş kaynak şemasının 18 alanının 9'u birleştirilemez ve iki eşleme tablosu bu sayıyı 6'ya indirir; anahtar yokluğu kapanır, birim ve zaman biçimi çelişkisi kapanmaz.
İçindekiler
Rapor doğru kuruldu. Ölçütler bir bakışta geri okunabilecek biçimde dizildi, oynatılabilirlikleri sınandı, anlatı bulgudan öneriye giden adımları eksiksiz taşıdı ve raporun ikinci kez üretilmesi için sabitlenmesi gereken kalemler sayıldı. Bütün bu işin altında yazılmamış tek bir varsayım duruyor: küme tek bir makineye sığıyor. Kaynak açılıyor, satırlar belleğe alınıyor, hesap yapılıyor ve sonuç yazılıyor.
Bu konu o varsayımı kaldırır. İlk soru en kaba olanıdır: bir küme ne zaman “tek makineye sığmaz” sayılır. Cevap bir sıfat değil bir sayıdır ve o sayıyı üreten kararlar yazılmadıkça sayı da yoktur. Ders hacim, hız ve çeşitliliği üç ayrı nitel iddia olarak değil, altı sayılabilir birim olarak kurar: bayt ve satır, satır/dönem ve gecikme, ayrı şema sayısı ve birleştirilemeyen alan sayısı.
- OA1. Küme K03–K05’ten devralınır ve kurgudur: 3.199 satır, 1.329 abone, üç dönem, beş bölge, tarife basamakları 10/25/40 m³. Aynı tohumla üretilir ve çıktı koşumdan koşuma aynıdır. Modeldir.
- OA2. Satır başına bayt tek bir gösterimle ölçülür. Alan tiplerinin ayırdığı baytı hangi kararın belirlediği M26/K04’ün başarım konusunda ölçüldü; burada o karar girdidir ve tek bir sayı olarak alınır.
- OA3. Tek makinenin çalışma alanı bir varsayımdır ve tabloda üç değerle sınanır. Ara sonuç payı ikinci karardır: kümenin yanında kümenin kendisi kadar geçici yer istenip istenmediği.
- OA4. Hız iki sayıdır: satır/dönem ve gecikme. Gecikme, dönemsel yenilenen bir raporda bir okumanın en çok kaç okuma aralığı beklediğidir.
- OA5. Çeşitlilik iki sayıdır: ayrı şema sayısı ve birleştirilemeyen alan sayısı. Bir alan ortak anahtarı olmayan bir şemadaysa, eşlemesiz serbest metinse, birimi çevrilmesi gereken bir nicelikse ya da zaman biçimi kümenin dönem eksenine oturmuyorsa birleşmez.
- OA6. Hiçbir dağıtık işleme motoru, dosya biçimi ya da satıcı adı yazılmaz; araçlar türleriyle anılır.
Hacim: Bayt ve Satır
# kume.py — bolgesel olcum aginin KURGU kumesi. MODELDIR: gercek bir kume # yerine ayni yapiyi ureten bir uretec yazildi; tohum gorunur ve cikti # kosumdan kosuma aynidir. 3199 satir, 1329 abone, uc donem, bes bolge. import math, sys TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF BOLGE = [("kuzey", 0.28, 21), ("guney", 0.22, 17), ("dogu", 0.18, 26), ("bati", 0.14, 14), ("merkez", 0.18, 23)] ALAN = ("abone_no", "bolge", "donem", "hane", "memnuniyet", "tuketim_m3") def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 KUME = [] for i in range(HAM): r = uretec(TOHUM + i) b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])] hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05]) memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17]) if r() < 0.046: # kayda girememis sayac continue no, q = 10001 + i, uretec(TOHUM + 7000 + 10001 + i) for d in range(ayrik(q(), [0.05, 0.12, 0.21, 0.62])): v = 0.0 if q() < 0.038 else math.floor( b[2] * math.exp((q() + q() + q() - 1.5) * 0.62) * (1 - d * 0.05) * 100 + 0.5) / 100 KUME.append((no, b[0], d + 1, hane, memnun, v)) q() SAYAC = len({s[0] for s in KUME}) bayt = sys.getsizeof(KUME) + sum( sys.getsizeof(s) + sum(sys.getsizeof(a) for a in s) for s in KUME) SATIR_BAYT = bayt / len(KUME) print(f"tohum {TOHUM}; {len(KUME)} satir, {len(ALAN)} alan, {SAYAC} okuyan sayac") print(f"bellekte {bayt} bayt, satir basina {SATIR_BAYT:.1f} bayt") GIB = 1024 ** 3 print(f"{'calisma alani':<16}{'ara sonuc payi':>16}{'kumeye kalan':>14}" f"{'esik satir':>14}{'kat':>8}") for gib in (4, 12, 64): for pay, ad in ((1, "yok"), (2, "kume kadar")): kalan = gib * GIB / pay esik = int(kalan / SATIR_BAYT) print(f"{str(gib) + ' GiB':<16}{ad:>16}{gib // pay:>11} GiB" f"{esik:>14}{esik // len(KUME):>8}")
tohum 20260218; 3199 satir, 6 alan, 1260 okuyan sayac bellekte 889337 bayt, satir basina 278.0 bayt calisma alani ara sonuc payi kumeye kalan esik satir kat 4 GiB yok 4 GiB 15449262 4829 4 GiB kume kadar 2 GiB 7724631 2414 12 GiB yok 12 GiB 46347786 14488 12 GiB kume kadar 6 GiB 23173893 7244 64 GiB yok 64 GiB 247188193 77270 64 GiB kume kadar 32 GiB 123594096 38635
Hacim tek bir sayı değil, iki sayının bölümüdür. Pay tarafında çalışma alanı, payda tarafında satır başına bayt durur ve bölüm bir satır sayısı verir. Kurgu küme 889.337 bayt tutuyor, satır başına 278,0 bayt. Bu sayının kendisi bir tip kararının sonucudur ve o karar başka bir yerde ölçüldü; burada değişmeyen şey, eşiğin bir sayı olarak yazılabilmesidir.
Tablonun altı satırı iki savunulabilir kararın çarpımıdır. Çalışma alanı üç değer alıyor, ara sonuç payı iki. En dar karar 7.724.631 satırda eşiğe varıyor, en geniş karar 247.188.193 satırda. Aradaki oran otuz iki kat ve iki uç da savunulabilir: ara sonuç payı istemeyen bir hesap yalnız akan toplamlar tutar, kümenin kendisi kadar geçici yer isteyen bir hesap sıralama ya da birleştirme yapar. “Bu küme tek makineye sığmaz” cümlesi, altı satırdan hangisinin seçildiği yazılmadan kurulamaz.
Kurgu kümenin kendisi hiçbir satırda eşiğe yaklaşmıyor: en dar kararda bile eşiğin 2.414’te biri kadar. Ölçekli analizin konusu bu küme değil, bu kümenin hangi hızla o eşiğe yürüdüğüdür.
Sonraki iki bölüm eşik olarak orta satırı, 12 GiB çalışma alanı ile küme kadar ara sonuç payını alır ve 23.173.893 satırı sabitler. Bu bir seçimdir ve seçildiği için yazılıyor; eşik değiştiğinde sonraki bütün sayılar aynı oranda kayar ve kayma yönü tablodan okunur.
Hız: Satır ve Dönem
# hiz.py — hiz iki sayidir: satir/donem ve gecikme. Okuma sikligi bir # karardir; sayacin kendisi degismeden ureten satir sayisi degisir. ESIK = int((12 * GIB / 2) / SATIR_BAYT) # 12 GiB calisma alani, kume kadar ara sonuc payi BUYUME = 1.04 # donem basina sayac artisi def donem_sayisi(hiz, buyume): toplam, n, h = len(KUME), 0, hiz while toplam < ESIK and n < 10 ** 6: toplam, n, h = toplam + h, n + 1, h * buyume return n print(f"esik {ESIK} satir; ag {SAYAC} sayac, donem basina buyume " f"yuzde {round((BUYUME - 1) * 100)}") print(f"{'okuma sikligi':<20}{'okuma/donem':>12}{'satir/donem':>13}" f"{'sabit ag':>10}{'buyuyen ag':>12}{'gecikme':>9}") for ad, sik in (("donemsel", 1), ("gunluk", 30), ("saatlik", 720), ("on bes dakikalik", 2880)): hiz = SAYAC * sik print(f"{ad:<20}{sik:>12}{hiz:>13}{donem_sayisi(hiz, 1.0):>10}" f"{donem_sayisi(hiz, BUYUME):>12}{sik:>9}")
esik 23173893 satir; ag 1260 sayac, donem basina buyume yuzde 4 okuma sikligi okuma/donem satir/donem sabit ag buyuyen ag gecikme donemsel 1 1260 18390 169 1 gunluk 30 37800 613 83 30 saatlik 720 907200 26 18 720 on bes dakikalik 2880 3628800 7 6 2880
Hız, ağın büyümesi değildir. Tablodaki dört satırda aynı 1.260 sayaç var; değişen tek şey her sayacın kaç kez okunduğu. Dönemsel okumada ağ 1.260 satır/dönem üretiyor ve eşiğe 18.390 dönem uzakta; on beş dakikalık okumada aynı ağ 3.628.800 satır/dönem üretiyor ve eşik 7 dönem sonra. Okuma sıklığı bir donanım gerçeği gibi görünür, oysa bir karardır ve bu kararın eşiğe kalan dönem üzerindeki etkisi 2.628 kattır.
Beşinci sütun ikinci kararı ekliyor. Ağ dönem başına yüzde 4 büyüdüğünde dönemsel okumadaki 18.390 dönem 169 döneme iniyor. Yüzde 4’lük bir büyüme dönem dönem bakıldığında görünmez; birikimli bakıldığında eşiği yüz kat yakınlaştırıyor. Hızın iki kaynağı vardır ve ikisi çarpılır: sıklık ile büyüme.
Son sütun hızın ikinci birimidir. Rapor dönem başına bir kez yenileniyorsa, bir okumanın rapora girmesi en çok bir dönem sürer; ama bu bekleme okuma aralığı cinsinden yazıldığında sayı değişir. Dönemsel okumada bekleme 1 okuma aralığı, on beş dakikalık okumada 2.880 okuma aralığıdır ve o sırada rapor dışında bekleyen satır 1.260’tan 3.628.800’e çıkar. Sıklığı artırmak veriyi tazelemez; tazelenmemiş veri miktarını büyütür.
Çeşitlilik: Şema ve Alan
# cesitlilik.py — cesitlilik iki sayidir: ayri sema sayisi ve birlestirilemeyen # alan sayisi. MODELDIR: bes kaynagin semasi alan adi, birim ve zaman bicimi # olarak yazildi; kaynaklarin kendisi uretilmedi. ORTAK = "abone_no" SEMA = { "abone kaydi": [("abone_no", "-", "-"), ("bolge", "ad", "-"), ("hane", "kisi", "-"), ("memnuniyet", "1-5", "-")], "sayac okumasi": [("abone_no", "-", "-"), ("donem", "-", "donem no"), ("tuketim_m3", "m3", "-")], "saha ziyareti": [("sayac_seri", "-", "-"), ("okunan", "litre", "-"), ("bolge_kodu", "sayi", "-"), ("ziyaret_gunu", "-", "gun")], "destek talebi": [("talep_no", "-", "-"), ("abone_no", "-", "-"), ("acilis", "-", "zaman damgasi"), ("konu", "metin", "-")], "tarife tablosu": [("basamak_metni", "metin", "-"), ("birim_ucret", "para", "-"), ("gecerlilik", "-", "tarih araligi")], } def durum(sema, birim, zaman): if ORTAK not in [a for a, _, _ in SEMA[sema]]: return "anahtar yok" if birim == "litre": return "birim cevrilir" if birim == "metin": return "eslemesiz metin" if zaman not in ("-", "donem no"): return "zaman bicimi" return "birlesir" def say(baslik): sebep, kopuk = {}, 0 print(f"{baslik:<16}{'alan':>6}{'ortak anahtar':>15}{'birlesmeyen':>13}" f"{'sebep':>18}") for ad, alanlar in SEMA.items(): d = [durum(ad, b, z) for _, b, z in alanlar] n = sum(1 for x in d if x != "birlesir") for x in d: if x != "birlesir": sebep[x] = sebep.get(x, 0) + 1 kopuk += n print(f"{ad:<16}{len(alanlar):>6}" f"{('var' if ORTAK in [a for a, _, _ in alanlar] else 'yok'):>15}" f"{n:>13}{(sorted(set(x for x in d if x != 'birlesir')) or ['-'])[0]:>18}") print(f"ayri sema {len(SEMA)}, toplam alan " f"{sum(len(v) for v in SEMA.values())}, birlestirilemeyen alan {kopuk}") print("sebep dagilimi:", ", ".join(f"{k} {v}" for k, v in sorted(sebep.items()))) return kopuk k1 = say("sema (once)") SEMA["saha ziyareti"].append(("abone_no", "-", "-")) # sayac_seri esleme tablosu SEMA["tarife tablosu"].append(("abone_no", "-", "-")) # basamak esleme tablosu print() k2 = say("sema (sonra)") print(f"iki esleme tablosu birlestirilemeyen alani {k1}'dan {k2}'ya indirir; " f"anahtar yoklugu kapanir, birim ve zaman bicimi kapanmaz")
sema (once) alan ortak anahtar birlesmeyen sebep abone kaydi 4 var 0 - sayac okumasi 3 var 0 - saha ziyareti 4 yok 4 anahtar yok destek talebi 4 var 2 eslemesiz metin tarife tablosu 3 yok 3 anahtar yok ayri sema 5, toplam alan 18, birlestirilemeyen alan 9 sebep dagilimi: anahtar yok 7, eslemesiz metin 1, zaman bicimi 1 sema (sonra) alan ortak anahtar birlesmeyen sebep abone kaydi 4 var 0 - sayac okumasi 3 var 0 - saha ziyareti 5 var 2 birim cevrilir destek talebi 4 var 2 eslemesiz metin tarife tablosu 4 var 2 eslemesiz metin ayri sema 5, toplam alan 20, birlestirilemeyen alan 6 sebep dagilimi: birim cevrilir 1, eslemesiz metin 2, zaman bicimi 3 iki esleme tablosu birlestirilemeyen alani 9'dan 6'ya indirir; anahtar yoklugu kapanir, birim ve zaman bicimi kapanmaz
Ayrı şema sayısı çeşitliliği ölçmez. Beş kaynak beş şema taşıyor ve bu sayı iki koşumda da beş kalıyor; oynayan sayı birleştirilemeyen alan sayısıdır: 18 alanın 9’u kümeye bağlanamıyor. Sebep dağılımı bu dokuzu üçe ayırıyor — 7 alan ortak anahtarı olmayan iki şemadan geliyor, 1 alan eşlemesiz serbest metin, 1 alan kümenin dönem eksenine oturmayan bir zaman biçimi taşıyor.
İkinci koşum bir karar uyguluyor: sayaç seri numarasını abone numarasına çeviren bir eşleme tablosu ile tarife basamağı metnini kümenin basamak adlarına çeviren ikinci bir eşleme tablosu kuruluyor. Birleştirilemeyen alan 9’dan 6’ya iniyor, ama sebep dağılımı yer değiştiriyor: anahtar yokluğu tümüyle kapanıyor, buna karşılık zaman biçimi çelişkisi 1’den 3’e çıkıyor, çünkü artık bağlanabilen iki şemanın kendi zaman alanları da sayıya giriyor. Eşleme bir alanı bağlar, birimini ve zaman eksenini hizalamaz.
Sayının yönü de dikkate değer. İkinci koşumda toplam alan 18’den 20’ye çıkıyor, çünkü eşleme iki şemaya birer alan ekliyor; birleştirilemeyen alan oranı yüzde 50’den yüzde 30’a iniyor ama mutlak sayı yalnız üç azalıyor. Çeşitliliği kapatmanın bedeli, kapanan her alan için bakımı süren bir eşleme tablosudur ve bu tablolar kümenin kendisinde görünmez.
Üç birim yan yana konduğunda kümenin ölçek tablosu çıkıyor. Hacim eşiği 23.173.893 satır, hız on beş dakikalık okumada 3.628.800 satır/dönem, çeşitlilik 5 şema ve 6 birleştirilemeyen alan. Bu üç sayının hiçbiri “büyük” ya da “küçük” değildir; her biri bir karar çiftinin bölümüdür ve kararlar tablonun içinde yazılıdır.
Özet
- Hacim iki sayının bölümüdür: kurgu küme satır başına 278,0 bayt tutar ve tek makineye sığmama eşiği çalışma alanı ile ara sonuç payı kararlarına göre 7.724.631 ile 247.188.193 satır arasında otuz iki kat oynar.
- Hız ağın büyümesi değil okuma sıklığıdır: aynı 1.260 sayaç dönemsel okumada 1.260, on beş dakikalık okumada 3.628.800 satır/dönem üretir ve eşiğe kalan dönem 18.390’dan 7’ye iner.
- Dönem başına yüzde 4’lük bir ağ büyümesi dönemsel okumada eşiği 18.390 dönemden 169 döneme yaklaştırır; sıklık ile büyüme çarpılır.
- Gecikme hızın ikinci birimidir: dönemsel yenilenen bir raporda bekleme dönemsel okumada 1, on beş dakikalık okumada 2.880 okuma aralığıdır ve bekleyen satır 3.628.800’e çıkar.
- Çeşitliliği ayrı şema sayısı ölçmez; beş şema iki koşumda da beştir, oynayan sayı 18 alanın birleştirilemeyen 9’udur ve iki eşleme tablosu bu sayıyı 6’ya indirir.
- Eşleme anahtar yokluğunu kapatır, birim ve zaman biçimi çelişkisini kapatmaz: zaman biçimi sebebiyle birleşmeyen alan 1’den 3’e çıkar.
Sonraki Adım
Bu ders kümenin tek makineye sığmadığı noktayı bir satır sayısı olarak yazdı, ama o noktadan sonra hesabın ne olacağını sormadı. Küme eşiği geçtiğinde iş bölünmek zorundadır ve bölmenin ilk sorusu şudur: bir toplulaştırma hangi parçalara ayrılabilir ve parçalar arasında kaç kayıt taşınır. Sonraki ders dağıtık hesaplamanın en yalın soyutlamasını, eşle ve indirge işlevlerini ders içinde yazar ve koşturur; ölçü karışım geçişinde taşınan kayıt sayısıdır — aynı toplulaştırma önce indirgeyip sonra karıştırdığında ve tersinde kaç kayıt taşınıyor, ve hangi hesap bu modele hiç girmiyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.