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.
1 2 3 4 5 6 7 8 9 10 11 |
#ssh-keygen -t rsa #scp /root/.ssh/id_rsa.pub root@node1:~/.ssh/authorized_keys #scp /root/.ssh/id_rsa.pub root@node2:~/.ssh/authorized_keys #scp /root/.ssh/id_rsa.pub root@node3:~/.ssh/authorized_keys #scp /root/.ssh/id_rsa.pub root@node4:~/.ssh/authorized_keys #scp /root/.ssh/id_rsa.pub root@node5:~/.ssh/authorized_keys |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#vi /hadoop/conf/core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://sunucu:9000</value> </property> </configuration> |
hdfs-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#vi /hadoop/conf/hdfs-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.data.dir</name> <value>/hadoop/data</value> <final>true</final> </property> <property> <name>dfs.name.dir</name> <value>/hadoop/namedir</value> <final>true</final> </property> </configuration> |
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.
1 2 3 4 5 6 7 |
<property> <name>dfs.data.dir</name> <value>/hadoop/data,/d2/dfs/data,/d3/dfs/data,/d4/dfs/data</value> <final>true</final> </property> |
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.
1 |
#vi /hadoop/conf/masters sunucu |
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
1 2 3 4 5 6 7 8 9 |
#scp -r /hadoop/ root@node1:/hadoop #scp -r /hadoop/ root@node2:/hadoop #scp -r /hadoop/ root@node3:/hadoop #scp -r /hadoop/ root@node4:/hadoop #scp -r /hadoop/ root@node5:/hadoop |
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ı
1 2 3 |
[root@sunucu conf]# /hadoop/bin/start-dfs.sh [root@sunucu bin]# ./start-dfs.sh |
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
1 |
[root@sunucu conf]# /hadoop/bin/stop-dfs.sh |
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
1 |
#/hadoop/bin/hadoop dfs -ls |
Yerel sistemden cluster’a dosya kopyalama
1 |
#/hadoop/bin/hadoop dfs -copyFromLocal /root/hadoop-1.0.2-bin.tar.gz deneme.tar.gz |
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:
1 2 3 4 5 6 7 8 9 |
<property> <name>dfs.hosts.exclude</name> <value>/home/hadoop/excludes</value> <final>true</final> </property> |
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.
1 2 3 4 5 |
#groupadd hadoop #useradd –g hadoop –s /bin/bash –d /home/hadoop hadoop #passwd hadoop #su – hadoop #vi /etc/sudoers |
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