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. 

Hiç yorum yok:

Yorum Gönder