Download - Hadoop @ devveri.com
Aralık 2012v1.3
Hadoopdevveri.com
Hakkımda
● Marmara Üni. Elektronik
● Software Development Supervisor @ Gitti Gidiyor / eBay
● 12+ yıl yazılım tecrübesi
● Java, C, C++, C#
● Big Data, Search, NoSQL
Hakan İ[email protected]
twitter: devvericomhttp://tr.linkedin.com/in/hakanilter/
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
Dev Veri
Dev Veri
Dev Veri NedirTeknoloji > Internet > Sosyal Medya > Mobil > ...
Dünya'daki verilerin %90'lık kısmı son iki yılda toplandı
Yapılandırılmış (structured) ve Yapılandırılmamış (unstructured) verilerden meydana gelir
● Yapılandırılmış veriler: ürün, kategori, müşteri, fatura, ödeme...
● Yapılandırılmamış veriler: tweet, paylaşım, beğeni (like), e-posta, video, tıklama...
%10 Yapılandırılmış, %90 Yapılandırılmamış
Büyüklük (Volume)● Facebook 70+PB, eBay 5+PB
Hız (Velocity)● Twitter'da hergün 12TB twit atılıyor
Çeşitlilik (Variety)● Metin, sensör verileri, ses, görüntü, log
dosyaları
Dev Verinin 3 Boyutu
Dev Veri
Dev Veri'nin Önemi
● Bu kadar veri tek başına bir anlam ifade etmiyor
● Önemli olan Dev Veri içerisinde saklanmış olan bilgiyi ortaya çıkartıp yaptığımız işi daha iyi anlamak, belki de geleceği tahmin etmeye çalışmak
● Bu gerçekleştirildiğinde;○ Mutlu müşteriler○ Daha fazla kazanç○ Dolandırıcılıkta azalma○ Daha sağlıklı insanlar○ ...
Geleneksel Sistemlerin Problemleri
● RDBMSGöreceli olarak küçük boyutta veri, yapılandırılmamış verilere uygun değil
● Donanım limitleriDaha fazla CPU, daha fazla RAM, daha fazla Disk = Daha fazla Maliyet
● Yazılımsal karmaşıklıkSenkronizasyon, bant genişliği, erişilebilirlik, hata toleransı
Peki ya gerçek problem?
Gerçek problem: Veriyi işlemciye ulaştırabilmek!
100GB boyutundaki bir veriyi
tipik bir disk ile (~75 MB/sn) aktarmak
yaklaşık 22 dakika!
Yeni bir yaklaşım
● Ölçeklenebilir
● Tutarlı
● Veri Garantili
● Erişilebilir
Kim çözdü?
● Google File System (2003)
● MapReduce (2004)
● Big Table (2006)
ve Hadoop!
Veri işleme amaçlı dağıtık uygulamalar yazılmasını sağlayan bir platform ve açık kaynaklı bir Apache projesidir.
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
Neden Hadoop
● EsnekHer türlü veriyi saklayıp analizini yapabilir
● ÖlçeklenebilirBinlerce düğüm bir araya getirilebilir
● EkonomikAçık kaynaklı, "commodity" donanımda çalışabilir
Nerede?
Nerede?
Gitti Gidiyor'da Hadoop
Nokia kelimesiyle daha ilgili olduğu için Cep telefonu kategorisi daha üstte yer alıyor
İlgili diğer aramalar
Nokkia aratılmış ama Nokia olarak düzeltilmiş
Gitti Gidiyor'da Hadoop "Metallica" ile ilgili diğer aramalar
Mobil uygulama ana sayfada kişiselleştirilmiş ürün gösterimi
Autocomplete verisi
Kimler kullanıyor?
Hadoop
İki ana bileşenden oluşur● Hadoop Distributed File System (HDFS)● MapReduce
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
HDFS
Verinin saklanmasından sorumludur● Dağıtık bir dosya sistemidir
● Veriyi 64MB ya da 128MB'lık bloklar halinde saklar
● Her blok küme içerisinde farklı düğümlere dağıtılır
● Her bloğun varsayılan 3 kopyası tutulur
● Bu sayede verinin erişilebilirliği ve güvenilirliği
sağlanmış olur
● Aynı dosyaya ait bloklar farklı düğümlerde olabilir
HDFS
● Normal dosya sistemi üzerinde çalışır: ext3, ext4, xfs
● Büyük miktarda veri için yedekli depolama sağlar
● Düşük maliyetli sunucular üzerinde çalışmaya uygundur
● Küçük çok dosya yerine büyük daha az dosya tutulmalıdır
● Ortalama bir dosya 100MB civarı olmalıdır
● Rastlantısal erişim yoktur (write once)
● Büyük ve duraksız (streaming) veri erişimine göre
optimize edilmiştir
Data Node 1
HDFS
blok 1 blok 2
blok 3Data Node 2
blok 3
blok 2
blok 4
Data Node 3
blok 3
blok 1
blok 4
Data Node 4
blok 4
blok 2
Blokların düğümler üzerine dağılım örneği
blok 1
HDFS Erişimi
HDFS üzerindeki verilere konsol üzerinden hadoop fs komutu ile erişilebilir:
hadoop fs -ls Dosyaları listeler
hadoop fs -mkdir <path> Klasör oluşturur
hadoop fs -put <local> <target> Lokalden HDFS'e dosya kopyalar
hadoop fs -get <source> <local> HDFS'den lokale dosya kopyalar
hadoop fs -cat <filename> Dosya içeriğini konsola basar
hadoop fs -rmr <filename> Dosyayı siler
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
MapReduce
Veriyi işleme yöntemidir● Fonksiyonel programlamadan esinlenilmiştir
● Map ve Reduce birer fonksiyondur
● Map fonksiyonu ile veri içerisinden istenilen veriler
anahtar-değer formatında seçilir
● Reduce fonksiyonu ile de seçilen bu veriler
üzerinde işlem yapılır, sonuç yine anahtar-değer olarak iletilir
● Map ve Reduce arasında Shuffle ve Sort aşamaları
vardır
MapReduce
Daha kolay anlaşılabilir olması için SQL'e benzetmek gerekirse;
● WHERE ile yapılan filtreleme gibi Map aşamasında
sadece ihtiyacımız olan veriler seçilir
● Reduce aşamasında ise SUM, COUNT, AVG gibi
birleştirme işlemleri yapılır
MapReduce
● Map aşamasındaki işlemler küme üzerinde paralel
olarak çalışır
● Bu sayede kümenin büyüklüğüne göre veriler hızlı bir
şekilde işlenebilir hale gelmiş olur
● Her iş parçacığı verinin belirli bir parçasını işler
● İş parçacıkları mümkünse üzerinde çalıştığı
düğümdeki verileri işler. Buna Data Localization denir
MapReduce ile akış örneği
MapReduce
MapReduce
● Uygulama geliştirilirken sadece Map ve Reduce
metodları yazılır, geri kalan işleyiş otomatik gerçekleşir
● Hadoop tamamen Java ile geliştirildiği için
MapReduce uygulamaları Java ile yazılır, jar olarak paketlenir
● Streaming özelliği sayesinde Python, C++, Php gibi
farklı dillerde de kullanılabilir
Word Count
Map Metodu
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException
{
String line = value.toString().toLowerCase();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
Text word = new Text(tokenizer.nextToken());
context.write(word, new IntWritable(1));
}
}
Word Count
Reduce Metodu
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException
{
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
Tool sınıfı metodları
public int run(String[] args) throws Exception{ if (args.length != 2) { System.err.printf("Usage: %s [generic options] <input> <output>\n", getClass().getSimpleName()); ToolRunner.printGenericCommandUsage(System.err); return -1; }
Job job = new Job(); job.setJarByClass(WordCount.class);
FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);
return job.waitForCompletion(true) ? 0 : 1;}
public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(new WordCount(), args); System.exit(exitCode);}
Word Count
MapReduce programını çalıştırma
$ hadoop jar <jarfile> <classname> <args...>$ hadoop jar devveri-mapreduce-0.0.1-SNAPSHOT.jar com.devveri.hadoop.mapreduce.WordCount test.txt devveri12/07/09 23:44:41 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.12/07/09 23:44:41 INFO input.FileInputFormat: Total input paths to process : 112/07/09 23:44:41 INFO mapred.JobClient: Running job: job_201204231254_552212/07/09 23:44:42 INFO mapred.JobClient: map 0% reduce 0%12/07/09 23:44:56 INFO mapred.JobClient: map 100% reduce 0%12/07/09 23:45:08 INFO mapred.JobClient: map 100% reduce 100%12/07/09 23:45:13 INFO mapred.JobClient: Job complete: job_201204231254_552212/07/09 23:45:13 INFO mapred.JobClient: Counters: 2912/07/09 23:45:13 INFO mapred.JobClient: Job Counters12/07/09 23:45:13 INFO mapred.JobClient: Launched reduce tasks=112/07/09 23:45:13 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=1198412/07/09 23:45:13 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=012/07/09 23:45:13 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=012/07/09 23:45:13 INFO mapred.JobClient: Launched map tasks=112/07/09 23:45:13 INFO mapred.JobClient: Data-local map tasks=112/07/09 23:45:13 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=1003312/07/09 23:45:13 INFO mapred.JobClient: File Output Format Counters12/07/09 23:45:13 INFO mapred.JobClient: Bytes Written=3112/07/09 23:45:13 INFO mapred.JobClient: FileSystemCounters12/07/09 23:45:13 INFO mapred.JobClient: FILE_BYTES_READ=61...
Word Count
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
Hadoop Kurulumu● Apache sürümü dışında Cloudera, Hortonworks gibi
firmaların dağıtımları da kullanılabilir
● Farklı sürümleri bulunuyor1.0.X - current stable version, 1.0 release
1.1.X - current beta version, 1.1 release
2.X.X - current alpha version
0.23.X - simmilar to 2.X.X but missing NN HA.
0.22.X - does not include security
0.20.203.X - old legacy stable version
0.20.X - old legacy version
● Küme olarak (full cluster) ya da tek sunucuya (pseudo-
distributed) kurulabilir
● deb, rpm veya tarball olarak indirilip kurulabilir
Örnek kurulum adım 1
● JDK 1.6, openssh-server ve rsync sistemde olmalı
$ sudo apt-get install ssh
$ sudo apt-get install rsync
Örnek kurulum adım 2
● Sunucular arası şifresiz bağlantı gerekir
$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be
established.
ECDSA key fingerprint is 00:ab:cd:ef:12:23:56:ab:ba:c4:89:
11:d8:22:33:1b.
Are you sure you want to continue connecting (yes/no)? yes
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Örnek kurulum adım 3
● Kurulumun yapılacağı klasörler ayarlanır
$ sudo mkdir /usr/java
$ sudo chown -R devveri:devveri /usr/java
$ mkdir /usr/java/hadoop-data
● Apache sunucusundan son sürüm indirilir
$ cd /usr/java/
$ wget "http://www.eu.apache.org/dist/hadoop/
common/hadoop-1.0.4/hadoop-1.0.4.tar.gz"
$ gzip -dc hadoop-1.0.4.tar.gz | tar xf -
$ ln -s /usr/java/hadoop-1.0.4 /usr/java/hadoop
Örnek kurulum adım 4
● Küme ile ilgili genel ayarlar conf/core-site.xml dosyasında bulunur
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/java/hadoop-data</value>
</property>
</configuration>
Örnek kurulum adım 5
Örnek kurulum adım 6
● HDFS ile ilgili ayarlar conf/hdfs-site.xml dosyası
içerisinde bulunur
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
Örnek kurulum adım 7
● MapReduce ile ilgili ayarlar conf/mapred-site.xml dosyası içerisinde bulunur
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
Örnek kurulum adım 8
● Hadoop ile ilgili ortam değişkenleri conf/hadoop-env.sh dosyasında bulunur
export JAVA_HOME=/usr/java/jdk
export HADOOP_HEAPSIZE=512
export HADOOP_HOME_WARN_SUPPRESS="TRUE"
Örnek kurulum adım 9
● .bash_profile ya da .bash_rc dosyalarında $PATH
değişkeni ayarlanmalıdır
JAVA_HOME=/usr/java/jdk
PATH=$PATH:$JAVA_HOME/bin
HADOOP_HOME=/usr/java/hadoop
PATH=$PATH:$HADOOP_HOME/bin
Örnek kurulum adım 10● NameNode formatlanmalıdır
$ hadoop namenode -format12/09/05 00:07:06 INFO namenode.NameNode: STARTUP_MSG:/************************************************************STARTUP_MSG: Starting NameNodeSTARTUP_MSG: host = devveri-HP-ProBook-6540b/127.0.1.1STARTUP_MSG: args = [-format]STARTUP_MSG: version = 1.0.3STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192; compiled by 'hortonfo' on Tue May 8 20:31:25 UTC 2012************************************************************/12/09/05 00:07:06 INFO util.GSet: VM type = 32-bit12/09/05 00:07:06 INFO util.GSet: 2% max memory = 9.1025 MB12/09/05 00:07:06 INFO util.GSet: capacity = 2^21 = 2097152 entries12/09/05 00:07:06 INFO util.GSet: recommended=2097152, actual=209715212/09/05 00:07:07 INFO namenode.FSNamesystem: fsOwner=devveri12/09/05 00:07:07 INFO namenode.FSNamesystem: supergroup=supergroup12/09/05 00:07:07 INFO namenode.FSNamesystem: isPermissionEnabled=true12/09/05 00:07:07 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=10012/09/05 00:07:07 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)12/09/05 00:07:07 INFO namenode.NameNode: Caching file names occuring more than 10 times12/09/05 00:07:07 INFO common.Storage: Image file of size 111 saved in 0 seconds.12/09/05 00:07:07 INFO common.Storage: Storage directory /usr/java/hadoop-data/dfs/name has been successfully formatted.12/09/05 00:07:07 INFO namenode.NameNode: SHUTDOWN_MSG:/************************************************************SHUTDOWN_MSG: Shutting down NameNode at devveri-HP-ProBook-6540b/127.0.1.1************************************************************/
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
Gündem
● Hadoop kümesini durdurup başlatmak için bin
klasörü altındaki script'ler kullanılır
Küme Yapısı
start-all.sh Kümeyi çalıştırır
stop-all.sh Kümeyi durdurur
start-dfs.sh Sadece HDFS süreçlerini çalıştırır
stop-dfs.sh HDFS süreçlerini durdurur
start-mapred.sh Sadece MapReduce süreçlerini çalıştırır
stop-mapred.sh MapReduce süreçlerini durdurur
Hadoop Süreçleri
Hadoop kümesi içerisinde birlikte çalışan birkaç farklı süreç vardır
● NameNode
● SecondaryNameNode
● DataNode
● JobTracker
● TaskTracker
Ana (master) düğümdür● Hangi blok, hangi dosya nerededir takip eder
● Her türlü dosya işleminden sorumludur
● Veri değil sadece metadata saklar
● Her zaman ayakta olmak zorundadır
NameNode çalışmaz ise tüm küme çalışmaz hale gelir
● Hızlı erişim açısından verileri hafızada tutar
● Çökmeye karşı diske bilgileri senkronize eder
● Bu verileri mutlaka yedeklenmelidir
NameNode
NameNode yedeği değildir!● Sadece NameNode tarafından yapılmayan bazı
görevleri yerine getirir
SecondaryNameNode
DataNode
Verilerin bulunduğu düğümdür● Blok halinde dosyaları saklar
● Yedekli olduğu için kapanması halinde veri kaybı
yaşanmaz
● Veriler bu düğümlerde olduğu için analiz işlemleri
de bu düğümler üzerinde çalışır
● Küme içerisinde birden fazla olabilir (olmalıdır)
● 4000+ düğüme kadar büyüyebilir
● Sayısı arttıkça performansı lineer olarak artar!
JobTracker
MapReduce işlerini takip eder● NameNode gibi tektir
● İstemciler MapReduce işlerini JobTracker'a
gönderir
● İşleri diğer düğümlere dağıtır
● İş parçacıklarının durumunu takip eder
● Bir iş parçacığında sorun olursa bunu sonlandırarak
yeni bir tekrar çalıştırır
● Bazı durumlarda aynı işi yapan birden fazla iş
parçacığı çalıştırabilir
TaskTracker
MapReduce işlemlerini çalıştırır● DataNode ile aynı düğümde bulunur
● JobTracker tarafından gönderilen iş
parçacıklarından sorumludur
● Map ve Reduce görevlerini çalıştırıp sonuçlarını
JobTracker'a iletir
Kümeye bakış
Node 1
NameNode JobTracker
Node 2
DataNode TaskTracker
Node 3
DataNode TaskTracker
Node 4
DataNode TaskTracker
Node 5
DataNode TaskTracker
SNNode
NameNode Arayüzü
JobTracker Arayüzü
Gündem
● Big Data (Dev veri)● Hadoop● HDFS● MapReduce● Hadoop Kurulum● Küme Yapısı● Hadoop Ekosistemi
Hadoop Ecosystem
Hadoop çatısı altında birçok proje barınır
● Hive
● Pig
● HBase
● Mahout
● Impala
● Diğerleri: Sqoop, Flume, Avro, Zookeeper, Oozie,
Cascading...
Hive● Facebook tarafından geliştirilmiştir
● SQL benzeri HiveQL dili ile Java kullanmadan
MapReduce uygulamaları yazılmasını sağlar
● Öncelikle HDFS üzerindeki dosyalar tablo olarak
tanıtılır○ create table member_visits (member_id string,
visit_count int) row format delimited fields
terminated by '\t' stored as textfile;
○ load data inpath '/usr/hadoop/anyfile' into table members;
● Daha sonra bu sanal tablolar sorgulanabilir○ select avg(visit_count) from member_visits where
visit_count > 0;
Pig
● Yahoo tarafından geliştirilmiştir
● MapReduce yazmak için "DataFlow" dili olarak
adlandırılan, SQL'den farklı kendine özgü PigLatin dili kullanılır
● Join destekler, daha kolay ve performanslı
MapReduce programaları yazmayı sağlar○ A = LOAD 'companies.csv' USING PigStorage() AS
(productId:int, productName:chararray);
B = FILTER A BY productId > 3;
C = FOREACH B GENERATE *;
DUMP C;
HBase
● Hadoop üzerinde çalışan NoSQL veritabanıdır
● Google Big Table örnek alınarak geliştirilmiştir
● Esnek şema yapısı ile binlerce kolon, petabyte'larca
satırdan oluşan veriyi saklayabilir
● HDFS üzerinde çalıştığından MapReduce destekler
● Veriye erişiminde bazı kısıtlar vardır
● Verilere anahtar üzerinden ya da partial table scan
ile erişilebilir
● İkincil indeks, karmaşık sorgu çalıştırma desteği
yoktur
Mahout
● Hadoop üzerinde çalışabilen Machine Learning
algoritmalarını içeren bir kütüphanedir
● Recommendation
● Clustering
● Classification
Impala
● Google Dremel (2010) projesinden esinlenmiştir
● Cloudera tarafından geliştirilmiştir
● MapReduce yapmadan verilere direkt erişir
● HiveQL destekler, 7-45 kat daha hızlı çalışır
Sorular
?
DevVeri.com Hakkında
Big Data, Search, NoSQL her türlü yazılarınızı bekliyoruz!
Kaynaklarhttp://hadoop.apache.org
http://www.cloudera.com
http://www-01.ibm.com/software/data/bigdata/
http://en.wikipedia.org/wiki/Google_File_System
http://en.wikipedia.org/wiki/MapReduce
http://en.wikipedia.org/wiki/BigTable
http://www.evolven.com/images/stories/blog/blog_infographic_big_data_autonomy-big-data.jpg
http://architects.dzone.com/articles/big-data-rich-compendium-big
http://devveri.com
Teşekkürler!