18 Aralık 2014 Perşembe

Hadoop Kümesine Yeni Düğüm Ekleme (Commissioning) - Çıkarma (Decommissioning)

Hadoop kümesinde düğümlerin tanımlı olduğu 3 farklı dosya bulunmaktadır.

  1. slaves
  2. hdfs-site.xml dosyasındaki "dfs.hosts" özelliğinde tanımlı dosya
  3. mapred-site.xml dosyasındaki "mapred.hosts" özelliğinde tanımlı dosya
  4. hdfs-site.xml dosyasındaki "dfs.hosts.exclude" özelliğinde tanımlı dosya
  5. mapred-site.xml dosyasındaki "mapred.hosts.exclude" özelliğinde tanımlı dosya

Slaves Dosyası

Slaves dosyasında kümede kullanılan tüm düğümlerin adresleri tanımlanır. Bu dosya Hadoop tarafından açılış, kapanış yada restart gibi yönetimsel işlemler gerçekleştirilirken kullanılır. Hadoop açılırken bu dosyadaki sunuculara bağlanıp tasktacker ve datanode servislerini ayağa kaldırır.

dfs.hosts Dosyası

hdfs-site.xml dosyasındaki "dfs.hosts" özelliğinin dfs.hosts.file olarak tanımlandığını varsayalım. Slaves dosyasındaki tüm düğümlerde sistem başlatıldığında datanode servisleri çalıştırılır. Daha sonra bu datanode servisleri namenode'a bağlanmaya çalışırlar. Bu esnada Hadoop tarafından dfs.hosts.file dosyası kontrol edilir. Eğer bağlanmaya çalışan düğüm bu dosyada tanımlı değil ise kümeye eklenmez.


mapred.hosts Dosyası

mapred-site.xml dosyasındaki "mapred.hosts" özelliğinin mapred.hosts.file olarak tanımlandığını varsayalım. Slaves dosyasındaki tüm düğümlerde sistem başlatıldığında tasktracker servisleri çalıştırılır. Daha sonra bu tasktracker servisleri JobTracker'a bağlanmaya çalışırlar. Bu esnada Hadoop tarafından mapred.hosts.file dosyası kontrol edilir. Eğer bağlanmaya çalışan düğüm bu dosyada tanımlı değil ise kümeye eklenmez.

dfs.hosts.exclude Dosyası

hdfs-site.xml dosyasındaki "dfs.hosts.exclude" özelliğinin dfs.hosts.exclude.file olarak tanımlandığını varsayalım. dfs.hosts.exclude.file dosyasına kümeden çıkartılmak istenilen datanode düğümlerinin adresleri eklenir. Bu düğümlerde bulunan veriler güvenli bir şekilde taşındıktan sonra düğüm kümeden çıkartılır.


mapred.hosts.exclude Dosyası

mapred-site.xml dosyasındaki "mapred.hosts.exclude" özelliğinin mapred.hosts.exclude.file olarak tanımlandığını varsayalım. mapred.hosts.exclude.file dosyasına kümeden çıkartılmak istenilen tasktracker düğümlerinin adresleri eklenir. Bu düğümlerde çalışmakta olan task'lar güvenli bir şekilde başka düğümlere taşındıktan sonra düğüm kümeden çıkartılır.

Kümeye Yeni Datanode Ekleme (Commissioning)
  • dfs.hosts.file dosyasına eklenmek istenilen yeni datanode düğümünün adresi yazılır.
  • slaves dosyasına eklenmek istenilen yeni datanode düğümünün adresi yazılır.
  • $ hadoop dfsadmin -refreshNodes komutu çalıştırılır.
  • Eklenecek düğüme bağlanılır ve datanode servisi çalıştırılır. 
    • $ hadoop-daemon.sh --config /etc/hadoop/ start datanode)
  • Hadoop namenode web arayüzünden yeni datanode düğümünün eklendiği teyit edilir.

Kümeye Yeni Tasktracker Ekleme (Commissioning)
  • mapred.hosts.file dosyasına eklenmek istenilen yeni tasktracker düğümünün adresi yazılır.
  • slaves dosyasına eklenmek istenilen yeni tasktracker düğümünün adresi yazılır.
  • $ hadoop mapredadmin -refreshNodes komutu çalıştırılır.
  • Eklenecek düğüme bağlanılır ve tasktracker servisi çalıştırılır. 
    • $ hadoop-daemon.sh --config /etc/hadoop/ start tasktracker)
  • Hadoop jobtracker web arayüzünden yeni tasktracker düğümünün eklendiği teyit edilir.
Kümeden DataNode Çıkarma (Decommissioning)
  • dfs.hosts.exclude.file dosyasına çıkartılmak istenilen datanode düğümünün adresi yazılır.
  • $ hadoop dfsadmin -refreshNodes komutu çalıştırılır.
  • Hadoop namenode web arayüzünden datanode düğümünün kümeden çıkartıldığı teyit edilir.
  • Çıkartılan düğüme bağlanılır ve datanode servisi kapatılır. 
    • $ hadoop-daemon.sh --config /etc/hadoop/ stop datanode)
  • dfs.hosts.file dosyasından kümeden çıkartılmak istenilen datanode düğümünün adresi silinir.
  • $ hadoop dfsadmin -refreshNodes komutu çalıştırılır.
  • slaves dosyasından, kümeden çıkartılmak istenilen datanode düğümünün adresi silinir.

Kümeden Tasktracker Çıkarma (Decommissioning)
  • mapred.hosts.exclude.file dosyasına çıkartılmak istenilen tasktracker düğümünün adresi yazılır.
  • $ hadoop mapredadmin -refreshNodes komutu çalıştırılır.
  • Hadoop jobtracker web arayüzünden tasktracker düğümünün kümeden çıkartıldığı teyit edilir.
  • Çıkartılan düğüme bağlanılır ve tasktracker servisi kapatılır. 
    • $ hadoop-daemon.sh --config /etc/hadoop/ stop tasktracker)
  • mapred.hosts.file dosyasından kümeden çıkartılmak istenilen tasktracker düğümünün adresi silinir.
  • $ hadoop mapredadmin -refreshNodes komutu çalıştırılır.
  • slaves dosyasından, kümeden çıkartılmak istenilen tasktracker düğümünün adresi silinir.

17 Aralık 2014 Çarşamba

Linux Dosya Sistemleri


MINIX :
Eski bir dosya sistemidir. Kısıtları: 
  • En fazla 64 Mb’lık dosya sistemi, 
  • Dosya isimleri 30 karakter ile sınırlı
  • tek tür zaman damgası
Ext
Minix dosya sistemindeki kısıtları kaldırmıştır.

Ext2 
EXT'nin gelişmiş halidir. Yazma işlemi hem ardışık bloklar halinde hemde ayrı ayrı gerçekleşir. Ardışık bloklar halinde depolanmayan dosyalar, parçalanmış dosyalar (fragmented files) olarak adlandırılır. Parçalanmış dosyaların okuma ve yazma süresi daha uzundur.
Kısıtları:
  • En fazla 4 TB disk bölümü kullanılabilir.
  • En fazla 2 GB lık dosyalar oluşturulabilir.

Ext3 
Ext2 dosya sisteminin gelişmiş halidir. Sistemde yapılan tüm işlemlerin kayıtları tutulmakta ve bir hata anında geriye dönülebilmektedir. Bu işlem günlükleme (journalling) olarak adlandırılmaktadır. Herhangi bir sistem çökmesinde yapılan işlemlerin kayıtlarına ulaşılıp bu işlemler tekrar uygulandığında sistemi kurtarmak daha kolay olmaktadır.

Ext4 
Ext3 dosya sisteminin genişletilmiş halidir. Journallinh yapısına ek olarak journal checksum özelliğini sağlamaktadır. Böylelikle disk ahataları hızlı bir şekilde onarılabilmektedir. Performans olarak diğer ext dosya sistemlerinden daha iyidir. Dosya boyutları ile ilgili kısıtları genişletmiştir.
Kısıtları:
  • En fazla 1 EiB(exbibyte) disk bölümü kullanılabilir. 
  • En fazla 16 TB lık dosyalar oluşturulabilir.
XFS 
Günlükleme altyapısının en kararlı çalıştığı dosya sistemidir. Büyük boyutlu dosyaları desteklemektedir.
Kısıtları:
  • En fazla 9.000 Pbyte disk bölümü kullanılabilir. 
  • En fazla 18.000 Pbyte lık dosyalar oluşturulabilir.
  • Blok büyüklüğü 64 KB

Linux Dizin Yapısı


/bin    : Çalıştırılabilir Programların bulunduğu dizin.

/boot  : Açılış için gerekli dosyaların bulunduğu dizin.

/dev    : Donanım aygıtları ile ilgili dosyaları içeren dizin.
  • /dev/dsp : Ses aygıtı
  • /dev/lp0 : Paralel port (LPT 1); Yazıcı gibi aygıtlar için
  • /dev/psaux : PS/2 girişi
  • /dev/sda : Flash Bellekler, harici diskler gibi SCSI aygıtlar için
  • /dev/scd : SCSI CD-ROM için
  • /dev/ttyS0 : Seri port (COM 1), fare gibi aygıtlar için
  • /dev/usb : USB
/etc : Yapılandırma dosyalarının bulunduğu dizin.

/home : Kullanıcıların dosyalarının bulunduğu dizin.

/lib : Kernel kütüphanelerini ve uygulamalara ait kütüphaneleri barındıran dizin.

/lost+found : Hatalı bir durumdan sonra zarar görmüş dosyaların bulunduğu dizin.

/media : Çıkarılabilir aygıtların bulunduğu dizin. (Harici disk, CD-Rom, USB...)

/mnt : Dosya sistemlerinin bağlandığı dizindir.

/opt : Windowsda bulunan Program files dizininin eşleneğidir.

/proc : Sistemin çalışma anındaki bilgilerinin yazıldıüı dizindir. 
  • cpuinfo: İşlemci ile ilgili bilgiler
  • devices: aygıtlar ile ilgili bilgiler
  • dma: Dma kanalalrı ile ilgili bilgiler
  • filesystems: Desteklenen dosya sistemleri ile ilgili bilgiler
  • interrupts: Kullanılan kesintiler ile ilgili bilgiler
  • iports: Giriş, çıkış portları ile ilgili bilgiler
  • kcore: Bellek ile ilgili bilgiler.
/root : Root kullanıcısının kendine at dizini.

/sbin : Root kullanıcısının çalıştırabileceği yönetimsel komutların bulunduğu dizindir.

/selinux : Güvenlik ile ilgili bilgilerin tutulduğu dizindir.

/srv : http ve ftp gibi hizmetlere ait bilgilerin tutulduğu dizidir.

/sys : Kernel hakkında bilgilerin tutulduğu dizindir.

/tmp : Geçici dosyaların tutulduğu dizindir.

/usr : İşletim sistemi tarafından yada paket olarak yüklenen programların tutulduğu dizindir.
  • Root haricinde ki kullanıcılarında çalıştırması gereken yönetimsel komutlar /usr/sbin altında turulur.
  • /usr/local/ altındaki tüm komutlar bulunduğu makinaya özeldir ve ağ üzerinden değer makinalardan erişilemez. /usr/altındakiler ise diğer istemcilerden erişilebilir.
/var : Log dosyaları gibi dosyaların tutulduğu dizindir.

16 Aralık 2014 Salı

Hadoop Balancer

Büyük veri içeren bir Hadoop kümesinde zaman içerisinde datanode 'larda bulunan verilerin yoğunluğu birbirine eşit olmayabilir. Veri silme işlemerleri gibi işlemler ile küme üzerindeki denge bozulabilir. Bu durumda mapreduce programları çalıştırılmaya başlandığında bazı datanode'larda fazla bazılarında az iş çalıştırılır (veri yoğunluğu ile orantılı olarak).

Bu gibi problemleri aşabilmek için Hadoop altyapısının "Balancer" adı verilen bir uygulaması mevcut. Balancer çalıştırılarak küme tekrar dengeli veri paylaşımı olacak şekilde ayarlanabilmekte. Balancer sistemini çalıştırabilmek için aşağıdaki komut kullanılır:

$ start-balancer.sh

Bu komut çalıştırıldığında fazla yüke sahip datanode'lardan daha az veri yoğunluğu olan datanode'lara veri aktarımı olur. Bu veri aktarımı ağda yüke sebep oalcağından ve çalışan diğer işleri etkilememsi için varsayılan olarak 1MB ile sınırlandırılmıştır. Bu değer hdfs-site.xml dosyasındaki "dfs.balance.bandwithPerSec" parametresi ile değiştirilebilmektedir.

12 Aralık 2014 Cuma

Doküman Benzerliği (Shingling, Minhashing ve LSH)


Doküman benzerliği bulurken uygulanacak farklı yöntemler mevcut. Bu yöntemlere örnek olarak Shingling, Minhashing ve LSH verilebilir. Benzerliği bulurken bu metodları hangi sıra ile ve ne amaçla kullanabileceğimiz aşağıdaki resimde belirtilmiştir.

Resim: Courdera - Mining Massive Datasets .

Shingling:

Doküman belirlenen sayı adedince shingle şeklinde bölünür. Buna k-sjingle denilir. Mantık n-gramlardaki gibidir.  Ki doküman arasındaki farkı incelerken dokümanlardaki farklı olan ve aynı olan shingle sayıları göz önünde bulundurulur.

Örn:
Doküman = kakules
k=2
2-shingles = {ka,ak,ku,ul,le,es}


Shingle'lar çok uzun olduklarında 4 byte yer kaplayacaklşekilde sıkıştırma yapılır. Sıkıştırılmış nesnelere "token" adı verilir. Dokümanlar arasındaki karşılaştırmalar token'lar ile yapılır.

Minhashing:

  • Jaccard Similarity: 1. dokümanda  6 ikinci dokümanda 8 shingle var ise ve bunlardan 3 tanesi ortak ise jaccard smilarity 3/11 'dir. Bunun için doküman shingle larından oluşan bir matrix oluşturulur. Bu matrixde iki dokumanda da geçen (1,1) doküman sayısı/herhangi birinde 1 değeri olanların toplamı(1,0 yada 0,1) olarak hesaplanır.
Minhashig 'de hash fonksiyonu hesaplanırken Matrix üzerinde satırlar random olarak dağıtılır ve hangi sırayı hangi satırın doldurduğuna bakılarak bir hash matrix oluşturulur. (1. satırdan başlanarak doldurma işlemi yapılır.) Col/Col 'da kolonlardaki benzerlik Sig/Sig de signature matrixdeki benzerlik bulunur.

Resim: Courdera - Mining Massive Datasets .


Bu yöntemi büyük veri setlerinde uygulamak zordur. Bunun için hash metodları ile hashmatrix oluşturulur. Hash matrix oluşturulurken:


  • Hash metodu değere göre hesaplanır.
  • Ana matriste kolon için değeri 1 ise :
    • Hash metodunun sonucu hash matrisdeki kolondaki değerden küçük ise, hash matrisindeki değer hash metodundaki ile güncellenir.
    • Değil ise aynen bir sonraki adıma yansıtılır.

Resim: Courdera - Mining Massive Datasets .

Son çıkan matristeki değerlerin aynı olmasına göre kolonların benzerlikleri bulunur.

LSH- Locality Sensitive Hashing:

Tüm bu işlemlerden sonra büyük veriler ile çalışırken elimizde çok sayıda imza olşacaktır ve bunların karşılaştırılması da uzun zaman alıcaktır. Bu işlem süresini kısaltmak için imzalar üzerinde tekrar bir hash işlemler dizisi gerçekleştirilir ve çıkan sonuçlara göre kutularda duruplanır. Ortak bir kutuya bir kez girenler benzer olarak kabul edilir ve bu imzaya sahip belgelerde benzer olarak oylanır.






19 Kasım 2014 Çarşamba

Hadoop Bellek Kullanımı

Varsayılan Değerler

Her bir makinada 2 ader map ve reduce task ayağa kalkar.

DataNode : 1000MB
TaskTracker:1000MB
1 Map Task : 200MB (-Xmx200m)
1 Reduce Task : 200MB (-Xmx200m)

Toplamda: 1000+1000+200*2+200*2= 2800MB bellek gerekir.

*****************************************
1 task'ın kullanabileceği bellek "mapred.child.java.opts" parametresi ile değiştirilebilir. Aynı anda çalışabilecek task sayısı makinadaki işlemci sayısı ile doğru orantılıdır. 5 çekirdekli bir makinada aynı anda 4 adet task çalışabilir(1 slotu asktracker ve datanode kullanır). Bu durumda 200*4 map+ 200*4 reduce+1000datanode+100tasktracker= 3600  MB belleğe ihtiyaç olur.


18 Kasım 2014 Salı

HDFS Açılırken ve Kapanırken Adımlar

start-dfs.sh script'i çalıştırılır:

  • script hangi makinada çalışır ise o makina NameNode ayağa kaldırılır.
  • slaves dosyasında tanımlı tüm  makinalarda DataNode servisleri ayağa kaldırılır.
start-mapred.sh script'i çalıştırılır:

  • script hangi makinada çalışır ise o makina JobTracker ayağa kaldırılır.
  • slaves dosyasında tanımlı tüm  makinalarda TaskTracker servisleri ayağa kaldırılır.
Sistem kapatılırken stop-mapred.sh ve stop-dfs.sh scriptleri çalıştırılır. Sistem tarafından sırası ile TaskTracker servisi, JobTracker servisi, DataNode servisi ve en son NameNode servisi kapatılır.

Hadoop Konfigürasyon Yönetimi


  • Hadoop kümesindeki konfigürasyon dosyaları herbir düğümde ayrı ayrı tutulmakta. Bu dosyaların aynı değerlere sahip olmasını istediğimizde rsync, pdsh yada  dsh gibi komutlar ile dağıtım yapabiliriz.
  • Komut sistemi ile dosyalar dağıtıldığında kapalı durumda olan makinalara ilgili dosyalar iletilmemiş olacaktır. Bu durumda aynı konfigürasyonların tüm düğümlerde aktif olduğuda herzaman garanti edilemez. Bu gibi açıklardan dolayı, komutlar satırı ile dosyaların dağıtılmasından daha gelişmiş olarak Chef, Puppet, cfengine ve bcfg2 gibi araçlarda konfigürasyon yönetimi için kullanılabilir.
  • Bir başka uygulanabilecek yaklaşım ise hadoop-env.sh dosyasında "HADOOP_MASTER" parametresine namenode yada jobtracker ip adresi tanımlanır. Datanode makinalarında servisler başlatılırken konfigürasyonm dosyaları HADOOP_MASTER olarak tanımlanmış olan makinadan konfigürasyonları çekerler ve sonra servisler başlatılır. Bu işlemin aktif olabilmesi için hadoop-env.sh dosyası  HADOOP_MASTER parametresi tanımlandıktan sonra tüm datanodelara dağıtılması gerekir. Yeni eklenen makinalardada bu özelliğin aktif olabilmesi için kickstart scriptlerine eklenmelidir. Bu özellik aktif edildiğinde datanode'lar ayağa kalkarken aynı anda HADOOP_MASTER olarak tanımlı makinaya rsync yapmaya çalışırlar. Büyük ölçekli hadoop kümelerinde bu fazlasıyla yük getirecek ve hatalara sebep olacaktır. Bunun engellenebilmesi için "HADOOP_SLAVE_SLEEP" parametresine 0.1 saniye gibi bir değer verilir. Böylelikle datanode'lar 0.1 saniye aralıklar ile ayağa kaldırılır.
Hadoop namenode, secondarynamenode ve datanode makinalarının IP lerini konfigürasyon dosyalarından öğrenmektedir:
  • masters: secondary namenode IP si bu dosyada tanımlanır.
  • slaves  : datanode makinalarının IP leri bu dosyada tanımlanır.
Bu iki dosyanın sadece namenode ve jobtracker servislerinin çalışacağı makinalarda olması yeterlidir. Datanode'lara dağıtılmasına gerek yoktur.

DataNode ve TaskTracker servislerinin hangi makinalarda çalışacağını slaves dosyasında tanımlayabiliryoruz. Ancak bu durumda Hadoop sistemi çalışmaya devam ederken bir makinayı çıkartma yada ekleme işlemini (Commissioning, Decommissioning) gerçekleştiremiyoruz. Bu işlemleri sağlıklı bir şekilde yapabilmek için :

  • mapred-site.xml dosyasında  "mapred.hosts" özelliğine tasktracker servislerinin çalışacağı makinaları tanımlayacağımız dosya adı atanır.
  • mapred-site.xml dosyasında  "mapred.hosts.exclude" özelliğine tasktracker servisini kapatmak istediğimiz makinaları tanımlayacağımız dosya adı atanır.
  • hdfs-site.xml dosyasında  "dfs.hosts" özelliğine datanode servislerinin çalışacağı makinaları tanımlayacağımız dosya adı atanır.
  • hdfs-site.xml dosyasında  "dfs.hosts.exclude" özelliğine datanode servisini kapatmak istediğimiz makinaları tanımlayacağımız dosya adı atanır.
Ek Konfigürasyonlar:
  • Hadoop varsayılan ayarlarında I/O buffer olarak 4 KB kullanmaktadır. Ancak bu değer genellikle 128 KB olarak ayarlanır. Bu değeri core-site.xml dosyasındaki "io.file.buffer.size" özelliği ile değiştirilebilmektedir.
  • HDFS Block size varsayılan ayarlarda 64 MB  olarak kullanılmaktadır. Ancak genellikle namenode' a fazla yük bindirmemek amacı ile ve map task'lara daha fazla veri vermek amacı ile bu değer 128 MB olarak kullanılmaktadır. Bu değer hdfs-site.xml  dosyasındaki dfs.block.size özelliği  ile değiştirilebilmektedir.
  • HDFS silinen verileri doğrudan silmemekte, çöp kutusuna taşımaktadır. Belirli aralıklar ile çöp kutusu boşaltılmaktadır. Çöp kutusunun hangi aralıklar ile boşaltılacağı core-site.xml dosyasındaki fs.trash.interval özelliği ile belirlenmekte. Varsayılan ayarlarında bu değer "0" olarak  kullanıldığından veriler silindiğinde çöp kutusuna atılmamakta. Verilerin doğrudan silinmesini istemediğimiz durumlarda bu değer değiştirilmelidir.

Hadoop - Ağ Topolojisi Tanımlama

Hadoop sisteminin yedek verileri (replica) dağıtırken ağ topolojisini göz önünde bulundurduğunu
Hadoop - Yedek Verilerini (Replica) Neye Göre Konumlandırılıyor? yazısında belirtmiştik. Peki Hadoop bizim ağ yapımızı nerden biliyor?
Hadoop sistemine ağ topolojimizi bizim tanımlamamız gerekiyor. Aksi durumda tüm sunucuların default-rack  üzerinde bulunduğunu varsayıyor. Bu tanımlamayı yapabilmek için "topology.script.file.name"  parametresinde belirtilen dosya adında bir dosya oluşturularak hadoop_conf dizinine bırakılır. Bu dosyanın örneği:

HADOOP_CONF=/etc/hadoop/conf 

while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec< ${HADOOP_CONF}/topology.data 
  result="" 
  while read line ; do
    ar=( $line ) 
    if [ "${ar[0]}" = "$nodeArg" ] ; then
      result="${ar[1]}"
    fi
  done 
  shift 
  if [ -z "$result" ] ; then
    echo -n "/default/rack "
  else
    echo -n "$result "
  fi
done 

Bu dosyada belirtilen "topology.data" dosyası hazırlanır ve burada hangi sunucunun hangi rack üzerinde olduğu belirtilir.

hadoopdata1.ec.com     /dc1/rack1
hadoopdata1            /dc1/rack1
10.1.1.1               /dc1/rack2

Örnekler: http://wiki.apache.org/hadoop/topology_rack_awareness_scripts adresinden alınmıştır.

Hadoop MapReduce Dosyalar ile Çalışma

Hoddop kümseinde paralel olarak çalışacak mapReduce programlarında bazen dışarıdan verilere ihtiyaç duyulabilir. Bu durumda join işlemlerinin getireceği maliyet gözönünde bulundurularak bu tür kayıtlar çalışacak Job'a konfigürasyon  dosyası olarak eklenir. Hadoop bir job başlatılırken "-files" "-archives", "-jars" ile gönderilen parametreleri Distributed Cache'e yükler. TaskTracker "run" metodunu çağırmadan önce Distributed Cache deki dosyaları lokal diske kopyalar.  Böylelikle bu dosyalar Hadoop Distributed cache'e atılacağından program içerisinden rahatlık ile kullanılabilir.

Bir dosyayı çalışma anında bir job'da kullnabilmek için job başlatılırken "-files dosyaAdi.txt" şeklinde parametre olarak geçilebilir. Birden fazla dosya yüklenecek ise virgül ile ayrılır. Bu işlem kod içerisinden de "addCacheFile" gibi metodlar ile gerçekleştirilebilir. Yüklenen bu dosyaların Job içerisindeki tanımlanan "setup"   methodları içerisende "new File (dosyaAdi.txt)" şeklinde çağırılıp kullanılabilir. Ya da kod içerisinde "context.getLocalCacheFiles()" yada eski API de bulunan "DistributedCache.getLocalCacheFiles(conf)" metodları ile bu dosyalara erişilip kullanılabilir.

Tüm bunlara ek olarak dosyalar Distributed Cachede bulunan dosyalar lokal diske yazılırken, "-libjar"  parametresi ile tanımlanmış dosyalar task'ın classpath'ine eklenir. Task tracker aynı zamanda cache de bulunan bir dosyanın kaç task tarafından kullanıldığı ve kullanımının sona erip ermediği bilgisinide tutar. Bir dosya hiç bir task tarafından kullanılmıyor ise silinecekler listesine eklenir ve cache size 10 GB'a eriştiğinde silinir. 10 GB değeride parametrik olarak "local.cache.size" parametresi ile tanımlanabilmektedir.


12 Kasım 2014 Çarşamba

Hadop Kullanıcı Oluşturma Kota Tanımlama

Kullanıcı Tanımlama

hadoop fs -mkdir /user/yeniKullanici
hadoop fs -chown yeniKullanici/yeniKullanici /user/yeniKullanici

Kullanıcıya Kota Atama

hadoop dfsadmin -setSpaceQuota 1t /user/yeniKullanici

11 Kasım 2014 Salı

MapReduce Sayaçlar (Counter)

MapReduce programları çalışırken sayaç (counter) kayıtlarındaki değerle çalışma esnasındaki gerçekleşen işlemler ile ilgili bize çeşitli bilgiler sunabilir. Hadoop altyapısında bulunan standart sayaçlara ek olarak kullanıcıların ihtiyaçları doğrultusunda yeni sayaçlarda tanımlanabilmektedir.

Tanımlanan sayaçlar Java enum yapısında olmakta. Örn:

public class OdemeAnaliz extends Configured implements Tool {

//Sayaç tanımı
enum OdemeTuru{
KrediKarti,
Nakit
}

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> 
 {......
//Sabit Sayaç
context.getCounter(OdemeTuru.KrediKarti).increment(1);
......
//Dinamik Sayaç
context.getConter("OdemeYil", getOdemeTarih()).increment(1);
......
  }
}

Örnekte 2 adet sabit 1 adet dinamik sayaç tanımlandı. Sabit enum olarak tanımlanan sayaçlar jobTracker arayüzünde enumda tanımlandığı ismi ile görülmekte. Bu ekilde görüntülenmesi çok kullanıcı dostu değil. Ekranda bu sayaçların farklı şekilde görüntülenmesini istersek bir .properties dosyası oluşturularak burada tanımlamalar yapılmakta. Bu dosya sayacın tanımlandığı sınıf ile aynı dizine konulmalı.
Bu dosyanın isimlendirmesi sınıfIsmi_enumIsmi.properties kalıbında olmalı. Dostya içindeki tanımlamalar ise aşağıdaki kalıpta olmalı:

CounterGroupName=Ödeme Türleri
KrediKarti.name=Kredi Kartı ile Ödeme Sayısı
Nakit.name=Nakit Ödeme Sayısı

Bu tür bir dosya tanımı yapıarak sistemin farklı dilleri desteklemesi sağlanabilmekte. İngilizce için sınıfIsmi_enumIsmi_en_EN.properties Türkçe için sınıfIsmi_enumIsmi_tr_TR.properties olarak dosyalar tanımlanarak sistemin farklı dillerde sayaç bilgilerini sunması sağlanabilmekte.

3 Kasım 2014 Pazartesi

Hadoop - Dosyaların Split Olarak Bölünmeden Atılması

Bazı durumlarda HDFS e atılan dosyaların bütün olarak işlenmesi gerekebilir. Çözüm olacak iki yöntem mevcut:

  1. Split size min. değeri verilebilecek en yüksek değer olarak(Long.MAX_VALUE) yada en büyük boyuttaki dosya değeri olarak ayarlanır.
  2. TextInputFormat sınıfından yeni bir sınıf oluşturulup isSplittable metodu override edilerek false değeri döndürülür.

Hadoop - Küçük Dosyalar

Hadoop büyük boyutlardaki dosyalar üzerinde daha verimli çalışmaktadır. Bunun nedenlerinden bazıları:

  • Küçük dosyalar blok boyutundan daha küçük olacağından bloklar verimli kullanılmamaış olacak ve bir çok blok ve split oluşacaktır.
  • Daha fazla split oluşacağından dolayı, bloklarda az veri olsada çok sayıda map task oluşacak ve zamandan kayıp olacaktır.
  • Çok fazla blok oluştuğundan namenode belleğinde daha fazla yer işgal edilecektir.
Bu problemleri ortadan kaldırmak için dosyalar ilk HDFS e atılırken FileInputFormat olarak atılabilir, eğer dosyalar zaten HDFS de ise CombineInputFormat kullanılır. 

Eğer map tasklar çok kısa sürede tamamlanıyor ise split size max. seviyesine ayarlanarak CombineInputFormat kullanmak zamandan kazanç sağlayacaktır.

31 Ekim 2014 Cuma

Hadoop Block Size ve Split Size Farkı

Hadoop bir dosyayı HDFS e atarken bloklar halinde atmakta. Blok büyüklükleri de varsayılan olarak 64 MB olarak atanmıştır. Bu değer istenildiğinde değiştirilebilir.

Splitler ise her bir map task parçacığının işleyeceği veri kümesidir. Örnek verecek olursak:

1. Durum:

SplitSize  = 64 MB
BlockSize = 64 MB

Bu durumda her split 1 bloğa yerleştirilecektir. Ve her map task bir split işleyeceğinden bir blokdaki veriyi işleyecektir.

2. Durum:

SplitSize  = 128 MB
BlockSize = 64 MB

Bu durumda her split 2 bloğa yerleştirilecektir. Ve her map task bir split işleyeceğinden iki blokdaki veriyi sırası ile alarak işleyecektir.

Her bir map task çok hızlı bir şekilde çalışıp sonlanıyor ise splitSize max seviyesine çıkartılarak bir map task'ın daha fazla veri işlemesi sağlanabilir. Böylelikle map task sayısı düşecektir. Map tasklarının ayağa kaldırılma süresinden kazanç sağlandığından toplam zamandan kazanç sağlanacaktır.

Hadoop - Jop Reduce Sayısı

Bir Hadoop Job da çalıştırılacak toplam reduce sayısı varsayılan olarak birdir. En uygun şekilde bu sayısı belirleyebilmek için hadoop kümesindeki toplam reduce slot sayısına bakmak gerekir. Toplam reduce sayısından hatalı olabilecek task larıda göz önünde bulundurarak bi miktar az sayıda reduce task atanmasıdır. Toplam reduce slot sayısı JobTracker arayüzünden görülebilir.


30 Ekim 2014 Perşembe

Dosyada Her Satırda Belirtilen Sıradaki Kelimeyi Alma

1. Sıradakini almak için yazılmış örnek komut:

cat new_file.txt | awk '{print $1;}' > urlUnique.txt

24 Ekim 2014 Cuma

Hadoop WebUI Admin Yetkileri

Hadoop JobTracker Web UI üzerinden job sonlandırma gibi işlemleri yapabilmek için core-site.xml dosyasında aşağıdaki parametre eklenir.

<property>
   <name>webinterface.private.actions</name>
      <value>true</value>
      <description> If set to true, the web interfaces of JT and NN may contain actions, such as kill job,         delete file, etc., that should not be exposed to public. Enable this option if the interfaces are only          reachable by those who have the right authorization.
      </description>
</property>

Hadoop - SkipBadRecord

-D keep.failed.task.files=true
-D mapred.max.map.failures.percent=50
-D mapred.max.reduce.failures.percent=50
-D mapred.map.max.attempts=10
-D mapred.skip.mode.enabled=true
-D mapred.skip.map.max.skip.records=1
-D mapred.skip.attempts.to.start.skipping=2

Hadoop - MapReduce-1 Job Fail Durumları


  • Task içeride yapılan işlemlerden dolayı fail edebilir.
  • Task uzun süre JobTracker'a durum ilgisi göndermediğinde (10 dakika), JobTracker tarafından fail etmiş kabul edilir ve JVM 'si kill edilir.
  • Bir task fail ettiğinde tekrar başka bir düğümde ayağa kaldırılır ve çalıştırılır.
  • Aynı task 4 kere fail eder ise tekrar çalıştırılması denenmez. Bu derğer parametriktir ve mapred.map.max.attempts ve mapred.reduce.max.attempts paremetreleri ile değiştirilebilir.
  • Bir job içerisinde belirli sayıda task fail eder ise job fail etmiş sayılır ve çalışan task larda kill edilir. Bu sayı mapred.max.map.failures.percent ve mapred.max.reduce.failures.percent parametreleri ile değiştirebilir.
  • Bir job speculative çalıştırma esnasında diğerinin bitmesinden dolayıda fail durumuna çekilip kill edilebilir.
  • Bir tasktracker hata aldığında çalıştırdığı tüm task'lar da  hatalı duruma çekilip kill edilir.

23 Ekim 2014 Perşembe

Hadoop - YARN Job Çalışma Adımları

YARN kullanılarak başlatılan job'larda, job submit edildiğinde bazı adımlar gerçekleşmekte ve bu adımların başarım durumlarına göre job işletilmeye başlanmaktadır:

  1. Resource Manager dan Application ID  alınır.
  2. Output dosyası mevcut mu kontrol edilir.
  3. Input dosyası mevcut mu kontrol edilir.
  4. Job için gerekli kaynak dosyaların (jar dosyası yada konfigürasyon dosyaları gibi) düğümlere dağıtımı yapılır. 
  5. Tum işlemler başarılı ise job  çalışmaya hazır olduğu belirtilir. 
Buraya kadar olan bölüm bir job'ın çalışmaya başlamadan önceki kontrol adımları şeklinde idi ve job'ın çalıştırıldığı istemci makinasında gerçekleşen adımlardı. Bundan sonra Resource Manager sazı eline alır ve job ilklendirilir, çalışmaya başlatılır:
  1. Schedular bir container oluşturur.
  2. Resource Manager oluşturulan container içerisinde None Manager yönetiminde Application Manager oluşturur. 
  3. Application Manager tasklar'ın durumlarını takip etmek ve counterlarını almak için processler oluşturur ve job'ı başlatır. 
  4. Application Manager her bir split adedince map task oluşturur.
  5. Reduce sayısı ise job da tanımlı "mapred.reduce.tasks" özelliğinin değerine göre belirlenir ve bu sayıda reduce task oluşturulur. 
  6. Eğer uygulama küçük bir uygulama ise [1] Application Manager  job 'ı kendisi ile aynı JVM üzerinde çalıştırır. Bun tür uygulamalara uberized denilmekte.
  7. Herhangi bir map task başlamadan önce Job setup metodu çalıştırılır. Örneğin job başlamadan önce output dosyası burada oluşturulabilir. MapReduce - 1 deki TaskTracker'ların  bu metodu çağırmasının aksine, YARD da  bu method doğrudan Application Master tarafından çağırılır.
  8. Tüm reduce task'lar tamamlandıktan sonra Job cleanup metodu çalıştırılır .Örneğin task bittikten sonra, oluşturulan geçici dosyalar burada silinebilir. MapReduce - 1 deki TaskTracker'ların  bu metodu çağırmasının aksine, YARN da  bu method doğrudan Application Master tarafından çağırılır.
  9. Job uberized olarak seçilmedi ise Application Master tüm map ve reduce task'ları için Resource Manager dan container talebinde bulunur. Bu işlem hearthbeat ler ile yapılır. Hearthbeat çağrısının içinde her bir map taskın versinin nerede olduğu ve input splitlerin hangi makinalarda ve rack'lerde olduğu bilgisi yeralır. Resource Manager locality prensibini göz önünde bulundurarak tasklerin düğümlere atamasını gerçekleştirir. Task atamasında verinin olduğu makinaya ilgili task atanmaya çalışılır ancak bu mümkün değil ise veri ile aynı rack üzerinde başka bir makinaya atama yapılır. Application Master  hearthbeat çağrısı içerisinde task için gerekli olan bellek miktarınıda iletir. Varsayılan ayarlarda bu hem map hemde reduce task için 2014 MB'dır. Bu değer "mapreduce.map.memory.mb" ve "mapreduce.reduce.memory.mb" parametrelerini ile değiştirilebilir.

Bu aşamaya kadar bir job için taskların oluşturulması, containerların oluşturulması ve düğümlere atanmasına kadar geldik. Bundan sonra taskların işletimi için sazı eline Application Master alacak:

  1. Application Master tasklar için oluşturulmuş containerlar'ın bulunduğu düğümler ile iletişime geçerek container'ları başlatır. 
  2. Taksk'ın çalışması için gereken jar dosyaları ve konfigürasyon dosyaları distributed cache den alıp task'ın çalışacağı dosya sistemine kopyalar.
  3. Task için lokal bir çalışma alanı oluşturur ve jar dosyası içeriğini buraya un-jar eder.
  4. Task'ın çalışacağı yeni bir JVM ayağa kaldırır. (YARN da Mapreduce-1 'in aksine JVM tekrar kullanılabilirliği yoktur.)
  5. Task'lar durum bilgilerini ve sayaç bilgilerini 3 saniyede bir  Application Master a iletirler.
  6. İstemci ise her saniyede bir Application Master dan sayaç bilgilerini alır.
  7. İstemci her 5 saniyede bir Application Master dan tamamlanma bilgisini zalır.
  8. Job tamamlandıktan sonra Application Master ve Task Container kendi JVM si içinde setup ve cleanup aksiyonlarını çalıştırır. Böylelikle geçici olarak yazılan dosyalar gibi job a özel şeyler temizlenir.


NOTLAR:
[1]: 10 mapper yada daha az ve 1 reducer'a sahip ve veri boyutu bir HDFS blok boyutundan daha küçük ise küçük bir job olarak kabul edilir. Ancak bu değerler parametrik olarak değiştirebilmekte. "mapreduce.job.ubertask.maxmaps", "mapreduce.job.ubertask.maxreduces", "mapreduce.job.ubertask.maxbytes"  özellikleri ile yeni değerler atanabilir. "mapreduce.job.ubertask.enable" özelliği "false" yapılarak  bu özellik kapatılabilir. 

Hadoop - YARN Temel Bileşenleri

YARN temelde aşağıdaki 4 bileşenden oluşmaktadır:
  1. Verinin okunup yazabileceği dağıtık dosya sistemi olan (HDFS).
  2. Çalıştıracağı job'ı başlatacağı istemci.
  3. Kaynakların yönetileceği "resource manager".
  4. Cluster da bulunan düğümlerdeki kayakların durumlarını izleyen "node manager".
  5. MapReduce job!larında bulunan task'ları yöneten "application master". Application master ve mapreduce taskları resource manager tarafından zamanlanırlar ve node manager tarafından yönetilirler.

Hadoop - YARN 'ın Sağladığı Artılar


  1. JobTracker'ın sorumlulukları ayrıştırıldı:
    1. "Resource Manager":  kaynakların yönetimi.
    2. "Application Manager": uygulamaların yönetimi.
  2. Aynı anda farklı türde ytgulamalar clusterda çalışabilmekte. MapReduce ve MPI uygulaması aynı anda çalışabilmekte.
  3. Her uygulama kendi container'ında çalıştığından uygulamalardaki sorunlar birbirini etkilememekte.
  4. Kullanıcılar aynı cluster üzerinde farklı mapreduce versiyonları üzerinde çalışabilmekte. Böylelikle upgrade işlemleri daha sorunsuz gerçekleşebilmekte.

22 Ekim 2014 Çarşamba

Hadoop - MapReduce (Classic) Job Çalışma Adımları

Hadoop da klasik MapReduce framework kullanılarak başlatılan job'larda, job submit edildiğinde bazı adımlar gerçekleşmekte ve bu adımların başarım durumlarına göre job işletilmeye başlanmaktadır:

  1. JobId alınır.
  2. Output dosyası mevcutmu kontrol edilir.
  3. Input dosyası mevcut mu kontrol edilir.
  4. Job için gerekli kaynak dosyaların (jar dosyası yada konfigürasyondosyaları gibi) düğümlere dağıtımı yapılır. Bu işlem yedekli olarak yapılır. Kaç tane yedeği olacağı "mapred.submit.replication" özelliğinde belirtilir. Bu değer varsayılan olarak 10 dur.
  5. Tum işlemler başarılı ise job  çalışmaya hazır olduğu belirtilir. 
Buraya kadar olan bölüm bir job'ın çalışmaya başlamadan önceki kontrol adımları şeklinde idi ve job'ın çalıştırıldığı istemci makinasında gerçekleşen adımlardı. Bundan sonra JobTracker sazı eline alır ve job ilklendirilir, çalışmaya başlatılır:
  1. Job'ın işleyeceği splitler incelenir.
  2. Her bir split adedince map task oluşturulur.
  3. Reduce sayısı ise job da tanımlı "mapre.reduce.tasks" özelliğinin değerine göre belirlenir ve bu sayıda reduce task oluşturulur. 
  4. Oluşturulan map ve reduce task'larına ID ataması yapılır.
  5. 1 adet job setup task oluşturulur. Bu task map task başlamadan önceki yapılacak işlemlerin tanımlanabileceği bir tasktır. Örneğin job başlamadan önce output dosyası burada oluşturulabilir.
  6. 1 adet job cleanup task oluşturulur. Bu task reduce task'lar tamamlandıktan sonra yapılacak işlemlerin tanımlanabileceği bir tasktır. Örneğin task bittikten sonra, oluşturulan geçici dosyalar burada silinebilir. 
  7. TakTrackerlar belirli aralıklar ile ayakta olduklarına dair jobTracker' a hearthbeat mesajı gönderirler (minimum 5 saniyede bir, büyük cluster'larda bu daha uzun bir süre). Bu mesaja ek olarak yeni bir task alabilmeye uygunluk durumlarınıda JobTracker'a bildirirler.
  8. Eğer tasktracker yeni bir task almaya müsait ise hearthbeat mesajının dönüş değeri olarak JobTracker TaskTracker'a yeni bir task atar. Hangi taskin öncelikli atanacağı belirlenirken scheduler olarak ne kullanıldığı gözönünde bulundurulur. Ek olarak JobTacker eğer tasktracker hem map hemde reduce task almaya musait ise, JobTracker tarafından öncelikle map task kapasitesi doldurulur ve daha sonra reduce task ataması yapılır. Atanacak map task seçilirken "data locality" prensibine dikkat edilir. Ancak reduce task için bu durum göz önünde bulundurulmaz.
Bu aşamaya kadar bir job için taskların oluşturulması ve düğümlere atanmasına kadar geldik. Bundan sonra taskların işletimi için sazı eline TaskTracker alacak:


  1. Tasktracker çalıştıracağı job' a ait jar dosyasını ve gerekli diğer dosyaları distributed cache den alıp tasktrackerın dosya sistemine kopyalar.
  2. Task için lokal bir çalışma alanı oluşturur ve jar dosyası içeriğini buraya un-jar eder.
  3. Task ı çalıştırabilmek için bir TaskRunner çalıştırır.
  4. TaskRunner yeni bir JVM ayağa kaldırır. (JVM tekrar kullanılabilir olarak ayarlama yapıldı ise tekrar ayağa kaldırılmaz. )
  5. Her task kendi JVM si içinde setup ve cleanup aksiyonlarını çalıştırabilir.
  6. Task çalışmaya başladığında statüsünü "progress" e çeker.
  7. TaskTracker hearthbeatler ile sürekli durumunu JobTracker'a bildirir. Task ile ilgili counterlar ise 5 saniyeden saha seyrek olarak JobTracker'a iletilir. Böylelikle durum izlenebilirliği sağlanır.
  8. JobTracker son task için de tamamlandı bilgisini aldıktan sonrajob ın durum bilgisini "success" olarak günceller.
  9. Job ile ilgili conterların ve istatistiklerin bilgileri konsola yazılır.
  10. JobTracker tamamlanan job ile ilgili cleanup işlemini yapar ve TaskTracker' ada aynı işlemi yapmalarını söyler. Böylelikle geçici olarak yazılan dosyalar gibi job a özel şeyler temizlenir.

Hadoop - MapReduce - 1 Temel Bileşenleri

Hadooop da veri işlemek için geliştirilmiş frameworklerden ilki olan MapReduce - 1 (Classic) temelde aşağıdaki 4 bileşenden oluşmaktadır:


  1. Verinin okunup yazabileceği dağıtık dosya sistemi olan (HDFS)
  2. Çalıştıracağı job'ı başlatacağı istemci.
  3. Jobların tamamının paralel olarak işlenmesini kontrol eden JobTracker
  4. Her bir düğüme JobTracker tarafından gönderilmiş olan işlerin düğümlerdeki işletimini sağlayan ve kontrol eden TaskTracker.

16 Ekim 2014 Perşembe

Hadoop Konfigürasyon Ayarları

Hadoop da konfigürasyonlar Configuration sınıfı üzerinden yönetilir. Konfigürasyonlar sisteme xml dosyaları şeklinde import edilebilir. Bunun için farklı yöntemler mevcut.

  • Bu dosyaları kendimiz ayrıştırabileceğimiz gibi GenericOptionsParse sınıfı ile de ayrıştırma işlemi yapılabilir.
  • xml dosyalarının ayrıştırılması ve job ların başlatılması gibi işlemleri soyutlamak için Tool ve ToolRunner sınıfları bulunmakta. Bu sınıfları kullanarak kodlama yapıldığında konfigürasyon dosyalarıdaki parametreler otomatik olarak yüklenmekte ve job'lar çalıştırılmaktadır.
  • Birden çok xml dosyası konfigürasyon ayarları için kodsal olarak eklenebilmektedir: 

    • Configuration.addDefaultResource("hdfs-default.xml");
    • Configuration.addDefaultResource("hdfs-site.xml");
    • Configuration.addDefaultResource("mapred-default.xml");
    • Configuration.addDefaultResource("mapred-site.xml");

  • Konfigürasyon dosyaları job çalıştırılırken komut satırından da eklenebilmektedir:
    • -conf filename
  • Konfigürasyon dosyalarında aynı parametreler var ise en son yüklenen dosyadaki parametre diğerlerini ezmektedir.


  • Bir paremetrenin hiç bir zaman başka değerler ile eilmemesini istiyor isek bu parametrede <final>true</final> özelliği eklenmelidir.
  • Konfigürasyon parametreleri jon çalıştırılırken komut satırından da verilebilmektedir. Bu şekilde ayarlanan parametrelerin önceden aynı isimde tanımlanmış olan değerlere göre önceliği vardır:
    • HADOOP_OPTS="-Dmapred.reduce.tasks=10"

13 Ekim 2014 Pazartesi

Hadoop - Yedek Verilerini (Replica) Neye Göre Konumlandırılıyor?

Hadoop dosya sistemlerinden HDFS de bir veri oluşturulduğunda, bu verinin istenilen adette yedeği altyapı tarafından oluşturulmakta. Yedek sayısı varsayılan olarak 3 adet. Bu değiştirilebilen bir değer.
Peki HDFS üzerindeki verileri yedeklenirken, hangi verinin hangi sunucularda yedekleneceği neye göre belirleniyor.

Burada bir kaç faktör var. Bunlardan en önemlisi bant genişliği. Bant genişliği göz önünde bulundurulduğunda verinin tüm yedeklerini aynı düğümde tutmak yada aynı rack üzerinde tutmak bandwith bakımından kazanç sağlayacaktır. Ancak burada oluşacak bir arıza veri kaybına neden olacaktır. Bu nedenle bu yöntem tercih edilmemekte.

Hadoop verilerin yedeklerini dağıtırken: ilk yedeği istemcinin çalıştığı düğüm üzerinde tutumakta. Eğer istemci hadoop kümesi dışında çalışıyor ise, ilk düğümü çok dolu yada çok meşgul olamayan düğümler arasından rastgele seçmekte. İkinci yedek ise, birinci yedeğin bulunduğu rack haricinden  rack'ler içinden rastgele seçilerek yerleştirilir. Üçüncü yedek ise ikinci ile aynı rack üzerinde, ikinci yedeğin bulunduğu düğümden farklı rastgele bir düğüme yerleştirilir. Hadoop sisteminin ağ topolojisini nasıl öğrendiği  Hadoop - Ağ Topolojisi Tanımlama yazısında detaylandırılmıştır.

Hadoop 1.x den itibaren bu strateji kullanıcı tarafından değiştirilebilir şekildedir.

10 Ekim 2014 Cuma

Hadoop Altyapısının Desteklediği Dosya Sistemleri

  • Local 
  • HDFS
    • Hadoop Distributed Filesystem
  • HFTP
    • HDFS 'e Http üzerinden sadece okuma amaçlı erişim sağlayan dosya sistemi
  • HSFTP
    • HDFS 'e Https üzerinden sadece okuma amaçlı erişim sağlayan dosya sistemi
  • WebHDFS
    • HDFS 'e Http üzerinden okuma ve yazma amaçlı güvenli erişim sağlayan dosya sistemi
  • HAR
  • KFS (Cloud-Store)
    • C++ ile yazılmış HDFS yada GFS benzeri dağıtık dosya sistemi
  • FTP
  • S3 (native)
    • Amazon S3 üzerinde bir dosya sistemi
  • S3(block based)
    • Amazon s3 üzerinde, dosyaları bloklarda saklayan dosya sistemi
  • Distributed RAID
    • HDFS'in RAID versiyonu
  • View
    • İstemci tarafında oluşturulan bir mount tablosudur

    Hadoop Namespace Image, Edit Log, Secondary Namenode

    Hadoop dosyalarını HDFS de saklamakta. HDFS de hangi dosyanın nerde tutulduğunu , replikalarının nerde olduğunu ise kalıcı olarak yerel diskde saklamakta. Bu bilgileri "namespace image" ve "edit log" dosyalarında tutmakta.

    Namenode gittiğinde hdfs'in metadası niteliğindeki bu bilgilerde kaybolacağından hdfs'i ayağa kaldırmak mümkün değildir. Bunu engellemek için hadoop üzerinde belirli ayarlamalar yapılarak bu bilgilerin yedeklenmesi amacıyla kalıcı başka bir diske de senkron olarak yazılması sağlanabilmektedir.

    Secondary namenode ise bir namenode değildir. Namenode da tutulan "namespace image" ve "edit log" dosyalarının belirli periyodlar ile merge edilmesini sağlamaktadır. Böylelikle "edit log" dosyalarının şişmesi engellenmiş olur.

    Secondary namenode farklı bir fiziksel makinada çalıştırılmalıdır. Ve en az namenode kadar belleğe sahip ve CPU gücü yüksek bir makina olmalıdır. Kendi içinde merge işleminden sonra "namespace image" in kopyasını tutmaktadır. Namenode çökerse bu yedekden de dönülebilir ancak veri kaybı yaşanması olasıdır.

    Namenode da bulunan verilerin bir NFS e senkron olarak kopyalanmasını sağlayarak, namenode çöktüğünde bu veriler secondary namenode 'a kopyalanıp burada sistemin ayağa kaldırılması veri kaybı yaşanmadan sistemin tekrar çalışmasını sağlayacaktır.

    Hadoop - Jop Map Sayısı

    Hadoop üzerinde bir job başlatıldığında kaç adet map task oluşturulacağı o job da kullanılacak data nın büyüklüğü ile orantılıdır. Hadoop veriyi HDFS'e atarken splitler şeklinde parçalayarak atmaktadır. Bir job başlatıldığında kullanacağı veri kaç splitten oluşuyor ise o kadar map taski oluşturulmakta. Bu işlem Hadoop altyapısının yönetiminde gerçekleşiyor. Programsal olarak map sayısınına müdahale edilememekte.

    Hadoop veriyi split olarak parçalarken 64 MB lık bölümler oluşturmakta. Ancak veri küçük dosyalardan oluşuyor ise 64 MB dan küçük splitler oluşacaktır. Bu durumda bir job çalıştırıldığında daha fazla map task açılmış olacaktır. Bu işlem de zamandan kayıba neden olacaktır.

    Bunu bir örnek ile açıklayacak olur isek:

    1. Durum

    2 adet 128 MB dosyamız olsun , bu dosyaları HDFS e attığımızda 4 adet split oluşacaktır.
    Tüm veriyi kullanan bir job çalıştırdığımızda 4 adet map task oluşacaktır.

    2. Durum

    16 adet 16 MB dosyamız olsun, bu dosyaları HDFS e attığımızda her bir dosya 64 MB dan küçük olduğundan hepsi için bir split yapılarak  16 adet split oluşacaktır.
    Tüm veriyi kullanan bir job çalıştırdığımızda 16 adet map task oluşacaktır.

    NOT: Bir job da çalışacak reduce sayısı değiştirilebilmektedir.

    23 Ağustos 2014 Cumartesi

    RFC (Request For Comment)

    İnternette kullanılan protokoller ile ilgili standartları tanımlayan dokümanlar dizisidir. Bütün internet standartları RFC dökümanları olarak tanımlıdır. Her döküman bir RFC numarasına sahiptir.

    21 Ağustos 2014 Perşembe

    Blade Sunucular ve Avantajları

    Blade Şasiler ve Blade Sunucular (Blade Enclosures & Blade Servers) kısaca anlatmak gerekir ise, üreticilerin çeşitli isimlerle adlandırdığı (Blade System c-Class, BladeCenter E, H gibi), sunucuların toplam ve ilk sahip olma maliyetini düşürmek üzere tasarlanmış, mevcut veya yeni temin edilecek blade sunucu donanımları üzerine kurulan ve buna ek olarak yazılım, hizmet, ağ ve sanallaştırma araçlarına sahip entegre ortamlardır.

    En yüksek verim ve blade miamrinin gerçek avantajları sanallaştırma altyapısına sahip kurum ve kuruluşlarda gözlenmektedir.

    Blade Sistemler, erişebildikleri yüksek donanım yoğunluğu, az yer kaplamaları, anında fonksiyon değiştirme, tüm bir şasinin kapatılmasına gerek kalmadan donanıma müdahale edebilme, tam yedekli güç kaynakları, fanlar, ağ arabirimleri ve veriyolları gibi avantajlar sunmakla birlikte sanallaştırma altyapısıyla bütünleşik esnek işlemgücü ve bellek havuzu gibi avantajlara sahiptir.

    Blade Sistemlerin kısaca avantajları;

    Hızlı ve kolay kurulum
    İlk sahip olma maliyetinin aynı işlemci ve belleğe sahip rack tipi sunuculara göre düşük olması.
    Operasyonel maliyetlerin rack tipi sunuculara nazaran daha düşük olması,
    Rack/Tower form faktör sunuculara oranla daha az yer kaplaması,
    Sanallaştırma ve konsolidasyon seçenekleri için tercih edilen platform olması ve entegrasyon kolaylığı,
    Sağladığı yoğun sunucu alanı ve düzenlenmiş blade şasi sayesinde esneklik sağlanması ve kablo karmaşasının önlemesi
    İş sürekliliği konusunda tam yedekli bileşenler ve esnek yapı sayesinde rakipsiz olması
    Güç tüketimi ve soğutma maliyetinin rack/tower form faktör sunuculara göre daha düşük olması

    Blade Sistemlerin kısaca dezavantajları;

    Kısıtlı disk alanı
    Rack tipi sunuculara ait kartların kullanılamaması, kısıtlı pci kart desteği

    Kaynak:

    http://www.4s.com.tr/tr/blog/Lists/Postalar/Post.aspx?ID=20

    22 Mayıs 2014 Perşembe

    MySql Bağlantı Sayısını Arttırma

    Kod tarafında connection açıp kapamada problem olmadığı ve çok fazla yerden bağlantı yapılması gerektiği durumlarda /etc/my.cnf  dosyasında değişiklik yapmak gerekir:


    $vi /etc/my.cnf 
    $max_connections = 500

    MySql tekrar başlatılır ve değer kontrol edilir:

    $service mysqld restart
    $echo "show variables like 'max_connections';" | mysql


    12 Mayıs 2014 Pazartesi

    LSH- Locality Sensitive Hashing Uygulamaları

    Locality Sensitive Hashing (LSH) kullanılarak yapılabilecek uygulamalar:

    * Benzer twitleri gruplama
    * Tekrarlı (dublicate) dokümanları bulma
    * Aynı dokümanın versiyonlarını bulma
    * Belirli zaman serisindeki desenler çıkartma (sensör verileri gibi)
    *  Girdilerden kişileri tanımlama

    28 Nisan 2014 Pazartesi

    Hadoop-Hbase "dfs.datanode.max.xcievers" optimum


    hdfs-site.xml dosyasında tanımlanan "dfs.datanode.max.xcievers" parametresi client makinalarda kaç adet thread açılacağını tanımladığımız değer. Hbase in çalışma performası için önemli bir parametre.
    Buradaki optimum sayının ne olacağına karar vermek için aşağıdaki formul kullanılabilir:




    Bu değer doğru tanımlanmadığında aşağıdaki gibi atalar alınabilmekte:


    Java.io.IOException: Could not obtain block: blk_2960332903087986581_94433611 file=/home/hadoop/hadoop-hadoop/mapred/staging/hadoop/.staging/job_201404221200_0002/job.split
    at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.chooseDataNode(DFSClient.java:2426) at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.blockSeekTo(DFSClient.java:2218) at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.read(DFSClient.java:2381) at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.read(DFSClient.java:2309) at java.io.DataInputStream.readByte(DataInputStream.java:265) at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:299) at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:320) at org.apache.hadoop.io.Text.readString(Text.java:400) at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:382) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:728) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149) at org.apache.hadoop.mapred.Child.main(Child.java:249)

    16 Nisan 2014 Çarşamba

    Nutch Hata: (Ljava/lang/String;ZZ)Lorg/hsqldb/persist/HsqlProperties

    pom.xml dosyasında hem hbase hem de mysql için dependency eklendiğinde myysql kullanılınca ilk önce hbase yüklendi ise onu kullanmaya çalışıyor.

    Bu durumda pom.zml de hsql eklenirken aşağıdaki şekilde olmalı:

     <dependency>
                <groupId>org.hsqldb</groupId>
                <artifactId>hsqldb</artifactId>
                <version>2.2.8</version>
                <scope>provided</scope>
            </dependency>


    3 Nisan 2014 Perşembe

    4 Mart 2014 Salı

    Hbase - Zookeeper Exception: java.io.IOException: Packet len 4409012 is out of range!

    Hbase tablolarımızda çok fazla region olduğunda hbase açılırken aşağıdaki hata görülmekte:

    java.io.IOException: Packet len4409012 is out of range!
    at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:112)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:79)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:355)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1068)
    2014-03-03 16:50:19,762 FATAL org.apache.hadoop.hbase.master.HMaster: Unhandled exception. Starting shutdown.
    org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /hbase/unassigned
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1468)
    at org.apache.hadoop.hbase.zookeeper.ZKUtil.listChildrenNoWatch(ZKUtil.java:389)
    at org.apache.hadoop.hbase.zookeeper.ZKUtil.deleteChildrenRecursively(ZKUtil.java:1045)
    at org.apache.hadoop.hbase.zookeeper.ZKAssign.deleteAllNodes(ZKAssign.java:476)
    at org.apache.hadoop.hbase.master.AssignmentManager.cleanoutUnassigned(AssignmentManager.java:193)

    at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:394)
    at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:281)

    Bu hatanın çözümü için hbase/conf/hbase.env dosyasında "HBASE_OPTS" bölümüne 
    "-Djute.maxbuffer=4509012" değeride eklenmeli. Böylelikle zookepperrın yükleyeceği dosya boyutu default 1M dan daha fazla değere arttırılmış olacaktır. Buraad ayarlanan değer hatada belirtilen değerden büyük olmalıdır.

    28 Şubat 2014 Cuma

    Hbase Enable Disable Problemi

    Yanlışlıkla disable ettiğimiz bir tablomuz olsun. İşlemi yerıda kesmiş olalım ve tekrar enable etmeye çalışalım. Tablo çok büyük olduğunda kilitlenip kalıyoruz. Bu durumu aşmak için önce aşağıdaki komutu çalıştırıyoruz. Sonra işlemi tekrarladığımızda olay tamamdır.

    $ ./hbase hbck -fix -metaonly

    27 Şubat 2014 Perşembe

    Intellij idea - Javadoc

    Idea ortamında kod dökumantasyonunu hızlı bir şekilde yapabilmek için uygulanacak bir yol:

    Plugins bölümünden JavaDoc yüklenir.

    Dökumantasyon eklenmek istenilen bölüm seçilip "shift + alt + J" basılır.

    Yada

    Alt + Insert
    JavaDoc
    Selected Element / All Element

    Tamamdır.

    Hbase - Mapreduce- "java.lang.IllegalArgumentException: No columns to insert"


    Aşağıdaki gibi bir kod parçasında "Put" nesnesinin içi doldurulmadığında sadece "key" set edildiğinde   java.lang.IllegalArgumentException: No columns to insert" hatası alınmaktadır.       

                Put p = new Put(key.get());
                .....
                .....
                ....
                context.write(key, p);
            
       

    25 Şubat 2014 Salı

    Linux Uygulama Kısayolu Ekleme - Kaldırma - Düzenleme

    "yeniProgramim" adında bir program için işlem yaptığımızı düşünelim. Programı  "java -jar yeniProgramim.jar" komutu ile çalıştırdığımızı varsayalım.

    Ekleme:
      $  gnome-desktop-item-edit ~/.local/share/applications --create-new
    Kaldırma :

    /usr/share/applications klasöründe yada ~/.local/share/applications klasöründe yeniProgramim.desktop dosyasını bulup siliyoruz.

    Düzenleme :

    /usr/share/applications
     klasöründe yada 
    ~/.local/share/applications klasöründe yeniProgramim.desktop dosyasını bulup düzenliyoruz.



    Linux Grafik Çizme Aracı (UML, FlowChart...) yED

    Linux ortamında iyi olduğu iddia edilen bir çok araç denedim ancak genelde başarıı değiller.
    yEd Bu konuda başarılı bir araç. Kurulumu:
    1. Dosyayı kendi sayfasından indiriyoruz (Executable Jar versiyonunu) 
    2. $ sudo unzip yEd-3.12.zip -d /opt
    3. Komut satırından çalıştırabilmek için betik hazırlıyoruz : 
    4.   $ sudo vi /usr/bin/yed 
        $ sudo vim /usr/bin/yed
        Açılan dosyaya aşağıdaki satırları ekleyip kaydediyoruz:  
              #!/bin/sh
              java -jar /opt/yed-3.12/yed.jar
    5. Oluşturduğumuz betik için çalıştırma hakkı veriyoruz:
    6.   $ sudo chmod +x /usr/bin/yed
    7. Komut satırından programı çalıştırıyoruz:
    8.   $ yed
    Kurmuş olduğumuz program için kısayol oluşturmak için:

     $  gnome-desktop-item-edit ~/.local/share/applications --create-new

    İşlem tamamdır...



    7 Şubat 2014 Cuma

    git hatası "fatal: could not read Password for: 'https://kullanici@aaa.com': No such file or directory"

    git üzerinde işlem yapar iken aşağıdaki türden bir hata alındığında:

    "fatal: could not read Password for: 'https://kullanici@aaa.com': No such file or directory"

    kullanıcı şifresini talep etmesi için aşağıdaki komutu komut satırına yazıyoruz. Hata aldığımız işlemi tekrar yapmaya çalıştığımızda artık bizden şifre isteyecektir.

    git config --global core.askpass /usr/libexec/git-core/git-gui--askpass

    23 Ocak 2014 Perşembe

    Hbase Satır Silme

    Satırın tamamını silmek için

    deleteall 't1', 'r1'

    Satırdaki belirli kolonları silmek için

    delete 't1','r1','c1'

    t1: Tablo adı
    r1: Silinecek satır anahtarı(id)
    c1: Silinecek kolon adı