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






Şükrü ERGÜNTOP

Author & Editor

Bilecik Şeyh Edebali Üniversitesi Bilgisayar Mühendisi mezunuyum 2015 yılından beri Sigorta Bilgi ve Gözetim Merkezinde İş Zekası alanında çalışmaktayım

0 yorum:

Yorum Gönder