19 Nisan 2015 Pazar

Hadoop Merhaba Dünya

Merhaba, bu yazımda örnek bir Hadoop programı oluşturacağız. Proje için kullandığım data merkez bankasının 1950 yılından beri olan Dolar ve Sterlin kurudur. Veriyi buradan alabilirsiniz.

Gereklilikler

Maven
Eclipse IDE

Öncelikle projemizi oluşturarak başlıyoruz. Oluşturacağımız proje "Maven Project" olacak. Maven projesi olmasının sebebi ise otomatik olarak bağımlılıkları indirebilmesidir. Böylece bizim bir şey yapmamıza gerek kalmadan gerekli olan kütüphaneler projemize dahil olmuş olacaklar.
Bundan sonra yapmamız gereken şey "pom.xml" dosyasını düzenlenmek. Bu işlemi yapmamızın sebebi ise Hadoop'un uygun kütüphanelerini eklemektir. Ben 2.6 versiyonunu kullandığım için bu versiyonları ekliyorum. Siz kendi versiyonlarınıza göre düzenleyebilirsiniz. Aşağıdaki kodu pom.xml'in içine yerleştirelim:
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-common</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-yarn</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-mapreduce-client-shuffle</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-hdfs</artifactid>
  <version>2.6.0</version>
</dependency>

Bu aşamadan sonra artık sınıflarımınızı oluşturabiliriz. İlk sınıfımızı oluşturuyoruz.İlk sınıfımız driver yani sürücü sınıfı olacaktır. Sürücü sınıfında, yapılacak işi tanımlıyoruz. Ondan sonra ise Mapper ve Reducer sınıflarını tanımlıyoruz. En son kısmında ise işimiz bitince programı sonlandırıyoruz.

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class TCMB {

  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("Kullanım: TCMB <girdi> <çıktı>");
      System.exit(-1);
    }

    
    Job job=Job.getInstance();
    job.setJarByClass(TCMB.class);
    job.setJobName("TCMB");

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    job.setMapperClass(TCMBMapper.class);
    job.setReducerClass(TCMBReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(DoubleWritable.class);
    
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

İkinci sınıfımız ise Mapper sınıfı olacak. Mapper sınıfında yazı dosyamızın nasıl işleneceğini anlatıyoruz. Yani dosyanın altıncı ila onuncu karakterleri arasında yıl bilgisi olduğu gibi.

import java.io.IOException;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class TCMBMapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {

 @Override
 public void map(LongWritable key, Text value, Context context)
   throws IOException, InterruptedException {

  String line = value.toString();
  String year = line.substring(6, 10);
  String tempGbpA;
  Double gbpA;
        
  tempGbpA=line.substring(13, 25);
  gbpA = Double.parseDouble(tempGbpA);

  context.write(new Text(year), new DoubleWritable(gbpA));

 }
}

Ekleyeceğimiz son sınıf ise "Reducer" sınıfıdır. Bu sınıf ise yolladığımız verilerde nasıl bir işlem yapılacağına karar verir. Biz burada her yılın en yüksek değerini alıyoruz.

import java.io.IOException;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class TCMBReducer
  extends Reducer<text doublewritable="" text=""> {
  
  @Override
  public void reduce(Text key, Iterable<doublewritable> values,
      Context context)
      throws IOException, InterruptedException {
    
    Double maxValue = Double.MIN_VALUE;
    for (DoubleWritable value : values) {
      maxValue = Math.max(maxValue, value.get());
    }
    context.write(key, new DoubleWritable(maxValue));
  }
}

Eclipse üzerinde çalışmak için Run Configuration kısmından girdi ve çıktı parametrelerini ekliyoruz. Bundan sonra çalıştır dedikten sonra çıktıları belirttiğiniz klasörde görebilirsiniz.

Aklınıza takılan bir şey olursa sormaktan çekinmeyin.

Hello, in this tutorial we are going to create a Hadoop application. For project,i use central bank's exchange data. It is started from 1950's. You cant get here.

Requirements

Maven
Eclipse IDE

First, we create "Maven Project". It is Maven project because we don't have to deal with dependencies. After that, we edit "pom.xml" file of project. I use Hadoop 2.6 so i added libraries. If you use different version, you can change version number. Added the below code to "pom.xml":

<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-common</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-yarn</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-mapreduce-client-shuffle</artifactid>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupid>org.apache.hadoop</groupid>
  <artifactid>hadoop-hdfs</artifactid>
  <version>2.6.0</version>
</dependency>

After that, we can create our classes. First class is driver class. Driver class is the main class of our application. Then we create Mapper and Reducer classes.

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class TCMB {

  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("Kullanım: TCMB <girdi> <çıktı>");
      System.exit(-1);
    }

    
    Job job=Job.getInstance();
    job.setJarByClass(TCMB.class);
    job.setJobName("TCMB");

    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
    job.setMapperClass(TCMBMapper.class);
    job.setReducerClass(TCMBReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(DoubleWritable.class);
    
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

Second class is Mapper class. Mapper class is definer of the Hadoop application. For example, sixth and tenth characters of the text file is year information.

import java.io.IOException;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class TCMBMapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {

 @Override
 public void map(LongWritable key, Text value, Context context)
   throws IOException, InterruptedException {

  String line = value.toString();
  String year = line.substring(6, 10);
  String tempGbpA;
  Double gbpA;
        
  tempGbpA=line.substring(13, 25);
  gbpA = Double.parseDouble(tempGbpA);

  context.write(new Text(year), new DoubleWritable(gbpA));

 }
}

Our last class is Reducer class. Reducer is decision maker of our application. We find maximum value of the each year.

import java.io.IOException;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class TCMBReducer
  extends Reducer<text doublewritable="" text=""> {
  
  @Override
  public void reduce(Text key, Iterable<doublewritable> values,
      Context context)
      throws IOException, InterruptedException {
    
    Double maxValue = Double.MIN_VALUE;
    for (DoubleWritable value : values) {
      maxValue = Math.max(maxValue, value.get());
    }
    context.write(key, new DoubleWritable(maxValue));
  }
}

To run this application from Eclipse, we need to edit Run Configuration. We need to add input and output arguments. After that, you can run application.
If you have questions, don't hesitate to ask.

11 Nisan 2015 Cumartesi

Hadoop Sorun Çözme - Troubleshooting

Hadoop Sorun Çözme

Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to localhost/127.0.0.1:8020.

Log dosyasında bu girdi görüldüğü zaman yapılması gereken işlem /tmp klasöründeki hadoop ile ilgili dosyaların silinmesidir.

SSH hatası

Centos SSH klasörünü okuyamadığı için hata verebiliyor. Ubuntu ise bu hatayı vermiyor. Ben şu işlemleri takip ettim: http://ubuntuforums.org/showthread.php?t=1932058

localhost: Error: JAVA_HOME is not set and could not be found

Bu hatanın çözümü ise hadoop-env.sh dosyasına JDK yolunu eklemektir.

Hadoop Troubleshooting

Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to localhost/127.0.0.1:8020.

This error happens when Hadoop doesn't terminated properly. Solution is very simple.Just delete files under /tmp folder which is related with Hadoop

SSH Error

When CenOS cannot read SSH folder,you may experience these errors. When using Ubuntu, I didn't experience any SSH related errors. I followed the following process:http://ubuntuforums.org/showthread.php?t=1932058

localhost: Error: JAVA_HOME is not set and could not be found

When JAVA_HOME is not set,you see this error. You need to add JDK folder to hadoop-env.sh file.

Hadoop Nedir?

Bu blog https://datademi.com/index.php/2017/08/07/hadoop-nedir/ adresine taşınmıştır


Hadoop Nedir?


Merhaba, bu yazımda kısaca Hadoop'un ne olduğununda ve nerelerde kullanıldığınından bahsedeceğim.

Kelime Anlamıyla Hadoop

Projenin başındaki kişi Doug Cutting'e göre Hadoop kelimesi tamamen anlamsız,çocuğunun uydurduğu bir kelimeymiş. Oyuncak sarıfiline bu ismi vermiş. Doug beyde projeyi oluştururken ismini düşünmeye başlamış. Sonra çocuğunun sarıfili aklına gelmiş. İsim kriterlerine bakmış hiçbir anlam ifade etmemesi, kolay söylenmesi ve akılda kalıcı olması. Hepsi tutunca demişki bu projenin adı Hadoop olsun. Böylece bizim bildiğimiz Hadoop ortaya çıkmış.

İşlevsel Anlamda Hadoop


Hadoop, bir küme(cluster) mimarisidir. Yani sizin bir "A" işiniz var. "A" işini eski mimari ile tek makinede çalıştırısınız ve "X" sürede sonuç alırsınız. Oysa "A" işini küme mimarisi ile "N" kadar makinede aynı anda çalıştırabilirsiniz. Böylece "X/10","X/20" gibi sürelerde işi tamamlayabilirsiniz.
Hadoop'un tam tanımı aynı işi değişik makinelere dağıtarak işi en kısa sürede tamamlayabilmektir. Hadoop'un en önemli özelliklerinden biri ortak ve güvenilir olmayan makineler üzerinde çalışabilir. Eğer makinelerden biri çalışmazsa veya bir problem olursa işi bir sonraki makineye yönlendirir.
Hadoop'un iki ana bileşeni mevcuttur. MapReduce ve HDFS.

HDFS

HDFS kelime açılımı itibari ile Hadoop Distributed Filesystem'dir. Daha önce Google'ın geliştirdiği bir dosya yapısından kalıtım almıştır. HDFS, büyük boyutlu dosyaları oluşturmak için idealdir. Çünkü bir veri bloğu varsayılan olarak 64 MB'den oluşur. Oysa bizim kullandığımız NTFS sistemlerde bu 512 KB'dir. HDFS, küçük boyutlu dosyaları saklamak ve erişmek için çok kötü bir tercihtir.

MapReduce

MapReduce, Hadoop'un işi yapan kısmıdır. İki fonksiyonun birleşmesinden oluşur: Map ve Reduce. Map yani haritalandırma kısmı veriyi, anahtar-değer ilişikisine getirir. Reduce yani küçültme kısmı ise anahtar-değer haline gelmiş veri içerisinde verdiğiniz ilişkiye göre azaltarak istenilen sonucu üretir.

Hadoop'un Diğer Sistemler İle Karşılaştırılması


Geleneksel Veritabanı MapReduce
Veri Boyutu Gigabyte Seviyesinde Petabyte Seyivesinde
Erişim Interaktif ve batch Batch
Güncellemeler Çoklu Okuma Yazma Bir Kere Yaz, Çok Oku
Yapı Statik Şema Dinamik Şema
Bütünlük Yüksek Düşük
Ölçeklendirme  Doğrusal Değil Doğrusal

 

Yahoo'da Kullanım

2004: Hadoop'un ilk versiyonu Doug Cutting ve Mike Cafarella tarafından implemente edildi.
Aralık 2005: Hadoop aynı anda 20 makinede başarıyla çalıştı.
Ocak 2006: Doug Cutting Yahoo! katıldı.
Şubat 2006:  Apache Hadoop projesi resmen başladı. 
Şubat 2006: Yahoo! tarafından adapte edildi.
Nisan 2006: 188 makine üzerinde 47,9 saatte sıralamayı tamamladı(Makine başına 10GB).
Mayıs 2006: Yahoo! 300 makine ile Hadoop araştıma kümesini kurdu.
Kasım 2006: Araştırma kümesi 600 makineye ulaştı.
Ocak 2007: Araştırma kümesi 900 makineye ulaştı.
Nisan 2007: Araştırma kümesi ikiye bölünerek 1000 makineye ulaştı.
Nisan 2008: 900 makine ile sıralama ödülü kazanıldı. 1 terabyte veriyi 209 saniyede sıralaması tamamlandı.
Kasım 2008: Günlük 10 TB veri araştırma kümelerine yüklendi.
Mart 2009: Toplam 24.000 makine ile 17 kümeye ulaştı.
Nisan 2009: 500 GB veri 59 saniyede sıralandı. Toplam 1.400 makine ile test tamamlandı. 100 TB veri ise 173 dakikada tamamlandı(3.400 makine).

Hadoop Ekosistemi 

 

Avro

RPC çağrıları için dataların kolay taşınmasını sağlayan bir serileştirme sistemidir.

MapReduce

Ortak makinelerde, dağıtık bir mimari ile modelleme ve çalıştırma mimarisidir.

HDFS

Ortak makinelerde, dağıtık bir mimariye sahip dosya sistemidir.

Pig

Veri akışını kontrol eden ve büyük boyutlu verilerde işlem yapmayı kolaylaştıran bir araçtır. HDFS ve MapReduce kümelerinde çalışır.

Hive

Dağıtık yapılı bir veri ambarıdır. SQL benzeri bir dil sağlar.

HBase

Dağıtık temelli, kolon bazlı bir veritabanıdır.

ZooKeeper

İşlerin sürekli çalışır halde kalmasını sağlayan bir takip sistemidir.

Sqoop

Klasik veritabanı ile HDFS arasında toplu olarak veri transferi yapılmasını sağlayan bir araçtır.

Oozie

Bütün işleri zamanlamak için kullanılan bir araçtır.

Hadoop Nedir?


Merhaba, bu yazımda kısaca Hadoop'un ne olduğununda ve nerelerde kullanıldığınından bahsedeceğim.

Kelime Anlamıyla Hadoop

Projenin başındaki kişi Doug Cutting'e göre Hadoop kelimesi tamamen anlamsız,çocuğunun uydurduğu bir kelimeymiş. Oyuncak sarıfiline bu ismi vermiş. Doug beyde projeyi oluştururken ismini düşünmeye başlamış. Sonra çocuğunun sarıfili aklına gelmiş. İsim kriterlerine bakmış hiçbir anlam ifade etmemesi, kolay söylenmesi ve akılda kalıcı olması. Hepsi tutunca demişki bu projenin adı Hadoop olsun. Böylece bizim bildiğimiz Hadoop ortaya çıkmış.

İşlevsel Anlamda Hadoop


Hadoop, bir küme(cluster) mimarisidir. Yani sizin bir "A" işiniz var. "A" işini eski mimari ile tek makinede çalıştırısınız ve "X" sürede sonuç alırsınız. Oysa "A" işini küme mimarisi ile "N" kadar makinede aynı anda çalıştırabilirsiniz. Böylece "X/10","X/20" gibi sürelerde işi tamamlayabilirsiniz.
Hadoop'un tam tanımı aynı işi değişik makinelere dağıtarak işi en kısa sürede tamamlayabilmektir. Hadoop'un en önemli özelliklerinden biri ortak ve güvenilir olmayan makineler üzerinde çalışabilir. Eğer makinelerden biri çalışmazsa veya bir problem olursa işi bir sonraki makineye yönlendirir.
Hadoop'un iki ana bileşeni mevcuttur. MapReduce ve HDFS.

HDFS

HDFS kelime açılımı itibari ile Hadoop Distributed Filesystem'dir. Daha önce Google'ın geliştirdiği bir dosya yapısından kalıtım almıştır. HDFS, büyük boyutlu dosyaları oluşturmak için idealdir. Çünkü bir veri bloğu varsayılan olarak 64 MB'den oluşur. Oysa bizim kullandığımız NTFS sistemlerde bu 512 KB'dir. HDFS, küçük boyutlu dosyaları saklamak ve erişmek için çok kötü bir tercihtir.

MapReduce

MapReduce, Hadoop'un işi yapan kısmıdır. İki fonksiyonun birleşmesinden oluşur: Map ve Reduce. Map yani haritalandırma kısmı veriyi, anahtar-değer ilişikisine getirir. Reduce yani küçültme kısmı ise anahtar-değer haline gelmiş veri içerisinde verdiğiniz ilişkiye göre azaltarak istenilen sonucu üretir.

Hadoop'un Diğer Sistemler İle Karşılaştırılması


Geleneksel Veritabanı MapReduce
Veri Boyutu Gigabyte Seviyesinde Petabyte Seyivesinde
Erişim Interaktif ve batch Batch
Güncellemeler Çoklu Okuma Yazma Bir Kere Yaz, Çok Oku
Yapı Statik Şema Dinamik Şema
Bütünlük Yüksek Düşük
Ölçeklendirme  Doğrusal Değil Doğrusal

 

Yahoo'da Kullanım

2004: Hadoop'un ilk versiyonu Doug Cutting ve Mike Cafarella tarafından implemente edildi.
Aralık 2005: Hadoop aynı anda 20 makinede başarıyla çalıştı.
Ocak 2006: Doug Cutting Yahoo! katıldı.
Şubat 2006:  Apache Hadoop projesi resmen başladı. 
Şubat 2006: Yahoo! tarafından adapte edildi.
Nisan 2006: 188 makine üzerinde 47,9 saatte sıralamayı tamamladı(Makine başına 10GB).
Mayıs 2006: Yahoo! 300 makine ile Hadoop araştıma kümesini kurdu.
Kasım 2006: Araştırma kümesi 600 makineye ulaştı.
Ocak 2007: Araştırma kümesi 900 makineye ulaştı.
Nisan 2007: Araştırma kümesi ikiye bölünerek 1000 makineye ulaştı.
Nisan 2008: 900 makine ile sıralama ödülü kazanıldı. 1 terabyte veriyi 209 saniyede sıralaması tamamlandı.
Kasım 2008: Günlük 10 TB veri araştırma kümelerine yüklendi.
Mart 2009: Toplam 24.000 makine ile 17 kümeye ulaştı.
Nisan 2009: 500 GB veri 59 saniyede sıralandı. Toplam 1.400 makine ile test tamamlandı. 100 TB veri ise 173 dakikada tamamlandı(3.400 makine).

Hadoop Ekosistemi 

 

Avro

RPC çağrıları için dataların kolay taşınmasını sağlayan bir serileştirme sistemidir.

MapReduce

Ortak makinelerde, dağıtık bir mimari ile modelleme ve çalıştırma mimarisidir.

HDFS

Ortak makinelerde, dağıtık bir mimariye sahip dosya sistemidir.

Pig

Veri akışını kontrol eden ve büyük boyutlu verilerde işlem yapmayı kolaylaştıran bir araçtır. HDFS ve MapReduce kümelerinde çalışır.

Hive

Dağıtık yapılı bir veri ambarıdır. SQL benzeri bir dil sağlar.

HBase

Dağıtık temelli, kolon bazlı bir veritabanıdır.

ZooKeeper

İşlerin sürekli çalışır halde kalmasını sağlayan bir takip sistemidir.

Sqoop

Klasik veritabanı ile HDFS arasında toplu olarak veri transferi yapılmasını sağlayan bir araçtır.

Oozie

Bütün işleri zamanlamak için kullanılan bir araçtır.