Hadoop etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Hadoop etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

5 Şubat 2017 Pazar

Hadoop MapReduce

MapReduce, güvenilir ve hataya dayanıklı bir şekilde sıradan  sunuculardan oluşan geniş bir cluster üzerinde çok miktarda veriyi parallel olarak çalıştıran uygulamaları kolayca yazmak için kullanılan bir yazılım kütüphanesidir.

MapReduce framework(kütüphane)'ü 2 önemli task(görev)'i içerir.
  • Map
  • Reduce
Bir MapReduce job'ı, genellikle  girilen verilere bağımsız olarak block'lara ayırır ki bunlar parallel bir şekilde map task tarafında yürütülür. Framework(kütüphane), map'in çıktıklarını sort(sıralar) eder ve sonra reduce task ile girdileri azaltır(gruplar).

MapReduce iş akışı oluşturmak için 2 script yazmak gerekir, bunlar map ve reduce scriptleridir. Şimdi bir senaryo üzerinde MapReduce  uygulaması gerçekleştirelim

Senaryo:Yaygın olarak kullanılan wordcount uygulaması, yani HDFS'te bulunan bir file'daki kelimelerin kaç kez kullanıldığını gösteren MapReduce uygulaması.



Yukardaki MapReduce örneğinin scripti aşağıda yer almaktadır.

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

  public static class TokenizerMapper
       extends Mapper{

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        context.write(word, one);
      }
    }
  }

  public static class IntSumReducer
       extends Reducer {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable values,
                       Context context
                       ) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable val : values) {
        sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}


Yukardaki java kodunu kendi sisteminizde uygulamanız için aşağıdaki işlemleri sırasıyla yapmanız gerekemektedir.

1-Aşağıdaki ortam değişkenlilerini sistem set etmelisiniz

export JAVA_HOME=/usr/java/default
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

2-Yukarıda oluşturmuş olduğumuz wordcount java dosyasını compile(derlemek) edip ve jar dosyası oluşturmamiz gerekmektedir.

$bin/hadoop com.sun.tools.javac.main wordcount.java
$jar cf wc.jar wordcount*.class

3-Wordcount jar dosyası için input ve output diresctory'ları HDFS'te oluşturmamız gerekmektedir.
  • /user/sukru/wordcount/input - input directory in HDFS
  • /user/sukru/wordcount/output - output directory in HDFS

4-Input için HDFS'de  /user/sukru/wordcount/input directory'sinde 2 file(file01,file02) tanımladığımızı varsayalım. Aşağıdaki komutlarlar ile de dosya içeriğini görelim

$bin/hadoop fs -cat /user/sukru/wordcount/input/file01
Dear, Bear,River

$bin/hadoop fs -cat /user/sukru/wordcount/input/file02
Car,Car,River,Dear,Car,Bear

5-Şimdi uygulamayı çalıştıralım.
$bin/hadoop jar wc.jar wordcount /user/sukru/wordcount/input /user/sukru/wordcount/output


6-Uygulama çıktısını görelim.

$bin/hadoop fs -cat /user/sukru/wordcount/output/part-r-0000
Bear 2
Car 3
River 2
Dear 2






4 Şubat 2017 Cumartesi

Hadoop HDFS




HDFS'e Giriş

Hadoop Distributed File System(HDFS), sıradan sunucular üzerinde çalıştırılmak için tasarlanmış dağıtık dosya sistemidir. HDFS'de master and slave mimarisi mevcuttur.

  • Master:File System metadata'sını yönetmek için tek bir NameNode'tur.
  • Slave:Data'yı depolamak için birden fazla DataNode'tur.

Cluster üzerinde depolanmadan önce, HDFS'deki file'lar block(chunk)'lara ayrılır. Block boyutu varsayılan olarak 64MB veya 128 MB'tır. Bir file'a ait block  farklı node üzerinde store edilir.

Hadoop Daemon

Hesaplama terimlerinde daemon, arkaplanda çalışan process'tir. Hadoop'ta 5 tane vardır.
Bunlar;

  • NameNode
    • Bir block'u DataNode'a eşler.
    • File'a okuma/yazma erişimini kontrol eder.
    • Block'lar için replication(kopyalama) engine'i yönetir.
    • Client, DataNode ve SecondaryNameNode ile etkileşim halindedir.
    • File System Meta'sını yönetir.
NameNode'ta, Fsimage ve Editlog olmak üzere 2 tip dosya vardır. Fsimage, NameNode başlatıldığında dosya sisteminin o anki durumunu içerir. Editlog,NameNode başladıktan sonra dosya sisteminde oluşan değişikliklerdir.
  • SecondaryNameNode:Fsimage ve Editlog dosyasını periyodik olarak güncellemektedir. Bu sayede editlog dosyasının boyutu yönetilebilir boyut limitlerini geçmemektedir.
  • DataNode
    • Okuma, yazma isteklerinde(block oluşturma, silme ve kopyalama) sorumludur.
    • Data block'ları store(depolamak)  eder.
    • Client'tan gelen block'ları alır.

  • JobTracker(Resource Manager)
    • Kullanıcıdan gelen MapReduce task'ları kabul eder.
    • Gelen task'ı, taskTracker'a assing(atamak) eder ve status'ünü görüntüler.
  • TaskTracker(Node Manager)
    • MapReduce task'ları çalıştırır.
    • Hearbeat'i, JobTracker'e gönderir.
    • Job(İş) resource(kaynağını) HDFS'ten alır.
Her bir daemon, kendi sunucusu üzerinde bulunan JVM'te ayrı olarak çalışır.

Yazma


Okuma







HDFS Mimarisi


1 Şubat 2017 Çarşamba

Hadoop'a Giriş

Hadoop:

  • Apache'inin açık kaynaklı bir kütüphanesidir. 
  • İşlem hacmi büyük olan verileri depolamak ve analiz etmek için kullanılır
  • Java dili ile yazılmıştır.
  • Sıradan sunuculardan(commodit hardware) oluşan küme(cluster) üzerinde büyük verileri işlemeye yarar.
  • HDFS, Hadoop Common, Hadoop Yarn ve Hadoop MapReduce bileşenleri tarafından oluşan bir yazılımdır.

Hadoop'un Modülleri


  • HDFS(Hadoop Distributed File System)(Storage Layer): Hadoop cluster'larındaki verilere yüksek performanslı erişim sağlalayan dağıtılmış bir dosya sistemidir.  HDFS, master/slave mimarisi kullanır. Master, dosya sistemin metadata'sını yöneten tek bir NameNode'dan oluşur. Gerçek data'yı depolayan bir veya birden fazla slave, DataNodes. HDFS alanında bir dosya,  birkaç bloğa bölünür ve blok'lar bir  DataNode kümesinde depolanır. NameNode, blokların DataNode'lara eşleşmesini belirler. DataNode, dosya sistemi ile okuma ve yazma işlemlerini yapar. Ayrıca, NameNode'lar tarafından verilen talimatlara göre blok oluşturma, silme ve replikasyon konuları ile de ilgilenir. HDFS, diğer bir dosya sistemi gibi bir shell komutu kullanır ve dosya sistemi ile etkileşim sağlamak için komutlar listesi mevcuttur. 

    • Hadoop Yarn(Yet Another Resource Negotiator): Verileri tutan kümedeki işleri planlanlamak ve kaynak yönetimi sağlamak için bir yapı sağlar.
    • Hadoop MapReduce (Processing and Computation Layer): HDFS üzerindeki büyük verileri işlemek için kullanılan bir yöntemdir. İstediğinizi verileri filtrelemek için kullanılan Map fonksiyonu ve verilerden sonuç elde etmenizi sağlayan Reduce fonksiyonlarında oluşan program yazıldıktan sonra Hadoop üzerinde çalıştırılır. Hadoop Map ve Reduce'lerden oluşan iş parçacıklarını küme üzerinde dağıtarak aynı anda işlenmesini ve bu işler sonucunda oluşan verileri tekrar bir araya getirilmesinde sorumludur. 

    MapReduce terimi, aslında  Hadoop programlarını gerçekleştirdiği aşağıdaki 2 farklı task'ı ifade eder.
      • Map Task: İnput veriyi alır ve bir veri kümesine dönüştürür.

      • Reduce Task:Bu task'ta,  map task çıktısı girdi olarak alınır. Bu veri tuple(row)'larını daha küçük bir tuple grubunda birleştirir. Reduce task, her zaman, map task'ından sonra yapılır.

    Client Machine: Ne NameNode ne de DataNode'tur. Client machine üzerinde Hadoop yüklü olan bir makinedir.  MapReduce işlerini submit(göndermek) etmek ve tamamlandıktan sonra görüntülemek.

    JobTracker, yazılan MapReduce programının cluster üzerinde çalıştırılmasından sorumludur. Ayrıca dağıtılan iş parçacıklarının çalıştırılması sırasında oluşabilecek herhangi bir problemde o iş parçacığını sonlandırılması ya da yeniden başlatılmasından sorumludur. TaskTracker,  DataNode'ların bulunduğu sunucuda çalışır ve JobTracker'dan tamamlamak üzere  iş talep eder. JobTracker, NameNode'un yardımıyla DataNode'un local diskindeki veriye göre en uygun Map işini TaskTracker'a verir. Bu şekilde verilen iş parçacıkları tamamlanır ve sonuç çıktısı yine HDFS üzerinde bir dosya olarak yazılarak program sonlanır.

    • Hadoop Common: Bazı  modüllerin Hadoop'a erişebilmesi için gerekli olan kütüphaneleri sağlar. Mesela Hive yada HBase, HDFS'e erişmek için bu kütüphaneleri kullanılır. Bu java kütüphanesi Hadoop'u başlatmak için kullanılır. Cluster'a veri yüklemekle sorumludur.

    Hadoop Ecosystem



    • Oozie:Bütün işleri shcedule etmek için kullanılan bir tool'dur.
    • Sqoop:Klasik veritabanı ile HDFS arasında toplu veri transferi yapmayı sağlayan bir tool'dur.

    • Zookeeper:İşlerin sürekli çalışır halde kalmasını sağlayan bir takip sistemidir.
    • Oozie:Bütün işleri schedule etmek için kullanılan bir tool'dur. 

    • HBase:Dağıtık temelli kolon bazlı bir veritabanıdır.
    • Hive:Dağıtık yapılı bir veri ambarıdır. Sql benzeri bir dil sağlar.
    • Pig:Veri akışını kontrol eden ve büyük boyutlu verilerde işlem yapmayı kolaylaştıran bir tool'dur. HDFS ve MapReduce cluster'larında çalışır.
    • MapReduce:Yukarıda anlatılmıştır.
    • HDFS:Yukarıda anlatılmıştır.
    • Flume:Hadoop'a aktarılacak dosyaların(log datası, ftp dataları, twitter datası vs) toplanması ve aggregate edilmesi ve taşınmasını sağlayan bir java uygulamasıdır. Bu java uygulamasına'da agent denilmektedir.