10 Haziran 2012 Pazar

Apache pig macerası...


Evet bir log parçalama macerası... Özellikle apache HTTP web sunucusu veya commonlog biçemindeki loglarını parçalama işlemleri, onları işleme birer yük, hele log dosyalarının boyları GB ler mertebesinde sayıları ise yüzleri geçiyorsa...

Bunun için ellerimle bu logları parçalayıp işleyecek ve sonrasında veritabanına yazacak kodlar yazdım. Sonra bu sistemin kararlı çalışması için gözlemleme, hata ayıklama işleriyle uğraştım... Hem eğlenceli hem de sıkıntıların bitmemesi can sıkıcı...

Şu an kendi yazdığım sistemi çalıştığım şirkette kullanıyoruz. Kararlı olarak çalışıyor, fakat komple bir sistem olduğundan arada hatalar çıkınca eksiklikleri durmadan takip edip düzeltiyorum. Hala ...

Sonra dedim ki Apache PIG'i bir deneyeyim. Denedim ama local olarak.  cluster modunda denemedim. Basitçe bir pig dosyası var ettim. Sonrasında üretilmiş log dosyamı parçalattırdım. Gün bazında hit ve toplam tüketimi hesaplattırdım. Sonrasında ise kendi yazdığım kodla aynı log dosyasında gün bazında aynı raporları ladım.

Ve şaşırdım :) ikisi de aynı sonuçları vermişti... Ben yüzlerce satır ( belki binlerce ) kod yazmıştım benze bir işi yapmak için. PIG ile aynı raporu veren betik:




REGISTER '$PATH/pig-0.10.0/contrib/piggybank/java/piggybank.jar';

DEFINE LogLoader org.apache.pig.piggybank.storage.apachelog.CombinedLogLoader();
DEFINE DayExtractor org.apache.pig.piggybank.evaluation.util.apachelogparser.DateExtractor('yyyy-MM-dd');
DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage();

logs = LOAD 'test.access.log' USING LogLoader as (remoteAddr, remoteLogname, user, time, method,
uri, proto, status, bytes, referer, userAgent);

logs = FILTER logs BY status  == '200' OR status  == '206' OR status == '304' parallel 10;

-- project just the columns we will need
logs = FOREACH logs GENERATE remoteAddr, DayExtractor(time) as day, bytes parallel 10;

logs = GROUP logs BY day parallel 10;

logs = FOREACH logs GENERATE  group, COUNT(logs.remoteAddr) as hit, SUM(logs.bytes) as total_bytes parallel 10;
--logs = GROUP logs BY DayExtractor(time) as day;

--STORE logs INTO 'result.csv' ;

DUMP logs;




evet yukarıdaki kod benim logu parçalama ve işlemem sonucunda çıkan toplamı verdi. Biraz daha uzun süre çalışıyordu ama PIG bu kadar esnek ve kolay yapısıyla beni cezbetti.

Daha cluster olarak nasıl kullanacağım, anlık olarak logları nasıl pig ile işleyeceğimi bilgmiyorum. Şu an PIG ile log dosyalarıni bir gün geriden istediğim gibi, local modda , parçalayabileceğimi yani istediğim raporu çıkarabileceğimi biliyorum...

Denemelere devam...

Hiç yorum yok: