Büyük Verileri Okuma Yöntemleri — 2

Kerim Caner TÜMKAYA
Data Runner
Published in
5 min readJun 30, 2020

--

Photo by Kevin Ku on Unsplash

Merhabalar, ikinci yazım ile karşınızdayım. İlk yazımda Pandas ile büyük verileri okumakta karşılaşılabilen sorunlara ve bu sorunların çözümüne değinmiştim. O yazıma buradan ulaşabilirsiniz.

Bu yazımızda Dask kütüphanesini inceleyeceğiz. Pandas kütüphanesi en çok kullanılan kütüphane olmasının yanında, zaman zaman büyük verileri okuma konusunda sorun yaşatabilmesi ile de bilinen bir kütüphane. Böyle zamanlar da önceki yazımızda anlattığımız downcasting işlemi bir önlem olarak kullanılabilir. Bu durumun bir diğer alternatif çözümü ise Dask kütüphanesinden yararlanmak. Pandas tarafında anlattığım downcasting metotlarının Dask için de geçerli olduğunu da bir not olarak buraya düşelim.

Dask kütüphanesi veriyi dağıtık olarak saklayabilen, işleyebilen bir kütüphane. En çok öne çıktığı kısım bu. Bu da sizin lokalinizde bir anlamda dağıtık mimari ile çalışıyormuşsunuz gibi hareket edebilmenizi sağlıyor. Tabii bu durum biraz daha yavaşlamanıza neden olabiliyor. Pandas’ın en büyük avantajlarından birisi de bu Dask’a karşı. Pandas daha hızlı. Ancak Dask ile daha büyük verileri işleyebiliyorsunuz. Bir diğer avantajı ise; Dask içinde makine öğrenmesi algoritmaları barındırıyor. Yani çözümünüzü yayına alma hariç uçtan uca tek bir kütüphane ile uygulayabiliyorsunuz.

Dask Paketi Nasıl Yüklenir?

Öncelikle Dask’ı nasıl indirebiliriz? Bunun için birden fazla yöntem var. Çünkü aslında Dask bir çok parçadan oluşan bir kütüphane. Array, Bag vs. adında. İsterseniz doğrudan sizin ihtiyacınız olacak parçayı indirebiliyorsunuz. Bunun örneğine bakalım öncelikle;

Eğer ben tamamını indireyim ihtiyacım olursa elimin altında olsun derseniz de — benim de yaptığım gibi — aşağıdaki kodu kullanabilirsiniz. Bu kod ile tüm Dask paketlerini indirebilirsiniz.

Dask’ı bu şekilde kurmuş olduk. Peki nedir bu kütüphanenin alametifarikası?

Hadi Başlayalım!

Öncelikle Dask’ı yükleyelim.

Ve verimizi okuyalım.

Veri okuma konusunda Pandas ile arasında kod farkı yok. Ancak gördüğünüz gibi bir tık daha yavaş. Bunun nedeni de veriyi okuyup dağıtmasından kaynaklanıyor. Peki dağıtık dedik, ne demek istedik bir görelim.

Burada dikkatinizi çekmek istediğim yer “npartitions” parametresi. Dask bu dataframe’i 10 parça şeklinde saklıyor. Bu da sizin daha büyük verileri saklamanızı sağlıyor. Tabi veriyi okurken bu parametreyi değiştirebiliyorsunuz. Ben default değeri kullandım.

Burada “npartitions” değeri için yeri gelmiş iken birkaç ek bilgi vermek istiyorum. Bu değer de optimize edilmesi gereken bir değer. Xgboost, Light GBM gibi algoritmalarda da farklı adlar ile de olsa karşılaşırsınız. Peki neden optimize etmeliyiz, 30 çekirdeğim varsa 30 verip geçsem olmaz mı diyebilirsiniz. Sorunumuz şu; bu değeri eğer çok küçük verirseniz bloklar çok büyük kalabilir ve işleminiz normalden daha yavaş olabilir. İyi işte tam olarak bu yüzden çok çok verelim diyebilirsiniz. Burada da sizi sınırlayan iki nokta var. Birincisi çekirdek sayınızı kesinlikle geçmemelisiniz, yoksa çalışacak yeriniz kalmaz.

Bu konuda, eğer dediğim ikinci noktaya takılmazsanız tavsiye edilen en az %10 çekirdeği hiç kullanmamaktır. 30 çekirdeğiniz varsa sizin maksimumunuz 27 olmalı. Tabi bunu etkileyen ikinci koşulumuz devrede olmaz ise; bazı durumlarda bellek yetersizliğinden dolayı çok çekirdeğiniz olsa da verinizi bu çekirdeklere bölüştürmek için belleğiniz yetersiz kalır. Bu sefer de çekirdeklere dağıtılması için beklemek durumunda kalırsınız. İşte tam olarak bu nedenle bu değer de optimize edilmesi gereken bir parametre olarak öne çıkar ancak çoğunlukla skora odaklanıldığı için gözden kaçar. Oysa hız için çok önemlidir.

Devam edelim.

Head komutu da biraz daha yavaştır. Bunun nedeni de arkaplanda hızlıca blokları birleştirip bir sonuç dönmesidir.

Dağıtık Veriyi Birleştirmek Gerekirse?

Şimdi şöyle bir senaryo düşünelim, Dask ile tüm veriyi dağıttınız ama bir nedenden dolayı dağıtık veriyi bir araya getirmeniz gerekiyor. Compute metodu burada devreye giriyor. Ancak hız burada da daha yavaş.

Dask — Yarn İmplementasyonu

Verinizi büyük veri ortamında sakladığınızı düşünelim. Ancak spark üstündeki algoritmalar çözüm sağlamıyor sizin probleminize. Alternatif çözümler arıyorsunuz. Burada dask yarn ile entegre olabilmesi ile sizin için bir çözüm olabilir. İlk olarak dask-yarn’ı indirmeniz gerekecektir. Bunun için aşağıdaki kod yeterli olacaktır;

Yarn’a bağlanmak için “environment.tar.gz” dosyasına ihtiyacınız olacak. Bunu Anaconda üstünden oluşturmanız mümkün. Bunun için de aşağıdaki komutu kullanabilirsiniz. Bu komutu anaconda prompt’a yazmanız yeterli olacaktır.

Bu sayede elinizdeki kütüphaneleri paketlemiş oluyorsunuz ve bir anlamda Yarn’a ben bu kütüphaneleri kullanacağım demiş oluyorsunuz. Artık bağlantıya hazırız. Burada kullandığım kodları buradan aldım.

YarnCluster’ı yükledikten sonra cluster adında bir değişken oluşturarak environment parametresi olarak az önce oluşturduğumuz dosyayı veriyoruz. Çalışmak istediğiniz veriye göre vcore, memory ve worker sayısını belirleyebilirsiniz bu aşamada. Sırada bu cluster ile Dask’ı bağlamak var böylece bu clusterı kullanarak veriye erişip veriyi dask üstüne alabileceğiz. Bu sayede de büyük veri üstünde olan verimizi dask ile işleyebileceğiz. Hadi yapalım.

Bu şekilde dask ile yarn arasındaki bağlantıyı sağlamış olduk. Artık dask üzerinden veri okumaya hazırız. Bu kısımdan sonrası aslında başta anlattığım ve pandas ile de benzeştiği için dask-yarn implementasyonunu burada kesiyorum.

Son Söz

Dask ile Pandas arasındaki farklardan birisi de Dask makine öğrenmesi algoritmalarını da içinde barındırıyor demiştik. Bunu da biraz açtıktan sonra bitirelim. Dask size pandastan farklı olarak makine öğrenmesi seti de sunuyor. Bunların içinde Xgboost da var. Bu ne demek peki? Aslında bunun birden fazla anlamı var; ilk anlammı elinizin altında son dönemin en güçlü algoritmalarından birisi mevcut. İkincisi siz bu algoritmayı ekstra bir paket yüklemeden, o paketi tek paketin içinde veri okuma ile başlayan sonuç analizi ile devam eden tüm veri madenciliği adımlarını ilerleterek erişebiliyorsunuz. Bir diğer avantajı ise sektör içinden; Xgboost’a yakın olan bir algoritma Spark 2.4+ ile Microsoft’un mmlspark paketi ile geliyor. Bu paketi de bir başka yazımda ele almayı düşünüyorum. Ancak siz Spark’ın daha alt bir sürümünüze sahipseniz Dask burada devreye giriyor. Yarn üstünden veriye erişip o veriyi de Xgboost ile işleyerek bu sorunun önüne geçebiliyorsunuz.

Dask genel hatları ile böyle. İlerleyen yazılarda belki daha derinine de ineriz. Şimdilik sağlıkla kalın.

--

--