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).
2. 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.
#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. #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> <name>fs.default.name</name> <value>hdfs://sunucu:9000</value> </configuration>
hdfs-site.xml #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> <name>dfs.replication</name> <value>2</value> <name>dfs.data.dir</name> <value>/hadoop/data</value> <final>true</final> <name>dfs.name.dir</name> <value>/hadoop/namedir</value> <final>true</final> </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. <name>dfs.data.dir</name> <value>/hadoop/data,/d2/dfs/data,/d3/dfs/data,/d4/dfs/data</value> <final>true</final> 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. #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 #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ı [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 [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 #/hadoop/bin/hadoop dfs -ls Yerel sistemden cluster'a dosya kopyalama #/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: <name>dfs.hosts.exclude</name> <value>/home/hadoop/excludes</value> <final>true</final> 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 <name>dfs.name.dir</name> <value>/hadoop/name,/mnt/name</value> <final>true</final> 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. #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 ahmetorhan@yahoo.com