Apache Hive Nedir?

Apache Hive, dağıtık dosya sistemlerinde petabayt seviyesindeki büyük veri setlerini okumayı, yazmayı ve yönetmeyi sağlayan SQL dili ile çok benzer biçimde interaktif sorgular yazabildiğimiz açık kaynak kodlu bir projedir.

Hadoop gibi dağıtık dosya sistemlerinde kayıtlı olan büyük verileri sorgulamak için kullanılıyor.
Alışık olduğumuz SQL sorgularını, Hive ile birlikte büyük verileri analiz etmek için yazabiliyoruz.

Hive ile yazılan sorgular aslında arkaplanda MapReduce komutlarına çevriliyorlar. Ancak iç içe onlarca sub-query(alt sorgu)’nin olduğu bir sorguda MapReduce ile sorgu yapmak oldukça güçleşecektir.MapReduce her ne kadar Hive’a göre daha güçlü bir kontrol sağlasa da Hive, SQL ile çok benzeyen sorgu dili ile hadoop ve diğer dağıtık dosya sistemlerini kullanan geliştiriciler için oldukça kolaylık sağlıyor.
Biraz Hive’ın sorgu biçimi inceleyim.
Hive’ın Select deyiminin yazım biçimini şu şekildedir;

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number]

Eğer daha önce SQL kullandıysanız muhtemelen bu tarz bir sorguya aşinasınız. Ama ben yine de biraz açıklamak istiyorum.

  • SELECT, SQL’deki projeksiyon operatörüdür.
  • SELECT, FROM yan tümcesi tarafından belirtilen tabloyu tarar
  • WHERE, neyin filtreleneceğini belirtir
  • GROUP BY, kayıtların nasıl toplanacağını belirten sütunların bir listesini verir
  • CLUSTER BY, DISTRIBUTE BY, SORT BY sıralama düzenini ve algoritmasını belirtin.
  • LIMIT kaç adet kayıt alınacağını belirtir

Gördüğünüz gibi tıpkı SQL de olduğu gibi Hive’da bu şekilde kullanılarak büyük verileri rahatlıkla analiz etmeye yardımcı oluyor.

Hive’ın MapReduce ile farklı olarak sağladığı kolaylıktan biraz bahsedecek olursak,
Hive’da çeşitli tool’lar(araçlar) kullanarak Şema(Hive Shema) oluşturabiliyoruz. Şema mantığı aslında klasik SQL sorguları ile oluşturduğumuz tablo mantığı gibidir. Kolon isinleri ve veri tipleri ile oluşturulan tablolar, Hive’da da şema şeklinde oluşturuluyor. Hive ile belirli formattaki dosyaların(.csv, json vs.), metadataları içerisine girerek tablo gibi tanımlayabiliyoruz.
Bir örnek ile kavramaya çalışalım;

{
    “İsim": "Gülcan",
    "Soyisim": "Ertop",
    “Öğrenci_Bilgileri”: {
        “Id": 1234,
        “Bölüm": Yazılım Mühendisliği,
         “Sinif": “4"
    }
}

şeklinde bir örnek JSON dökümanımız olsun. İsmini de ogrenci.json verelim.
Buradaki verileri Hive’ı kullanarak tablo haline getirelim:

CREATE TABLE json_ogrenci_tablo ( json string );
 
LOAD DATA LOCAL INPATH  '/tmp/ogrenci.json' INTO TABLE json_ogrenci_tablo;

Biçimide bir sorgu query ile json dosyasının içeriğini json_ogrenci_tablo isimli bir tablo yaratıp aktarmış olduk.

Bu tablodaki her bir objeyi sorgulamak için Hive’da çeşitli yöntemler mevcut, bunlardan ilki olan get_json_object ile bir sorgu yazmayı deneyelim.

select get_json_object(json_ogrenci_tablo.json, '$.İsim') as Isim, 
       get_json_object(json_ogrenci_tablo.json, '$.Soyisim') as Soyisim,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Id') as Oid,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Bölüm') as Obolum,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Sinif') as Osinif
from json_table;

Bu sorgudan elde edilen sonuç şu şekildedir:

IsimSoyisimOidObolumOsinif
GülcanErtop200901Yazılım Mühendisliği4

Tıpkı get_json_object gibi json_tuple,json-serde gibi fonksiyonlarını kullanarakta sorgular yazabiliriz.
Bunları ileriki yazılarımda örnekleyerek açıklamaya çalışacağım.

 

MapReduce Nedir?

MapReduce tanım olarak büyük verilerin işlendiği programlama yapısı olarak açıklanabilir.

Örnekler vererek, kümülatif bir şekilde MapReduce’u kavrayalım.

Önce elimizde büyük veri olmadığını ve oldukça ufak bir müşteri bilgi sistemi geliştirdiğimizi düşünelim.

Bu ufak sistemin veritabanında yalnızca 100 müşterinin bazı bilgileri olsun. Bu bilgiler,
TC Kimlik Numarası, Ad, Soyad, Yaş alanları olsun.
Biz bu 100 kişi içinden soyadları ‘Yıldırım’ olan kişilerin içindeki en genç müşteriyi bulmak istesek

SELECT MIN(yas) FROM müsteri WHERE soyad=‘Yıldırım’

şeklinde bir SQL sorgusu ile sonuca rahatça ulaşabiliriz.

Peki, ya bu 100 kişilik sistem yerine, Türkiye’de yaşayan tüm insanlar olarak değiştirseydik?

Hatta veritabanındaki alanlara nüfus bilgisi, adres, telefon, meslek, gelir durumu, kullandıkları kredi kartları bilgileri,sipariş durumu, eğitim durumu alanları ekleseydik?
Daha sonra, soyadı ‘Yıldırım’, eğitim durumu ‘Üniversite’ olan insanların sayılarını bulmak istesek ne yapardık?

Düşündüğünüz gibi, oldukça büyük bir veri ile karşı karşıyayız ve klasik SQL sorgularını kullanarak bu analizi yapmak bir hayli uzun zaman alacaktır.

Bu durumda devreye MapReduce giriyor. Bu denli büyük verilerin onlarca sunucu(cluster) üzerinde dağıtık olarak kayıtlandığını düşünelim.(Bu sistemi Hadoop yazımı inceleyerek kavrayabilirsiniz)

  • MapReduce her bir clusterdaki verileri dolaşarak istediğimiz analizi hızlı ve etkin şekilde yapabilmemize imkan sağlıyor.

Yazılışı çeşitli dökümanlarda birleşik gibi görünsede Map-Reduce aslında Map(Mapping) ve Reduce(Reducing) iki ayrı işlemdir, bir arada çalışarak dağıtık dosya sistemlerinde veri analizinin oldukça kolaylaştırılmasını sağlayan methodlardır.

Map, bir listedeki her bir elemana tek tek bir kuralı uygular.
Reduce, Map ile elde edilen sonuçları belli bir sistematik ile analiz ederek birleştirir.
Yaptığı analiz sonunda da bir değer döndürür.

Çok basit bir örnek ile zihnimizde canlandıralım;

Elimizde bir küme olduğunu düşünelim. Bu kümenin her bir elemanına 5 ekleyelim.
5 eklediğimiz kümenin içindeki çift sayıların toplamını alacağımızı varsayalım.

Bu listenin her bir elemanına 5 ile toplama işlemini içeren bir fonksiyon uygulayacağız.

Bu işlem sonucu ikinci veri kümesini elde ettik. Her bir elemana aynı fonksiyonu uyguladı ve hepsinin ayrı ayrı değeri değişti.
Bu işlem Map leme işlemi olarak düşünülebilir, çalışma mantığı bu şekildedir.

Şimdi bu değerlerin içindeki çift sayıların toplamını alalım alalım.

Bu işlem de Reduce işlemi olarak düşünülebilir.
Gördüğünüz üzere başta 5 elemanlı bir veri kümesi iken, Reduce işlemi sonucu output olarak yalnızca bir değer elde ettik.

Map’leme işlemi, dağıtık halde bulunan sunucu disklerindeki (clusters) verilere, clusterların her birinin nerelerde olduğunu önemsemeksizin belli bir fonksiyonu o verilere uygular. Ve her bir cluster mapleme işlemi sonucu elde ettiği veriyi kendi diski üzerinde tutar. Daha sonra Reduce işlemi her bir clusterdaki Map’lenmiş verileri alır ve belli bir kurala göre (bizim belirleyeceğimiz yönteme göre) analiz eder ve analiz edilmiş veriyi çıktı olarak verir. Örnekten de anlaşılabileceği gibi Map işleminde ilk işleme alınan kümenin eleman sayıları aynı kalırken, Reduce işlemi analiz sonucu bir çıktı vermektedir.

Özet olarak, büyük verileri işleyebilmek için pahalı donanımlar satın almak yerine, bir veya birden fazla sıradan sunuculardan oluşan bir sistemde MapReduce ile aynı işlemi hızlı ve efektif bir biçimde uygulayabilirsiniz.

Günümüzde bu yapıyı, dağıtık dosya sistemi ile çalışan (Google,Facebook, Yahoo gibi.)bir çok büyük firma kullanmaktadır.

Hadoop Kurulumu

Hadoop’un ne işe yaradığından önceki yazımda sizlere bahsetmiştim. Bugün Hadoop nasıl kurulur, bununla alakalı bilgi vermek istiyorum.

Öncelikle Hadoop, GNU / Linux platformu tarafından desteklenmektedir. Bu sebeple, Hadoop ortamını kurmak için bir Linux işletim sistemine ihtiyacımız var. Linux dışındaki bir işletim sisteminiz varsa, bir Virtualbox yazılımı yükleyebilir ve Linux’u Virtualbox’ın içine kurabilirsiniz.

Ön kurulum:

Başlangıçta, Hadoop dosya sistemini Unix dosya sisteminden ayırmak için Hadoop’a ait ayrı bir kullanıcı yaratmanızı öneririm. Bu sayede karmaşanın önüne geçmiş olacaksınız.

Bir kullanıcı oluşturmak için şu adımları uygulayın:

  • ”Su” komutunu kullanarak kök dizini açın.
  • ”Useradd kullanıcı adı” komutunu kullanarak kök hesabından bir kullanıcı oluşturun.
  • Artık “su kullanıcı adı” komutunu kullanarak mevcut bir kullanıcı hesabını açabilirsiniz.

Terminali açıp,aşağıdaki komutları yazalım,

$ su 
   password: 
# useradd hadoop  
# passwd hadoop 
   New passwd: 
   Retype new passwd 

“hadoop” yazan yerleri kendinize uygun biçimde değiştirebilirsiniz.
Ve işte yeni bir kullanıcı yaratmış oldunuz!


SSH Kurulumu ve Anahtar Üretimi

SSH kurulumu, cluster üzerinde başlatma, durdurma işlemleri gibi farklı işlemleri yapmak için gereklidir.
Anahtar üretimi de farklı Hadoop kullanıcılarını doğrulamak için gereklidir.
Hadoop kullanıcıları için ortak veya özel anahtar çifti oluşturulmalıdır. Bu anahtarlar kullanıcılar arasında paylaşılabilir.
Hadoop node’larının yönetilmesi için SSH erişimini ve anahtar üretimini aşağıdaki komutları yazarak sağlamamız gerekiyor.

$ ssh-keygen -t rsa 
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
$ chmod 0600 ~/.ssh/authorized_keys 
</pre

Java Kurulumu

Hadoop kurulumu için sisteminizde olması gerekenlerden biri de Java’dır. Java’nın bilgisayarınızda kurulu olup olmadığını anlamak için “java -version” komutunu kullanabilirsiniz.
$ java -version

Eğer Java kurulu ise, size kurulu olan version bilgisini görüntülenecektir.

java version "1.7.0_71" 
Java(TM) SE Runtime Environment (build 1.7.0_71-b13) 
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode) 

Eğer Java yüklü değilse aşağıdaki adımları izleyerek kurmanız gerekiyor.

Adım 1:

Öncelikle bu siteye girin, ve sizin işletim sisteminize uygun olan ve uzantısı tar.gz olan dosyayı indirin

http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

Adım 2:

İndirdiğiniz bu dosyayı genelde indirilenler klasörünüzde bulacaksınız. tar.gz şeklindeki zipli bu dosyayı aşağıdaki komutlar ile ziptek çıkartalım.

$ cd Downloads/ 
$ ls 
jdk-7u71-linux-x64.gz 
$ tar zxf jdk-7u71-linux-x64.gz 
$ ls 
jdk1.7.0_71   jdk-7u71-linux-x64.gz 

Adım 3:
Java’yı rahat kullanabilmek için “/usr/local”konumuna taşıyalım. Bunun için kök dizini açıp aşağıdaki komutları yazmalıyız.

$ su 
password: 
# mv jdk1.7.0_71 /usr/local/ 
# exit 

Adım 4:
Şimdi de ~/.bashrc dosyasını açıp JAVA_HOME isimli değişkeni oluşturarak java’nın kurulu olduğu PATH‘i içerisine yazağız. Bu sayede Java’ya erişimimiz kolaylaşmış olacak.
~/.bashrc dosyasını açmak için vim ya da nano gibi metin düzenleyicileri kullanabilirsiniz kullanabilirsiniz. (Eğer bunlar yüklü değilse veya kullanmayı bilmiyorsanız not defteri’nde de düzenleyebilirsiniz)
Ben vim kullanarak açıyorum.

$ vim ~/.bashrc

Açılan doyaya şu komutları kopyalayıp yapıştırıyoruz:

export JAVA_HOME=/usr/local/jdk1.7.0_71 
export PATH=$PATH:$JAVA_HOME/bin 

Sonrasında ESC basıyoruz ve :wq yazıyoruz. Vim’den çıkmış olduk.

Şimdi tüm değişiklikleri geçerli çalışan sisteme uygulamak için aşağıdaki komutu yazın.

$ source ~/.bashrc

Şimdi java -version komutunu tekrar deneyin. Şuan yukarıda yazdığım gibi bir çıktı görüntülemiş olmanız gerekiyor.

Hadoop Kurulumu
Eveeet… Her şey hazırsa hadoop kurulumuna başlayabiliriz.
Aşağıdaki komutları kullanarak hadoop’un istediğiniz sürümünü indirebilirsiniz. Ben 2.7.4 versiyonunu kurdum

$ su 
password: 
# cd /usr/local 
# wget http://apache.claz.org/hadoop/common/hadoop-2.7.4/ 
hadoop-2.7.4.tar.gz 
# tar xzf hadoop-2.7.4.tar.gz 
# mv hadoop-2.7.4/* to hadoop/ 
# exit 

NOT: wget Linux/UNIX komut satırı dosya indirme aracıdır. Eğer wget’e sahip değilseniz ‘Homebrew’ paket yöneticisini kullanarak edinebilirsiniz. (Homebrew kurulumu,
wget kurulumu)

Hadoop Çalışma Modları

Hadoop’u indirdikten sonra, Hadoop cluster’ını desteklenen üç moddan birinde çalıştırabilirsiniz, bunları ihtiyacınıza hangisi uygun olacaksa o şekilde seçin.

1-)Yerel / Bağımsız Mod (Local/Standalone Mode): Sisteminizde Hadoop indirildikten sonra, varsayılan olarak tek başına bir modda yapılandırılır ve tek bir java işlemi olarak çalıştırılabilir.

2-)Pseudo Dağıtılmış Mod (Pseudo Distributed Mode): Tek makinede dağıtılmış bir simülasyon. Hdfs, Yarn, MapReduce vb. Gibi her Hadoop hizmet programı ayrı bir java işlemi olarak çalışacaktır. Bu mod geliştirme için yararlıdır.

3-)Tam Dağılımlı Mod (Fully Distributed Mode ): Bu mod, cluster olarak en az iki veya daha fazla makineye tamamen dağıtılır.

Ben ilk iki modun kurulumunu sizlere anlatacağım.

Yerel / Bağımsız Mod’da Hadoop Kurulumu:

Bu kurulum sağlandığında hadoop tek bir JVM(Java Virtual Machine)’de çalışır. Bağımsız Mod, MapReduce programlarını geliştirme sırasında çalıştırmak için uygundur. Tek JVM ile çalıştığı için test etmek ve hata ayıklamak kolaydır.

Hadoop’u kurma:
Az önce yukarıda JAVA_HOME için ~/.bashrc dosyasında değişiklikler yapmıştık. Aynı işlemi vim ile ~/.bashrc dosyasını açıp, HADOOP_HOME değişkenine hadoop’un PATH’ini aşağıdaki gibi yazıyoruz.

export HADOOP_HOME=/usr/local/hadoop 

Metin düzenleyicinizi kapattıktan sonra tüm değişiklikleri geçerli çalışan sisteme source komutu ile uygulayın.

$ source ~/.bashrc 

Devam etmeden önce, Hadoop’un düzgün çalıştığından emin olalım. Sadece aşağıdaki komutu çalıştırın:

$ hadoop version 

Kurulumda her şey yolunda giderse şu şekilde bir sonuç karşınıza çıkacak:

Hadoop 2.7.4 
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768 
Compiled by hortonmu on 2017-11-06T06:28Z 
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4 

Bu çıktı, bağımsız modda kurulum işleminin tamamlandığı anlamına gelir. Şuan varsayılan olarak, Hadoop tek bir makinede dağınık olmayan bir modda çalışacak şekilde yapılandırılmıştır.

Pseudo Dağıtılmış Mod’da Hadoop Kurulumu:

Gelelim diğer yöntem olan Pseudo Dağıtılmış Mod’a.
Bu modda kurulan Hadoop, tek bir makinede birden fazla makine varmış gibi simüle ederek, sahte sağıtılmış modda çalışır.

Hadoop Kurulum:

~/.bashrc dosyasına aşağıdaki komutları ekleyerek Hadoop ortam değişkenlerini ayarlayabilirsiniz.

export HADOOP_HOME=/usr/local/hadoop 
export HADOOP_MAPRED_HOME=$HADOOP_HOME 
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export YARN_HOME=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 
export HADOOP_INSTALL=$HADOOP_HOME

Şimdi tüm değişiklikleri geçerli çalışan sisteme uygulayın.

$ source ~/.bashrc 

Hadoop Yapıladırması(Hadoop Configuration)

Hadoop’ın bütün yapılandırma dosyaları
“$ HADOOP_HOME / etc / hadoop” dizinindedir.
Bu yapılandırma dosyalarında, Hadoop altyapınıza göre değişiklik yapmamız gerekiyor.

$ cd $HADOOP_HOME/etc/hadoop

Hadoop programlarını java’da geliştirmek için hadoop-env.sh dosyasındaki java ortam değişkenlerini JAVA_HOME değerini sisteminizdeki java konumuyla değiştirerek sıfırlamanız gerekir.

Bunun için yine vim kullanarak hadoop-env.sh dosyasını açıyoruz.

$ vim hadoop-env.sh

içerisine aşağıdaki kodu ekliyoruz.

 export JAVA_HOME=/usr/local/jdk1.7.0_71

Not: jdk1.7.0_71 sizin sisteminizde kurduğunuz sürüme göre değişkenlik gösterebilir.

Hadoop’u yapılandırmak için bir kaç tane dosyayı daha düzenlememiz gerekiyor.
İlk olarak core-site.xml dosyasını vim ile açıyoruz ve tagları arasına aşağıdakileri ekliyoruz. Ve kaydedip çıkıyoruz.

<configuration>

   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value> 
   </property>
 
</configuration>

Sıradaki yapılandıracağımız dosya: hdfs-site.xml.
Hdfs-site.xml dosyası, yerel dosya sisteminizin çoğaltma verisinin, namenode yolunun ve datanode yollarının değeri gibi bilgileri içerir.(namenode ve datanode hakkında hadoop yazımda bilgi vermiştim, oradan öğrenebilirsiniz)
Bu dosyadaki değişikliklerin amacı, Hadoop altyapısını depolamak istediğiniz yeri göstermektir.
Dosyayı açalım ve aşağıdaki kodları tagları arasına yapıştıralım.

<configuration>

   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
    
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode </value>
   </property>
    
   <property>
      <name>dfs.data.dir</name> 
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode </value> 
   </property>
       
</configuration>

Not: Yukarıdaki dosyada, tüm pathler kullanıcı tanımlıdır ve Hadoop altyapınıza göre değişiklik yapabilirsiniz.

Sırada yarn-site.xml yapılandırması var,
Yarn nedir diyecek olursanız, onu ayrıntılı açıklarım ama kısaca dağıtık sistemlerde kullanılan bir paket yöneticisi olduğunu bilmenizde fayda var.
yarn-site.xml dosyasını da bir öncekiler gibi yapılandıralım ve kaydedelim.

<configuration>
 
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value> 
   </property>
  
</configuration>

Son yapılandırılacak dosya olan mapred-site.xml ‘de sıra.
mapred-site.xml dosyası, hangi MapReduce frameworkünü kullandığımızı belirlemek için kullanılır.
Varsayılan olarak, Hadoop, bir yarn-site.xml şablonunu içerir. Her şeyden önce dosyayı sizdeki mapred-site.xml.template dosyasını koypalayıp ismini mapred-site.xml olarak verin. Bunun için aşağıdakileri yazın:
$ cp mapred-site.xml.template mapred-site.xml

Daha sonra mapred-site.xml dosyasını açın ve tagları arasınaaşağıdakileri yapıştırın. Ardından kaydedin.

<configuration>
 
   <property> 
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
   
</configuration>

Kurulumumuz nihayet burada bitiyor!
Son bir adım kaldı. O da Kurulumun doğrulanması. Çalışıp çalışmadığını anlamak için aşağıdaki adımları uygulayalım.

Hadoop Kurulum Doğrulama
Adım 1: Name-node Ayarı
Aşağıdaki komutları yazın.

$ cd ~ 
$ hdfs namenode -format 

Şu şekilde bir çıktı göreceksiniz:

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************ 
STARTUP_MSG: Starting NameNode 
STARTUP_MSG:   host = localhost/192.168.1.11 
STARTUP_MSG:   args = [-format] 
STARTUP_MSG:   version = 2.4.1 
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory 
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted. 
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to 
retain 1 images with txid >= 0 
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0 
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************ 
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11 
************************************************************/

Adım 2: Hadoop dfs Doğrulama
Aşağıdaki komut, dfs’yi başlatmak için kullanılır. Bu komutu çalıştırdığımızda, Hadoop dosya sistemimiz başlayacaktır.

$ start-dfs.sh 

Beklenen çıktı şu şekildedir:

10/24/14 21:37:56 
Starting namenodes on [localhost] 
localhost: starting namenode, logging to /home/hadoop/hadoop
2.4.1/logs/hadoop-hadoop-namenode-localhost.out 
localhost: starting datanode, logging to /home/hadoop/hadoop
2.4.1/logs/hadoop-hadoop-datanode-localhost.out 
Starting secondary namenodes [0.0.0.0]

Adım 3: Yarn Script Doğrulama
yarn’ı çalıştırmak için kullanacağımız komut:

$ start-yarn.sh 

Beklenen çıktı:

starting yarn daemons 
starting resourcemanager, logging to /home/hadoop/hadoop
2.4.1/logs/yarn-hadoop-resourcemanager-localhost.out 
localhost: starting nodemanager, logging to /home/hadoop/hadoop
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out 

Adım 4: Tarayıcınızdan Hadoop’a Bağlanma
Hadoop’a erişmek için varsayılan port numarası 50070‘dir. Tarayıcınızda Hadoop hizmetleri almak için aşağıdaki URL’yi kullanın.

http://localhost:50070/

Böyle bir ekran sizi karşılayacak.

Adım 5: Cluster için tüm uygulamaları doğrulayın

Clusterlardaki tüm uygulamalara erişmek için varsayılan port numarası 8088’dir. Bu porta aşağıdaki adresi tarayıcınıza yazarak erişebilirsiniz.

http://localhost:8088/

Yukarıdaki gibi bir ekran ile karşılaşacaksınız.
Buradan clusterlarınızdaki tüm uygulamalarınızı kontrol edebilirsiniz.

Hadoop kurulumu ile ilgili öğretici dökümanın sonuna geldik. Umarım faydalı olmuştur. Herkese iyi çalışmalar dilerim.

Hadoop Nedir?

Hadoop Nedir?

Önceki yazımda Big Data ve bunların işlenmesi ile alakalı teknolojilerden bahsetmiştim.

Bu yazımda Hadoop’un ne olduğundan bahsedeceğim.

Bildiğiniz gibi Big Data, büyük ölçekli verilerin oluşturduğu veri setlerine (Data Set) verilen isim ve biz bu büyük veri setlerini kaydetmek ve işlemek için çeşitli dosya sistemleri ve veritabanları kullanıyoruz.

Hadoop da büyük veri setleri ile birden fazla makinede paralel olarak işlem yapmamızı, verileri kaydetmemizi ve yönetmemizi sağlayan, MapReduce özelliklerini bir araya getiren, Java ile yazılmış açık kaynak kodlu kütüphanedir.

Hadoop içinde büyük verileri sakladığımız bileşene HDFS (Hadoop Distributed File System) denir.

HDFS nedir?
Açılımı Hadoop Distributed File System

yani Türkçesi ile Hadoop Dağıtık Dosya Sistemi.

Peki ne için böyle bir sisteme ihtiyaç duyulmuş?
Petabyte seviyesindeki büyük verileri saklamak için pahalı bir donanım satın almak yerine sıradan sunucuların disklerini bir araya getirerek büyük, tek bir sanal disk oluştururlar. Bu sunucu disklerine Cluster adı verilmektedir. Clusterların her biri aynı yerde durmak durumunda değildirler, farklı bölgelerde, farklı şehirlerde hatta farklı ülkelerde aynı sisteme hizmet edebilirler.

HDFS içine büyük boyuttaki veriler kopyalandıktan sonra bir çok kaynak üzerinden aynı anda ve oldukça hızlı erişim sağlanabilir. Bu dosya sistemi içinde büyük veriler küçük dosya blokları halinde saklanırlar.

HDFS, NameNode ve DataNode olarak iki ayrı süreçten oluşur.

NameNode, master(ana) düğümdür. Verilerin bloklar halinde parçalanarak dağıtıldığını düşünürsek bu parçaların her birinin diğer makinelere DataNode) dağılımından, yaratılmasından, silinmesinden, yeniden oluşturulmasından sorumlu düğümdür. (Serverlar arasındaki configürasyonu sağlayan ana makine)

DataNode, slave(işçi) düğümdür. Ona verilen blockları kendi yerel diskinde saklamaktan sorumludur. İlave olarak diğer DataNode’lardaki verilerin yedeklerini de saklayabilirler. Bir HDFS sistemde birden fazla olabilirler.

Şu görsel ile anladıklarımızı güçlendirelim;

Gelelim yukarıda bahsettiğimiz MapReduce’a,
MapReduce ise HDFS üzerindeki büyük verileri işleyebilmek amacıyla kullanılan bir yöntemdir. Bu yöntemin içeriğine bu linke tıklayarak ulaşabilirsiniz.

Hadoop şuanda Facebook, Twitter, Yahoo, Alibaba, EBay, Adobe()BURAYA LİNKİ VER ve daha bir çok bilindik firmada büyük verileri analiz etmek amacı ile kullanılıyor.

Bunların yanısıra Hadoop projesi büyük verileri işlemek için başka projelere bir çatı görevi görüyor. Bu projelerden bazıları, Hive, Mahout, Cassandra, Pig, Zookeper.

Büyük veri nedir? Ne işe yarar?

Yazılım Mühendisliği’nde 3.sınıfı bitirdikten sonra, bitirme tezi konusu bulma telaşım başladı. Uzun yıllardır veritabanı alanına ilgi duyuyordum ve tabiri caizse bu ilgimi daha da “büyütmek” istedim! 🙂

Nedir bu Büyük Veri (Big Data) ve Büyük Veri setleri ile neler yapılabilir? Diye araştırmaya başladım.

Basit bir ifadeyle Büyük Veri, düzenli veya düzensiz biçimde, hızla büyüyen ve depolanan büyük hacimli veriler olarak ifade edilebilir.

Zihninizde rahat canlandırabilmek için söyle düşünün,

Her gün saatlerce sosyal medya platformlarını kullanıyoruz. Örneğin Facebook’u ele alalım.
Bu platform 200 milyondan fazla aktif kullanıcıya sahip ve her birimiz her gün durum, resim, video vs. paylaşabiliyoruz. Ve bu paylaşımları yıllarca sürdürebiliyoruz. Yani sürekli veri üretiyoruz.
Facebook’un günde 20 TB dan fazla veri ürettiğini düşünelim.

Peki bu kadar fazla veri nasıl işlenir ve ihtiyaç durumunda bu verilere nasıl erişilebilir?

Facebook milyonlarca kullanıcısının verilerini Hadoop Distributed File System – HDFS (Hadoop Dağıtık Dosya Sistemi) üzerinde tutuyor, veritabanı olarakta Hive ve Casandra isimli veritabanlarını kullanıyor.

Bu teknolojilere daha sonra değineceğim ancak kısaca bahsetmek gerekirse, her geçen gün hızla üretilen bu verileri kaydetmek için yüksek hacimli veritabanlarına ihtiyaç var çünkü bu kadar fazla verinin içinde klasik SQL sorguları ile işlem yapmak çok zor hatta imkansızdır. Büyük verileri işlemek için ancak ona uygun bir platform olması gerekir. Hive ve Casandra veritabanı sistemleri, Facebook için bu noktada işleme giriyor. Facebook’ta bizlerin ürettiği bu büyük datayı Hive ve Casandra veritabanlarında saklıyor.

Tıpkı Facebook gibi, Google, Twitter, Instagram, Linkedin, Amazon gibi siteler de her gün büyük veri üretir ve bu verileri işlemek için çeşitli teknolojileri kullanır.

Google, klasik büyük veri işleme yöntemlerini kullanmak yerine kendisinin geliştirdiği teknolojiyi kullanıyor. Milyarlarca internet sayfasının verisini Google File System üzerinde tutuyor, veritabanı olarakta Big Table kullanıyor. Oluşan bu büyük veriyi işlemek içinse MapReduce kullanıyor. Bu teknolojilerin her biri düşük maliyetli ve binlerce bilgisayarın bir araya gelerek oluşturduğu bir sistem şeklinde çalışıyor.

Bu tarzda kendilerine has teknolojiler üreten firmalardan esinlenerek bir çok proje geliştirilmiştir ve hala geliştirilmektedir. Bunlara en güzel örnek, Apache projeleri olarak geliştirilen Lucene, Solr, Hadoop, HBase projelerdir. Bu teknolojileri örnekler ile çoğaltmak mümkün elbette.

Gelelim elde edilen bu büyük veri setleri ile neler yapılabileceğine;

Büyük veriler analiz edilerek,

  • Sisteminizle alakalı karar alırken daha seri ve stratejik olmak için size yol gösterebilir,
  • Gerçek zamanlı hata ve problemlerin temel sebeplerini belirleyebilir,
  • Müşterilerin satın alma alışkanlıklarını analiz ederek satış amaçlı kampanyalar üretmenize olanak sağlar,
  • Risk hesaplamayı çok daha kolay ve mümkün hale getirebilirsiniz.


Büyük Veri Analizi ile neler yapılabileceğini bir örnekle zihnimizde canlandırmaya çalışalım;

Öncelikle büyük veri üreten bir sistem hayal edelim.

Örneğin, milyonlarca müşterinin talep ve şikayetlerini paylaştıkları global bir ‘Şikayet Websitesi’ olsun.
Bir de bu sitede paylaşılan istek ve şikayetleri dikkate alıp müşterileri için hizmet kalitesini arttırmak isteyen global bir banka olduğunu düşünelim.

Eskiden bankaların, pazarlama ve ürün geliştirme departmanlarının,
müşteriye yönelik yeni kampanya stratejileri geliştirebilmesi için müşteri ile ilgili sınırlı bilgilere erişimleri, müşteri ihtiyaçlarını, hesap hareketlerinin takibini ve segmentasyonları vs. inceleyerek geleneksel yöntemlerle analiz etmesi ve her birini tek tek inceleyip çıkarım yapması gerekirdir.

Ancak şimdi bu banka Büyük Veri Analizi yardımı ile bahsi geçen şikayet sitesindeki şikayetleri belli kurallara göre, kelime bazında filtreleyip işleyerek, müşterilerinin nelerden şikayetçi olduğunu, bu sistem sayesinde binlerce müşteriden feedback alarak öğrenebilir durumda. Bu bilgiler ışığında yeni bir ürün veya hizmet geliştirerek, mevcut müşteri memnuniyetini arttırırken, müşterisi olmayan kişileri de nasıl potansiyel müşteri haline getirebileceklerini analiz edebiliyorlar. Hem de çok daha kısa bir sürede ve daha az efor sarf ederek!

Bu ve bunun gibi örnekleri çoğaltabiliriz. Büyük Veri’nin kullanım alanları gün geçtikçe artıyor, her geçen gün yeni bir teknoloji ile karşılaşıyoruz. Zamanı geldikçe Büyük veri ile ilgili farklı teknolojilerden bahsetmeye devam edeceğim.

Hayallerinize erişmek için parmaklarınızı kullanın, kız gibi kodlayın!

Apache Hive Nedir?

Apache Hive, dağıtık dosya sistemlerinde petabayt seviyesindeki büyük veri setlerini okumayı, yazmayı ve yönetmeyi sağlayan SQL dili ile çok benzer biçimde interaktif sorgular yazabildiğimiz açık kaynak kodlu bir projedir.

Hadoop gibi dağıtık dosya sistemlerinde kayıtlı olan büyük verileri sorgulamak için kullanılıyor.
Alışık olduğumuz SQL sorgularını, Hive ile birlikte büyük verileri analiz etmek için yazabiliyoruz.

Hive ile yazılan sorgular aslında arkaplanda MapReduce komutlarına çevriliyorlar. Ancak iç içe onlarca sub-query(alt sorgu)’nin olduğu bir sorguda MapReduce ile sorgu yapmak oldukça güçleşecektir.MapReduce her ne kadar Hive’a göre daha güçlü bir kontrol sağlasa da Hive, SQL ile çok benzeyen sorgu dili ile hadoop ve diğer dağıtık dosya sistemlerini kullanan geliştiriciler için oldukça kolaylık sağlıyor.
Biraz Hive’ın sorgu biçimi inceleyim.
Hive’ın Select deyiminin yazım biçimini şu şekildedir;

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number]

Eğer daha önce SQL kullandıysanız muhtemelen bu tarz bir sorguya aşinasınız. Ama ben yine de biraz açıklamak istiyorum.

  • SELECT, SQL’deki projeksiyon operatörüdür.
  • SELECT, FROM yan tümcesi tarafından belirtilen tabloyu tarar
  • WHERE, neyin filtreleneceğini belirtir
  • GROUP BY, kayıtların nasıl toplanacağını belirten sütunların bir listesini verir
  • CLUSTER BY, DISTRIBUTE BY, SORT BY sıralama düzenini ve algoritmasını belirtin.
  • LIMIT kaç adet kayıt alınacağını belirtir

Gördüğünüz gibi tıpkı SQL de olduğu gibi Hive’da bu şekilde kullanılarak büyük verileri rahatlıkla analiz etmeye yardımcı oluyor.

Hive’ın MapReduce ile farklı olarak sağladığı kolaylıktan biraz bahsedecek olursak,
Hive’da çeşitli tool’lar(araçlar) kullanarak Şema(Hive Shema) oluşturabiliyoruz. Şema mantığı aslında klasik SQL sorguları ile oluşturduğumuz tablo mantığı gibidir. Kolon isinleri ve veri tipleri ile oluşturulan tablolar, Hive’da da şema şeklinde oluşturuluyor. Hive ile belirli formattaki dosyaların(.csv, json vs.), metadataları içerisine girerek tablo gibi tanımlayabiliyoruz.
Bir örnek ile kavramaya çalışalım;

{
    “İsim": "Gülcan",
    "Soyisim": "Ertop",
    “Öğrenci_Bilgileri”: {
        “Id": 1234,
        “Bölüm": Yazılım Mühendisliği,
         “Sinif": “4"
    }
}

şeklinde bir örnek JSON dökümanımız olsun. İsmini de ogrenci.json verelim.
Buradaki verileri Hive’ı kullanarak tablo haline getirelim:

CREATE TABLE json_ogrenci_tablo ( json string );
 
LOAD DATA LOCAL INPATH  '/tmp/ogrenci.json' INTO TABLE json_ogrenci_tablo;

Biçimide bir sorgu query ile json dosyasının içeriğini json_ogrenci_tablo isimli bir tablo yaratıp aktarmış olduk.

Bu tablodaki her bir objeyi sorgulamak için Hive’da çeşitli yöntemler mevcut, bunlardan ilki olan get_json_object ile bir sorgu yazmayı deneyelim.

select get_json_object(json_ogrenci_tablo.json, '$.İsim') as Isim, 
       get_json_object(json_ogrenci_tablo.json, '$.Soyisim') as Soyisim,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Id') as Oid,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Bölüm') as Obolum,
       get_json_object(json_ogrenci_tablo.json, '$.Öğrenci_Bilgileri.Sinif') as Osinif
from json_table;

Bu sorgudan elde edilen sonuç şu şekildedir:

Isim    Soyisim  Oid    Obolum  Osinif
Gülcan  Ertop    200901 Yazılım Mühendisliği4

Tıpkı get_json_object gibi json_tuple,json-serde gibi fonksiyonlarını kullanarakta sorgular yazabiliriz.
Bunları ileriki yazılarımda örnekleyerek açıklamaya çalışacağım.

 

Ben, Yazılım Mühendisliği son sınıf öğrencisi bir adet Gülcan!

Yazılım alanı ile ilk tanışmam 15 yaşında başladı. İlk yazdığım uygulama elbette hesap makinesiydi. Evet şimdi düşününce basit geliyor gerçekten ama yazdığım uygulamayı ilk çalıştırdığımdaki hissi keşke buraya yazabilsem.

Şimdilerde 23 yaşlarında bir yazılım mühendisi adayıyım.

Ne için bu sitenin ismi böyle diye düşünebilir, belki de fazla cinsiyetçi olduğumu zannedebilirsiniz. Ancak doğrusunu söylemek gerekirse, çıkış noktam;

“Yazılım sektöründeki kadınların oldukça az olması”

Bu blog ile birlikte hem ben kendimi geliştireceğim, hem de öğrendiklerimi kaydedip sizlerle paylaşacağım. Kim bilir belki tanışır, birlikte öğrenir, burada birlikte paylaşırız, neden olmasın?

Haydi hemcinslerim, klavye başına!

İlk “Hello World” ünü yazdır ve KIZ GİBİ KODLA! 🙂