Thursday, October 31, 2013

Meteor


Ustte Meteor adi verilen yeni bir UI altyapisi anlatiliyor, pur Javascript temelli (Ruby, vs gibi ek diller yok), kullanilan yaklasim hakikaten temiz duruyor. Suradaki bir yazi Meteor'un niye Ruby on Rails gibi bir yaklasimdan daha iyi olabilecegini anlatmis.

Friday, October 25, 2013

LAN Icindeki Diger Makinalari Bulmak

Diyelim ki monitoru olmayan (ya da islemeyen) bir makinayi bir cafe'ye getirdiniz, Wifi baglantisini yapti (hatirladi cunku), simdi ikinci bir makinadan bu alete baglanmak lazim (ssh ile). Ama ilk makina hangi IP adresinde acaba?

Cafe gibi yerlerde Wifi hizmeti var ise, Wifi dagitim noktasi arka planda DHCP kullanir, ve 192.168.2.x gibi adresler her yeni kullaniciya dagilitir, bir kisiye 192.168.2.100 verilebilir, digerine 192.168.2.5 vs. Diger makinalari (kendi makinamizi en azindan) "bulmak" icin teker teker ping ile bakabilirdik, ama uzun surer. Script edelim,

import os
for i in range(255):
    cmd = "ping -c 1 192.168.2.%d > /tmp/out" % i   
    os.system(cmd)
    if " 0% packet loss" in open("/tmp/out").read():
        print i, "Found"


Secenek -c 1 kullanildi, sadece bir kere ping edilmesi icin (yoksa 3 kere denenir). Sonucta tek ilgilendigimiz "0% packet loss" gormek, o adreste bir makina varsa bu sonucu verir cunku, diger durumlarda "100% packet loss" ibaresi cevapta oluyor.

ØMQ

Makinalar, sureclerarasi mesaj gonderimi icin ØMQ (ya da ZeroMQ) programi tavsiye edilir. Kullanimi soket kullanimina benzeyecek sekilde yapilmis fakat arka planda mesajlarin hizli gonderilebilmesi ve iletilmesinden emin olunmasi, tampon bellekte mesajlari biriktirmek (gerekiyorsa) gibi bir suru ek kodlama yapilmis. Noktadan noktaya TCP protokolu ile, ayrica UDP ya da multicast ile yayin bazli da calisabiliyor.

Kurmak icin

sudo apt-get install libzmq-dev uuid-dev python-zmq

Not: Eger ustteki yeterli olmazsa (mesela bir assertion error gelirse), kaynaklardan derlemek gerekebilir, libzmq Github'dan kaynak indirilir, ./autogen.sh, ./configure, make ve sudo make install gerekebilir. 

TCP kullanan noktadan-noktaya transfer ornegi

# alici
import sys, time, zmq

context = zmq.Context()
receiver = context.socket(zmq.PULL)
receiver.bind("tcp://*:10000")

arr = []
while True:
    data = receiver.recv()
    if data == "start":
        print time.time()
        continue
    arr.append(data)
    if data == "end":
        print time.time()
        print len(arr)
        continue


# gonderen
import zmq, time

context = zmq.Context()
sender = context.socket(zmq.PUSH)
sender.connect("tcp://localhost:10000")
sender.send("start")
for i in range(100000):
    sender.send("01234567890123456789")
sender.send("end")


Eger gonderici baska bir makinada ise localhost yerine o makina ismi (ya da IP adresi) kullanilir.

Uyelik / gonderim (publish, subscribe) kullanimi ve protokol bazinda yayin kulllanan ornek (ki yayin bazli protokol kullaninca uyelik kullanmak mecburi)

# alici
import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)

socket.connect('epgm://wlan0;239.192.1.1:5000')
socket.setsockopt(zmq.SUBSCRIBE, "10001")

while True:
    data = socket.recv()
    print data


# gonderici
import zmq, time

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect('epgm://wlan0;239.192.1.1:5000')
while True:
    socket.send("10001 kjashfkjasdf")
    time.sleep(1)


Ornek pgm icin ayni, egpm yerine gpm kullanilir. Yanliz o pgm icin her iki tarafta da sudo kullanmak gerekti. Bu biraz garip bir durum.

Ayrica egpm (ve pgm) nedir? Bunlar ek protokoller, pgm UDP'nin guvenilirligini arttirmak icin yazildi. ZeroMQ openpgm uzerinden bunlari kullanabiliyor. ZeroMQ sayfalarina gore pgm direk multicast, egpm arka planda UDP kullanir.

UDP yayin bazli bir protokoldur, network'un tek bir adresine (mesela 0.0.0.0) mesajlari basarsiniz, bu mesajlari herkes gorur. Bunun fi tarihinde bazi faydalari vardi, cunku 'zaten Ethernet (bir alttaki protokol olmasi baglaminda) zaten mesajlari donanim olarak herkese goturuyor, bunun ustune yayin bazli kullanim niye daha uygun olmasin". Irdeleme boyleydi. Bunu yeni network donanimlarinda test etmek gerekir, zaten pur UDP guvenilir bir protokol degildir (oldugu gibi kullanilmasini tavsiye etmiyoruz). ZeroMQ her iki protokolu de pgm uzerinden disari servis ediyor.

Ornekte ilginc bir kullanim goruyoruz, 239.192.1.1 adresi var mesela. Internet adresleme kurallarina gore 224.0.0.0 ve 239.255.255.255 arasi multicast icin ayrilmistir, bu araliga baglananlar disari, yani daha genis baglamda Internet'e aktarilmazlar (routing). Multicast UDP'den daha populer bugunlerde, UDP'nin pabucu dama atildi bir baglamda. Multicast'te "yayin gruplari" yaratiliyor (ustteki aralikta bir adres) ve o adrese yazilan her mesaj, o adresi okuyan herkes tarafindan alinabiliyor. Sistem bakimi (maintenance) acisindan iyi bir sey, network'e istediginiz kadar makina ekleyin, bu makinalarin sadece tek bir adresi bilmeleri yeterli.

Isleri biraz daha karistiralim, multicast mesaj gonderimi icin UDP perde arkasinda UDP kullanabiliyor (fakat bu illa sart degil). Ayrica bazi pur UDP orneklerinde yayin grubu kullanildigini gorduk.

Ustteki ornekte ayrica filtreleme kullanimi var, sadece 10001 ile baslayan mesajlari almak istedigimizi belirtmisiz.

wlan0 nedir? Network donaniminin ismidir. Bu ismi ifconfig -a ile bulmak mumkun.

Test ederken netstat -g ile o anda network'unuzdeki tum yayin gruplarini gorebilirsiniz.

Not: bazi durumlarda ./configure cagrisini --with-pgm ile yapmak gerekebilir.

Tuesday, October 22, 2013

Buyuk Veri, Akim Analizi

Buyuk Veri dunyasinda durum nedir? Tabii buyuk veri deyince Hadoop'tan bahsetmemek olmaz, once buraya nasil geldigimize bakalim.

Hadoop'un en onde gelen kullanim alanlarindan biri log dosyasi islemek[ti]. Ozellikle populer olan Web siteleri asiri seviyelerde log dosyasi uretiyordu (her kullanici tiklamasi), ama Hadoop oncesinde bu veriyi basit / olcekli  bir sekilde isleyebilecek bir ortam yoktu. Log analizi yapmak isteyenler koca koca Sun, Oracle makinalari alip bunlara veri yuklemeye ugrasiyorlardi, ozel kodlar, ozel paketlerle bu veriler incelenmeye ugrasiliyordu. 2002'de boyle bir projede bizzat calistik, SQL ile "buyuk veri" analizi yapmak hakikaten zor bir isti, bu tur veri ambari raporlamasinda uzman olan bir danismana saatte yuzlerce dolarlar verildigini hatirliyorum.

Google'in Hadoop'un temelini olusturan esle/indirge (map/reduce) mimarisini aciklamasindan, ve Hadoop'un ortaya cikmasindan sonra isler degisti. Insanlar log dosyalarini direk, oldugu gibi dosya halinde alip Hadoop kumesine atabilmeye basladilar (HDFS buyuk dosyalari parca parca makinalara boler, ama disari tek bir dosyaymis gibi gosterir). Analiz gerektiginde paralel sekilde isleyecek esle / indirge sureclerini kodladilar, her yerde bulanabilecek PC makinalarini birlestirip 100, 200 hatta 700 makinalik kumelerde devasa verilerini nisbeten ucuz sekilde islemeye basladilar. Sirketler cogunlukla kendi Hadoop kumelerini de kendileri kurdular.

Bugun Hadoop servisini bulut servisi (cloud service) olarak sunmaya ugrasan pek cok sirket var tabii, ama halen sirketler kendi kumelerini kuruyorlar.

Mimariye gelelim: Esle/indirge mimarisi veri satirlarina teker teker bakan / isleyen, ve veriyi bir akim (stream) gibi goren mimaridir. Bugunlerde veri akimi islemi (stream processing) surekli anlik (realtime) baglamda telafuz ediliyor, fakat aslinda Hadoop ta akim analizi yapiyor, sadece bunu cevrimdisi (offline) olarak yapiyor. Yani onlarca, binlerce veri satirinin hafizada olacagi farzedilmiyor, one gelen o tek satir, o tek veri noktasi uzerinde islem yapiliyor (ve ona tekabul eden, bir veya daha fazla "sonuc satiri" uretiliyor, bu da bir cikis akimi olusturur, baska bir islemciye gonderilebilir, vs). Dolayli olarak bu kulturde hafizada az konum verisi tutmak ana amactir, ya da ne kadar az konum verisi olursa o kadar iyi olacagi dusunulmektedir [1]. Fena bir yaklasim degildir.

Simdi pek cok veri analizinin, hatta yapay ogrenim (machine learning) algoritmasinin bu sekilde kodlanabilecegi birdenbire "kesfedilmistir". Hatta bu tur algoritmalara bugunlerde "utandiracak boyutlarda paralelize edilebilen" adi veriliyor, mesela KMeans kumeleme metotu bunlardan biri. Yani paralelize edilmesi o kadar, o kadar kolay ki, simdiye kadar niye yapmadik turunden bir serzeniste var bu soylemin icinde. Tabii altyapi (framework) mevcudiyeti cok onemliydi.. Hadoop'un bazi isleri kolaylastirmasi, bir suru algoritmanin bu altyapiya gecirilebilecegini farketmesi yonunde insanlari tesvik etti. 

Ve bugune geliyoruz: veri analizini akim islemesi (stream processing) olarak gormeye alisilinca, "niye bu isi habire diske yazipi diskten okuyan sekilde yapalim ki?" dusuncesi basladi, cunku Hadoop isini gormek icin cok fazla gecici dosya uretiyor, bu da performansi dusuruyordu... Iste son zamanlarda etrafa sacilan anlik akim veri analizi (realtime stream processing) urunleri, paketleri bu ihtiyaci tatmin etmeye ugrasiyor. Storm, S4, Samza bu tur urunler.

---

[1] Zaten devasa boyutlarda veriyi baska sekilde (ucuz olarak) islemek mumkun degildir. Terabayt olceginde bir verinin tamamini hafizaya alip, direk veri erisimi yapabilecegimizi farzedemeyiz. Bu tur makinalar insa edilebilir muhakkak, fakat sabit disk RAM'den ucuz oldugu icin buyuk diskli az hafizali makinalar daha ekonomik.

Buyuk Matrisler Uzerinde SVD Ayristirmasi (SVD Factorization for Tall-and-Fat Matrices on Map/Reduce Architectures)