Hadoop Nedir ve Nasıl Yapılır

Hadoop Nedir ve Nasıl Yapılır

Daha önce qmail-ldap ile mail server cluster yapmıştık. Tabi burada mail sunucular bilgileri kendi üzerinde tutuyordu.

Sunucunun uçması durumunda yandı gülüm keten helvası.

Bilgileri SAN’da tutmak bir çözüm olabilir ancak SAN ne kadar güvenli ve genişlemeye ne kadar müsait?

Türkiye’nin en büyük servis sağlayıcılarından birinin başına gelen felaketten sonra SAN güveliğini de hesaba katmak gerek. Binlerce kullanıcı 3-4 gün boyunca sunucularına ve dolayısıyla bilgilerine ulaşamamışlar..Çok sert..

(Elbette SAN’da da veri güvenliği sağlanır, ancak hem maliyet hem kolaylık hem de genişleyebilme açısından sıkıntılıdır.)

Sonra bakıyorsunuz Google denen canavara. Bu kadar veriyi nerede tutuyor ve asıl olan güveliğini nasıl sağlıyor.

Ha keza facebook da milyonlarca fotoğraf, yazı.. Yahoo’yu da düşünmek lazım, ki ilk gözbebeğimdir.

Bunlar nasıl baş ediyor diye bakınırken HADOOP projesine rastladım.

Dünya devleri kullanıyor. Facebook ve Yahoo yu saymak ilk etapta yeter sanırım http://wiki.apache.org/hadoop/PoweredBy adresinden tam listeye ulaşılabilir.

Google ise aynı mantıkta kendi DFS sistemini kullanıyor. GFS. http://en.wikipedia.org/wiki/Google_File_System Hadoop kısaca iki kısımdan oluşuyor.

1. HDFS (Hadoop Distributed File System).

Adında da anlaşılacağı üzere dağıtık dosya sistemidir. Dosyalar cluster üyesi nodlarda bloklara ayrılarak saklanır. Data güveliği için de bir datanın birden fazla sunucuda saklanması sağlanabilir(replication).

Map Reduce

Bilgi işlemede, büyük kapasite gereksinimi duyulduğu zaman bilgiyi clusterdaki sunuculara dağıtarak çok çoook daha hızlı bir şekilde sonuçlar almanızı sağlar.

Veri 16-64Mb lık parçalara ayrılır ve yönetici sunucuya iletilir, sunucu da bu bilgileri nodlara dağıtırak işlenmesini sağlar.

100 noddan oluşan bi clusterda ortlama işlemci hızlarına 1GHz, belleklere 2Gb dersek, toplamda yaklaşık 100GHz işlemci ve 200gb Ramli süper sunucu elde etmiş oluruz(teorik olarak).

Neyse, biz map-reduce ile ilgilenmeyeceğiz şimdilik.

HDFS ile tam güvenli, genişleyebilir bir cluster yapacağız. Bunun için mimarimiz şu şekilde olacak.

Kurulumlar Centos 5 üzerine vmware üzerinde yapıldı.

Sunucuda yapılacak işlemler

Tüm sistemlerde güvenlik duvarını disable ediniz Selinux’u disabled ediniz.

Host dosyalarını ayarlıyoruz ki üyeler birbirine isimleriyle hitap edebilsin.

#vi /etc/sysconfig/network

HOSTNAME=sunucu

#hostname sunucu

#vi /etc/hosts 192.168.174.131 sunucu
192.168.174.133 node1
192.168.174.134 node2
192.168.174.135 node3
192.168.174.136 node4
192.168.174.137 node5

#service network restart

JAVA KURULUMU

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloadsjavase6-419409.html#jdk-6u30-oth-JPR adresinden java SE 6u30 indirelim.

#chmod a+x jdk-6u30-linux-i586.bin

#./ jdk-6u30-linux-i586.bin

SSH KURULUMU(Parolasız Erişim)

Hdfs kurulumdan ssh gereklidir. Ve biz sunucuların parolasız olarak birbirlerine erişmesini sağlamalıyız.

Bunun için sunucuda ssh-keygen ile key oluşturuyoruz ve id_rsa.pub dosyasını tüm nodların home dizinine authorized_keys olarak atıyoruz. Bu kadar.

 

Sunucudan #ssh node1 dediğimizde parola sormadan giriş yapabilecek..

HADOOP KURULUMU

Hadoop indiriyoruz ve paketi açıyoruz. Ben sistemi /hadoop dizininden çalıştırmayı tercih ettim.

#tar -zxvf hadoop-1.0.2-bin.tar.gz

#mv hadoop-1.0.2 /hadoop

Hadoop kurulumu için en önemli ayar JAVA’nın kurulu olduğu dizini belirtmek.

#vi /hadoop/conf/hadoop-env.sh export JAVA_HOME=/jdk1.6.0_30

core-site.xml ana ayar dosyasıdır ve namenode’u buradan tanımlamamız gerekir.

 

hdfs-site.xml

 

Eveet dananın kuyruğu burada kopuyor.

dfs.replication : Datanın kaç kopyasının bulunacağı bilgisi. Biz 2 dedik yani, 5 sunuculu sistemde aynı veri iki sunucuda birden yer alacak. Birinin uçması durumunda diğerinden devam edecek. Peki biz bu değere 6 deseydik ne olacaktı? 5 nodumuz var ve data, 5 nodda birden yer alacaktı. Bir tane daha nod eklediğimizde 6. kopya yeni sunucuya da gönderilecektir.

Aşağıdaki örnekte görüldüğü gibi 80mb’lık bir dosya iki blok halinde saklanmış. Replica sayısı 3 olduğu için 3 sunucuda da aynı blokta yer alıyor.

dfs.data.dir: Dataların saklanacağı dizin. Bu alana birden fazla disk de eklenebilir.

 

dfs.name.dir: Namenode için veritabanı diyebiliriz. Hangi dosya hangi sunucuda hangi blok nereye replikasyonlu. Tüm bilgiler bu dizindeki dosyalarda olacak.

Sistemin en önemli dosyası. Burada bir sıkıntı olduğunda tüm cluster bilgileri çöp olacaktır.

Master dosyasında namenode yer alıyor.

 

Slaves dosyasında data nodlarımız yer alacak

#vi /hadoop/conf/slaves

node1 node2 node3 node4 node5

Şimdi master sunucu hazır. Gelelim datanodlara..

Datanode Kurulumu

Data nodlarda JAVA, master noddaki dizin ile aynı olacak şekilde kurulmalıdır.

Master noddan hadoop kurulu dizini datanoda scp ile kopyalayalım

 

Datanodlarda /conf/masters ve conf/slaves dosyalarında sadece localhost yazmalıdır.

Datanode kurulumu da bu kadar.

Cluster’ın çalıştırılması

Sunucuda tek sefere mahsus namenode formatlama yapmamız gerekiyor.

[root@sunucu conf]# /hadoop/bin/hadoop namenode -format

12/04/16 06:26:12 INFO namenode.NameNode: STARTUP_MSG:

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG: host = sunucu/192.168.174.131

STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.0.2

STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0.2 -r 1304954; compiled by ‘hortonfo’ on Sat Mar 24 23:58:21 UTC 2012

************************************************************/

Re-format filesystem in /hadoop/namedir ? (Y or N) Y

12/04/16 06:26:15 INFO util.GSet: VM type = 32-bit

12/04/16 06:26:15 INFO util.GSet: 2% max memory = 19.33375 MB

12/04/16 06:26:15 INFO util.GSet: capacity = 2^22 = 4194304 entries

12/04/16 06:26:15 INFO util.GSet: recommended=4194304, actual=4194304

12/04/16 06:26:16 INFO namenode.FSNamesystem: fsOwner=root

12/04/16 06:26:16 INFO namenode.FSNamesystem: supergroup=supergroup

12/04/16 06:26:16 INFO namenode.FSNamesystem: isPermissionEnabled=true

12/04/16 06:26:16 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100

12/04/16 06:26:16 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)

12/04/16 06:26:16 INFO namenode.NameNode: Caching file names occuring more than 10 times 12/04/16 06:26:16 INFO common.Storage: Image file of size 110 saved in 0 seconds.

12/04/16 06:26:16 INFO common.Storage: Storage directory /hadoop/namedir has been successfully formatted. 12/04/16 06:26:16 INFO namenode.NameNode: SHUTDOWN_MSG:

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at sunucu/192.168.174.131

Cluster’ın başlatılması

 

starting namenode, logging to /hadoop/libexec/../logs/hadoop-root-namenode-sunucu.out node1: starting datanode, logging to /hadoop/libexec/../logs/hadoop-root-datanode-node1.out node2: starting datanode, logging to /hadoop/libexec/../logs/hadoop-root-datanode-node2.out ………

Durdurmak için

 

Cluster başlatma durdurma ve formatlama gibi işlemler sadece sunucuda yapılmalıdır. http://192.168.174.131:50070 adresinden web arabirimine bakabiliriz.

Clusterdaki dosyaları listeleme

Yerel sistemden cluster’a dosya kopyalama

12/04/16 07:27:58 INFO hdfs.DFSClient: Exception in createBlockOutputStream 192.168.174.131:50010 java.io.IOException: Bad connect ack with firstBadLink as 192.168.174.133:50010

12/04/16 07:27:58 INFO hdfs.DFSClient: Abandoning block blk_-2989851695381796686_1002

12/04/16 07:27:58 INFO hdfs.DFSClient: Excluding datanode 192.168.174.133:50010

12/04/16 07:27:58 INFO hdfs.DFSClient: Exception in createBlockOutputStream 192.168.174.131:50010 java.io.IOException: Bad connect ack with firstBadLink as 192.168.174.134:50010

12/04/16 07:27:58 INFO hdfs.DFSClient: Abandoning block blk_-6438890052180442365_1002 12/04/16 07:27:58 INFO hdfs.DFSClient: Excluding datanode 192.168.174.134:50010

Nodlar hakkında bilgi alma

[root@sunucu data]# /hadoop/bin/hadoop dfsadmin -report

Configured Capacity: 15341649920 (14.29 GB)

Present Capacity: 11428478534 (10.64 GB)

DFS Remaining: 9244540928 (8.61 GB)

DFS Used: 2183937606 (2.03 GB)

DFS Used%: 19.11%

Under replicated blocks: 0

Blocks with corrupt replicas: 0

Missing blocks: 0

————————————————Datanodes available: 2 (3 total, 1 dead)

Name: 192.168.174.133:50010

Decommission Status : Normal

Configured Capacity: 7670824960 (7.14 GB)

DFS Used: 1151465183 (1.07 GB)

Non DFS Used: 1929865505 (1.8 GB)

DFS Remaining: 4589494272(4.27 GB)

DFS Used%: 15.01%

DFS Remaining%: 59.83%

Last contact: Mon Apr 16 09:01:58 EDT 2012

Name: 192.168.174.131:50010

Decommission Status : Normal

Configured Capacity: 7670824960 (7.14 GB)

DFS Used: 1032472423 (984.64 MB)

Non DFS Used: 1983305881 (1.85 GB)

DFS Remaining: 4655046656(4.34 GB)

DFS Used%: 13.46%

DFS Remaining%: 60.69%

Last contact: Mon Apr 16 09:01:59 EDT 2012

Datanode ekleme

Yeni bir datanode ekleyelim.

Masterda

  • HADOOP_DIR/conf/slaves dosyasına yeni nodumuzun adını yazıyoruz.
  • /etc/hosts dosyasına hostname ve ip yi giriyoruz.
  • #scp -r /hadoop/ root@node_yeni:/hadoop noda hadoop dizinin kopyalıyoruz.
  • authorized_keys dosyasını noda atıyoruz #scp /root/.ssh/id_rsa.pub root@node_yeni:~/.ssh/authorized_keys
  • #ssh node_yeni diyelim

Data nodda

  • [root@node_yeni bin] # /hadoop/bin/hadoop datanode Birkaç saniye sonra web guiden yeni nod görünecektir.

DataNode Hataları

Bir nod kapalı duruma gelirse hadoop bunu 10dk sonra fark eder ve web gui’de dead node kısmında gösterir. Cluster’a ekleme yapmak istediğinizde de nod hakkında hata mesajı verecektir.

[root@sunucu bin]# /hadoop/bin/hadoop dfs -copyFromLocal /jdk-6u30-linux-i586.bin 111136

12/04/16 10:44:36 INFO hdfs.DFSClient: Exception in createBlockOutputStream 192.168.174.131:50010 java.io.IOException: Bad connect ack with firstBadLink as 192.168.174.133:50010

12/04/16 10:44:36 INFO hdfs.DFSClient: Abandoning block blk_-1749116855650279788_1061

12/04/16 10:44:36 INFO hdfs.DFSClient: Excluding datanode 192.168.174.133:50010

Clusterda bir node herhangi bi hatadan dolayı kapatıldı ve data klasörü zarar görmeden sistem yeniden başlatıldıysa hadoop master bunu direk algılamaz.

Bu durumda sonradan açılan data nodda aşağıdaki komutu vermek gerekir.

[root@node2 bin] # /hadoop/bin/hadoop datanode

Master nodda da aşağıdaki komutu vererek kontrole edebiliriz.

#/hadoop/bin/hadoop dfsadmin -refreshNodes

#/hadoop/bin/hadoop dfsadmin -report

Bir datanode çöktüyse ve artık kullanılmayacaksa bunu masterda belirtmek gerekiyor.Şöyle

ki

conf/hadoop-site.xml:

 

exludes dosyasını oluşturup sistemden çıkarılan nodun hostname’i yazılmaldır. Böylece o noda bağlı replikasyonlar yeniden ayarlanır.

NAMENODE GÜVENLİĞİ

Eveet, verilerimizi 2-3-5 sunucuda birden saklayıp güvenli hala getirdik ama bu verileri organize eden namenode’a bir şey olursa ne olacak.. Yaaa.

Bu durumda farklı çözümler mevcut, http://www.cloudera.com/blog/2009/07/hadoop-haconfiguration/ adresinde ha ile ilgili güzel bir döküman var.

Biz yedek alarak güvenliği sağlamayı anlatalım.

Mevcut sunucumuzdaki tüm ayarlar ile aynı, yeni bir sunucu daha oluşturuyoruz. Sadece ip adresi farklı olacak (192.168.174.132)

Yeni sunucumuzdaki dfs.name.dir’in bulunduğu /hadoop/name klasörüne nfs paylaşımı açıyoruz.

Mevcut sunucumuzda

conf/hdfs-site.xml dosyasına /hadoop/name’den sonra virgülle ayrılmış şekilde yeni sunucunun nfs paylaşımını yazıyoruz.

/mnt/name: 192.168.174.132 deki /hadoop/name klasörüne bağlı.

Artık mevcut sunucu metadaları hem kendi üzerine hem yeni sunucu üzerine yazacaktır. Mevcut sunucunun çökmesi durumunda yeni sununun ip adresi değiştirilerek sistem çalışmaya devam eder.

conf/hdfs-site.xml

<property>

<name>dfs.name.dir</name>

<value>/hadoop/name,/mnt/name</value>

<final>true</final>

</property>

Mevcut sunucudan yeni sunucuya ayar dosyalarını aşağıdaki gibi gönderebilirsiniz.

#scp -r /root/.ssh/* root@192.168.174.132:/root/.ssh/

#scp /etc/hosts root@192.168.174.132:/etc/hosts

#scp /hadoop/conf/masters root@192.168.174.132:/hadoop/conf/masters

#scp /hadoop/conf/slaves root@192.168.174.132: /hadoop/conf/slaves #scp /hadoop/conf/slaves root@192.168.174.132: /hadoop/conf/slaves

SİSTEM GÜVENLİĞİ

Biz, yukarıda tüm işlemlerimizi root olarak yaptık. Tabi ki bu güvenli bir yaklaşım değil. Hadoop için özel bir kullanıcı oluşturup işlemlerimiz bunun üzerinden yapmak çook çok daha mantıklı olacaktır.

hadoop ALL=(ALL) ALL

(hadoop kullanıcısı için izinleri vermemiz gerek)

Tabi bu durumda,

.ssh dizini /home/hadoop/.ssh/ olacaktır. Sistem hadoop kullanıcısı ile başlatılmalıdır. hadoop dosyaları /home/hadoop/ altına ya da hadoop kullanıcısının erişimi olacak şekilde başka bir dizine konulmalıdır. http://www.slideshare.net/emulex/boosting-hadoop-performance-with-emulex-oneconnect-10gbethernet-adapters

Ahmet ORHAN

ahmetariforhan at gmail.com