Ubuntu Üzerine Hadoop Cluster Kurulumu

Bu yazıda tek makina üzerinde Hadoop cluster kurulumunu gerçekleştirip test edeceğiz. Öncelikle Hadoop nedir hangi elemanlardan oluşur bunu görelim. Hadoop, Doug Cutting and Mike Cafarella tarafından Java ile geliştirilmiş ve açık kaynak kodlu büyük veriyi dağıtık olarak saklama imkanı getiren bir dağıtık dosya sistemidir. 2003 yılında Google tarafından yayınlanan Google File System dokümanında yazılanlardan esinlenilmiştir.

Hadoop üç temel bileşenden oluşur.

HDFS
Hadoop dağıtık dosya yönetim sistemi(Hadoop Distributed File System) veri depolama amaçlı kullanılan dağıtık, ölçeklenebilir, hata-toleranslı bir dosya sistemidir.

MapReduce
Büyük verilerin paralel olarak ve birbirinden bağımsız işlenebilmesini sağlayan bir altyapıdır. İşlerin Hadoop kümesi içindeki sunuculara dağıtılması ve yönetilmesini gerçekleştirir.

YARN
Yet Another Resource Negotiator kelimelerinin kısaltılmışıdır. Temel olarak Hadoop kaynak yönetimi katmanıdır ve dağıtık işlerimizin kaynak yönetimini gerçekleştirir.

Bu kısa bilgiden sonra kurulum işlemlerimizle ilgili detaylara geçelim. Kurulumu Ubuntu üzerinde gerçekleştireceğim, bu nedenle yazının devamındaki komutlar bu işletim sistemi üzerinde çalışacak şekilde örneklenmiştir.

Hadoop kurulumu için gereken komponentlerin yüklenmesi ile başlayalım. Hadoop için öncelikle sistemde Java ve ssh kurulumlarının gerçekleştirilmesi gerekir.

Java Kurulumu

sudo apt-get install openjdk-8-jdk 

Kurduktan sonra java -version yazdığımızda aşağıdaki gibi bir çıktı almalıyız.

openjdk version “1.8.0_181”
OpenJDK Runtime Environment (build 1.8.0_181–8u181-b13–1ubuntu0.18.04.1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

SSH Kurulumu

sudo apt-get install ssh

Ve remote shell paralel çalışma işlemi için

sudo apt-get install pdsh

ssh tarafından kullanılacak rsa anahtar çifti üretimini gerçekleştirelim, açık anahtar(public key) üretildikten sonra authorized_keys altına kopyalayacağız.

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

Anahtar tabanlı kimlik doğrulama(authentication) işlemini kontrol edelim. Bağlantı kurulmasına izin veriyor musunuz? Sorusuna evet ile adımı sonlandırıp devam edelim.

ssh localhost

Hadoop Kurulum Dosyasını Yükleme İşlemi

http://www.apache.org/dyn/closer.cgi/hadoop/common/ adresindeki en yakın sunucudan tar.gz dosyasını indirelim. 
Bu yazıda hadoop-3.1.1.tar.gz dosyasını kullanacağım.

Dosyayı indirdikten sonra:

tar -xvzf hadoop-3.1.1.tar.gz

Komutu ile açıp içindekileri /usr/local/hadoop klasörüne taşıyalım. /usr/local/hadoop klasörü ilk kez açılacaksa

sudo mkdir /usr/local/hadoop 

Komutu ile yaratılabilir. Klasörü hadoop altına taşıyalım.

mv hadoop-3.1.1 /usr/local/hadoop

hadoop klasörünün sahibini kendi kullanıcımız olarak ayarlayalım.

chown -R engin /usr/local/hadoop
cd /usr/local/hadoop/hadoop-3.1.1

Klasörü içinde ls komutu çalıştırdığımızda aşağıdaki gibi çıktı elde etmelisiniz.

bin etc include lib libexec LICENSE.txt NOTICE.txt README.txt sbin share

Dosya kopyalama işlemleri bittiğine göre artık konfigürasyon işlemlerine geçebiliriz.

Hadoop üç modda çalışabilir:

  1. Lokal Tek Başına(Standalone) Mod
    Sisteminize hadoop indirdikten sonra standart olarak standalone mode’da çalışır durumda olmaktadır, herhangi bir tanım yapmanınıza gerek yoktur. Tüm servisler tek JVM üzerinde çalışır.
  2. Sanal Dağıtık(Pseudo-Distributed) Mod
    Dağıtık yapının tek makina üzerinde simule edilmesi mantığı ile çalışır. Tek bir makina üzerinde master ve worker bulunur. 
    Tek makina vardır ama servisler(hfs,mapreduce,yarn,..) farklı JVM’ler üzerinde çalışır. Genelde geliştirme ortamında kullanılır.
  3. Tam Dağıtık(Fully Distributed) Mod
    Tam olarak dağıtık yapıda çalışır, en az iki makina olması gerekmektedir.

Bu yazıda hadoop kurulumuzu Pseudo Distributed mod için gerçekleştireceğiz.

Hadoop Pseudo Distributed Mod Kurulumu

bashrc dosyasının en altına aşağıdaki eklentileri yapalım.

sudo nano ~/.bashrc

Eklenecekler:

export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.1
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

Bunları ekleyip dosyayı kaydettikten sonra source ~/.bashrc komutu ile çevresel(environment) değişkenleri tekrar yükleyelim.
Kontrol için komut satırından echo $HADOOP_HOMEkomutunu çalıştırdığımızda çıktısı aşağıdaki gibi geliyorsa tanımlar başarılı yapılmıştır.

/usr/local/hadoop/hadoop-3.1.1

Şimdi konfigürasyon tanımlarının bulunduğu klasöre gidelim.

cd $HADOOP_HOME/etc/hadoop

Öncelikle Java dizini kontrolünü gerçekleştirelim.

readlink -f /usr/bin/java | sed “s:bin/java::” 

komutu bize aşağıdaki gibi bir çıktı üretmelidir.

/usr/lib/jvm/java-8-openjdk-amd64/jre/

Bu bizim Java dizinimiz. Bunun tanımını hadoop-env.sh dosyasına ekleyelim.

sudo nano hadoop-env.sh

Komutu ile hadoop-env.sh dosyasını açıp aşağıdaki gibi JAVA_HOME değişikliğini yapalım ve dosyayı kaydedelim.

# export JAVA_HOME=
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

Hadoop dosya sisteminde kullanacağımız namenode ve datanode klasörlerini oluşturalım.

mkdir /usr/local/hadoop/hdir/namenode
mkdir /usr/local/hadoop/hdir/datanode

Şimdi son konfigürasyon adımı olan xml dosyalarını düzenleyelim. Bu dosyalar:

  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml

Dosyalarının içerisinde gereken tanımlamaları yapacağız.

core-site
core-site.xml dosyası Hadoop uygulamasının port bilgileri, dosya sistemi memory limit tanımlamaları, okuma/yazma buffer büyüklükleri gibi 
tanımlamaların yapılması için kullanılan bir dosyadır.
Bu dosyayı açıp aşağıdaki configuration tanımlamasını yapıp kaydedelim.

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

hdfs-site
hdfs-site.xml dosyası replikasyon, namenode dizini, datanode dizini gibi klasör tanımlamalarının yapıldığı dosyadır.
Bu dosyayı açıp aşağıdaki configuration tanımlamasını yapıp kaydedelim.

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///usr/local/hadoop/hdir/namenode </value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///usr/local/hadoop/hdir/datanode </value>
</property>
</configuration>

yarn-site
yarn-site.xml dosyası Hadop içindeki yarn konfigürasyonunun tanımlanması için kullanılır.
Bu dosyayı açıp aşağıdaki configuration tanımlamasını yapıp kaydedelim.

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

mapred-site
mapred-site.xml dosyası MapReduce framework tanımlamaları için kullanılır.

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

Bu tanımlamaları yaptıktan sonra artık hdfs dosya sistemini çalıştırabiliriz.

Hadoop Cluster Çalıştırma Adımları

1. Name Node Kurulumu / Format

cd ~

home dizinine gidip

hdfs namenode -format

komutunu çalıştırarak namenode format işlemini gerçekleştiriyoruz. Beklediğimiz ekran çıktısı:

WARNING: /usr/local/hadoop/hadoop-3.1.1/logs does not exist. Creating.
2018–11–07 11:38:08,944 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = engin-VirtualBox/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 3.1.1
..
..
..
2018–11–07 11:38:09,821 INFO common.Storage: Storage directory /usr/local/hadoop/hdir/namenode has been successfully formatted.
2018–11–07 11:38:09,828 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/hdir/namenode/current/fsimage.ckpt_0000000000000000000 using no compression
2018–11–07 11:38:09,937 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/hdir/namenode/current/fsimage.ckpt_0000000000000000000 of size 390 bytes saved in 0 seconds .
2018–11–07 11:38:09,947 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2018–11–07 11:38:09,953 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at engin-VirtualBox/127.0.1.1
************************************************************/

2. HDFS Cluster Başlatılması
Dfs başlatmak için star-dfs.sh dosyası çalıştırılır bu şekilde hadoop dosya sistemimiz çalışmaya başlamış olur.

start-dfs.sh

eğer localhost: rcmd: socket: Permission denied hatası alırsanız bashrc içerisine aşağıdaki satırı ekleyin.

export PDSH_RCMD_TYPE=ssh

3. YARN Servislerinin Başlatılması

start-yarn.sh

Servislerin Kontrolü
Başlatılan servislerin durumlarının kontrolü için jps komutu kullanılabilir.

Beklenen çıktısı:

14116 DataNode
14359 SecondaryNameNode
13915 NameNode
14588 ResourceManager
14765 NodeManager
15086 Jps

Tarayıcı Üzerinden Hadoop’a Erişmek

Standart olarak Hadoop namenode servisi 9870 nolu porttan yayın yapar(veya 50070) tarayıcı üzerinden 
http://localhost:9870/ adresiyle erişilebilir.

Eğer Hadoop cluster’a erişmek ve cluster üzerindeki işleri inclemek istiyorsanız tarayıcı üzerinden 
http://localhost:8088/ adresini kullanabilirsiniz.

Tüm servisleri kapatmak için stop-all.sh komutunu kullanabilirsiniz.

Hadoop Üzerinde Basit Bir Test

Hadoop kurulumunu tamamladık ve çalıştığını izledik. Şimdi komut satırından bir klasör yaratalım ve bu klasöre bir dosya kaydedelim.
Daha sonra hdfs üzerinden bu klasörün içeriğine bakalım.

hdfs dfs -mkdir /hello
echo “deneme dosyası hdfs” >> deneme.txt
hdfs dfs -put deneme.txt /hello

ls komutu ile dizinin içeriğini görmek istediğimizde

hdfs dfs -ls /hello

Beklenen çıktı:

Found 1 items
-rw-r — r — 1 engin supergroup 21 2018–11–07 11:45 /hello/deneme.txt

Denemeler veya geliştirme amaçlı kullanılabilecek tek makina üzerinde çalışabilen Hadoop kurulumunu gerçekleştirdik ve kullanıp test ettik. Okuduğunuz için teşekkürler.

Engin ÜNAL