DevVeri.com

Boğulacaksan büyük veride boğul!

Facebook Presto

presto-ogPresto, Facebook tarafından geliştirilmiş ve açık kaynaklı hale getirilmiş bir proje. Presto da diğer Dağıtık SQL motoru çözümleriyle (Impala, Drill, Spark SQL) aynı amacı güdüyor ve mimari olarak da olduça benzer. Hive projesini de Facebook’un geliştirdiğini düşünecek olursak projeden beklentimiz oldukça yüksek. Ancak arkasında bir topluluk veya ticari bir firma olmadığı için de geleceği konusunda kafamızda bir soru işareti olmuyor değil. Örneğin dökümantasyonunun yetersiz olduğunu söyleyebiliriz. Ancak en iyisi (ve keyiflisi) kendimizin deneyerek karar vermesi. Presto hali hazırda Hive ve Cassandra ile entegre olabiliyor. Bu yazımızda Presto’nun kurulumu ve Hive ile entegrasyonunu anlatacağız.

Kurulum ve konfigürasyon

Prestonun şu andaki en güncel hali olan 0.75 sürümünü buradan veya komut satırından indirmekle başlayalım:

wget http://central.maven.org/maven2/com/facebook/presto/presto-server/0.75/presto-server-0.75.tar.gz
tar xvf presto-server-0.75.tar.gz

Presto’nun kurulumu biraz karışık. Metadata’yı saklaması için bir data dizini, bir de konfigürasyon için etc dizini oluşturmamız gerekiyor. Nedense diğer projelerden alışık olduğumuz konfigürasyon şablonlarını kuruluma dahil etmemişler. Bunları bizim oluşturmamız gerekiyor. Bu amaçla etc dizini içerisinde node.properties, jvm.config ve config.properties isimli üç dosya yaratacağız. etc/node.properties dosyası içerisinde node.id ile her düğümün tekil id’sini belirtiyoruz. node.data-dir ile de data dizinini belirtiyoruz:

node.environment=test
node.id=node1-presto
node.data-dir=/opt/presto/data

etc/jvm.config dosyası ile jvm ayarlarını yapıyoruz. Burada Xmx parametresini sunucunun hafıza kaynaklarına göre vermemiz gerekiyor, aksi taktirde OutOfMemory hatası ile karşılaşmamız normaldir:

-server
-Xmx2G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:PermSize=150M
-XX:MaxPermSize=150M
-XX:ReservedCodeCacheSize=150M
-Xbootclasspath/p:/var/presto/installation/lib/floatingdecimal-0.1.jar

etc/config.properties içerisinde ise Presto süreçleri ile ilgili ayarları yapıyoruz. Presto süreçleri Coordinator ve Worker süreçlerinden oluşuyor. Coordinator sürecini NameNode sunucusunda, Worker süreçlerini de DataNode sunucularında çalıştırmak mantıklı olabilir. Presto düğümleri birbirlerini Discovery Service üzerinden bulurlar. Bunu yaparken de tüm haberleşme http üzerinden yapılıyor. Bu yüzden ayarlar farklılaşıyor. Coordinator düğümünde ayarlar şöyle:

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://hostname:8888

Worker düğümünde ise şu şekilde olmalı:

coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery.uri=http://hostname:8888

Burada önemli parametrelerden birisi olan task.max-memory ile o sırada işlenen sorgu için kullanılabilecek maksimum hafıza miktarını belirtiyoruz. Özellikle group by, order by ve join işlemlerinde performans amacıyla işlemlerin tamamı hafızada yapıldığı için bu parametre doğru kullanılmalı. Az hafıza verilirse sorgular OutOfMemory hatası alıp tamamlanmayabilir.

Bitti sanıyorsanız yanılıyorsunuz. Bunların dışında ayrıca bir de Discovery servisini indirip kurmamız gerekiyor. Neden birlikte paketlenmediklerini, dökümantasyonda bu adımların neden olmadığı sorusunu kendi kendinize sorabilirsiniz.

wget http://central.maven.org/maven2/io/airlift/discovery/discovery-server/1.16/discovery-server-1.16.tar.gz
tar xvf discovery-server-1.16.tar.gz
ln -s /opt/presto/discovery-server-1.16 /opt/presto/discovery
mkdir /opt/presto/discovery/data /opt/presto/discovery/etc

Discovery servisi için de ayar dosyaları şu şekilde; discovery/etc/node.properties dosyası:

node.environment=test
node.id=node1-discovery
node.data-dir=/opt/presto/discovery/data

discovery/etc/config.properties dosyası:

http-server.http.port=8888

Bir de jvm.config ayarları:

-server
-Xmx1G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p

Son olarak bu ayarların dışında Presto ile sorgulamak istediğimiz verileri catalog ayarları ile tanımlamamız gerekiyor. Biz Hive ile entegre olacağımız için catalog dizini altına ilgili ayar dosyasını oluşturacağız.

Hive ile Entegrasyon

Devam etmeden önce Hive tarafında örnek tabloyu oluşturmak için her zaman kullandığımız NYSE verisini indirdikten sonra hive konsolundan şunları çalıştırabilirsiniz:

CREATE TABLE nyse (exchangeSymbol string, stockSymbol string, stockDate string, stockPriceOpen double, stockPriceHigh double, stockPriceLow double, stockPriceClose double, stockVolume int, stockPriceAdjClose double) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;

LOAD DATA LOCAL INPATH '/Users/devveri/dev/test/NYSE-2000-2001.tsv' OVERWRITE INTO TABLE nyse;

Hive ile ilgili daha fazla bilgiye ihtiyacınız varsa (biraz eskimiş de olsa) ilgili yazımıza bakabilirsiniz. Presto Hive’ın birçok farklı sürümünü destekliyor. Bunlar hive-hadoop1, hive-hadoop2, hive-cdh4, hive-cdh5 olarak zaten plugins klasörü altında görülebilir. Hive entegrasyonu için etc/catalog/hive.properties dosyasını oluşturuyoruz:

connector.name=hive-hadoop2
hive.metastore.uri=thrift://metastorehost:9083

hive.metastore.uri parametresi ile Hive metastore thrift adresini belirtiyoruz. Eğer daha önce yapmadıysanız Hive metastore servisini çalıştırmak için aşağıdaki komutu kullanabilirsiniz:

/opt/hive/bin/hive --service metastore

Presto süreçlerini başlatma ve durdurma

Presto süreçlerini başlatmak ve durdurmak için komut satırını kullanıyoruz:

bin/launcher start
bin/launcher stop

Küme olarak çalışması için Discovery servisinin de ayrıca başlatılması gerekiyor:

discovery/bin/launcher start

Log dosyalarını takip etmek isterseniz:

tail -f data/var/log/*

Presto komut satırı kullanımı

Bu kısım çok ilginç. Presto’yu komut satırından kullanmak isterseniz ilgili jar dosyasını ayrıca indirmeniz gerekiyor. Hangi kafayla bunu yaptıklarını gerçekten çok merak ediyorum. Neyse ki sizin için aşağıdaki komutları hazırladım:

wget http://central.maven.org/maven2/com/facebook/presto/presto-cli/0.75/presto-cli-0.75-executable.jar
chmod +x presto-cli-0.75-executable.jar
echo ./presto-cli-0.75-executable.jar --server localhost:8080 --catalog hive --schema default > presto-cli.sh

Artık presto-cli.sh ile Presto’ya istemci olarak bağlanabilir ve sorgularınızı çalıştırabilirsiniz:

$ ./presto.sh 
presto:default> show tables;
 Table 
-------
 nyse 
(1 row)

Query 20140827_215335_00015_96n4f, FINISHED, 1 node
Splits: 2 total, 2 done (100.00%)
0:00 [1 rows, 93B] [10 rows/s, 947B/s]

presto:default> select * from nyse limit 10;
 exchangesymbol | stocksymbol | stockdate | stockpriceopen | stockpricehigh | stockpricelow | stockpriceclose | stockvolume | stockpriceadjclose 
----------------+-------------+------------+----------------+----------------+---------------+-----------------+-------------+--------------------
 NYSE | ASP | 2001-12-31 | 12.55 | 12.8 | 12.42 | 12.8 | 11300 | 6.91 
 NYSE | ASP | 2001-12-28 | 12.5 | 12.55 | 12.42 | 12.55 | 4800 | 6.78 
 NYSE | ASP | 2001-12-27 | 12.59 | 12.59 | 12.5 | 12.57 | 5400 | 6.79 
 NYSE | ASP | 2001-12-26 | 12.45 | 12.6 | 12.45 | 12.55 | 5400 | 6.78 
 NYSE | ASP | 2001-12-24 | 12.61 | 12.61 | 12.61 | 12.61 | 1400 | 6.76 
 NYSE | ASP | 2001-12-21 | 12.4 | 12.78 | 12.4 | 12.6 | 18200 | 6.75 
 NYSE | ASP | 2001-12-20 | 12.35 | 12.58 | 12.35 | 12.4 | 4200 | 6.65 
 NYSE | ASP | 2001-12-19 | 12.42 | 12.6 | 12.35 | 12.6 | 10100 | 6.75 
 NYSE | ASP | 2001-12-18 | 12.37 | 12.5 | 12.37 | 12.41 | 10100 | 6.65 
 NYSE | ASP | 2001-12-17 | 12.4 | 12.52 | 12.4 | 12.52 | 8000 | 6.71 
(10 rows)

Query 20140827_215344_00016_96n4f, FINISHED, 1 node
Splits: 2 total, 2 done (100.00%)
0:01 [4.37K rows, 234KB] [5.82K rows/s, 312KB/s]

presto:default> select stockSymbol, sum(stockPriceClose) as total_value from nyse where stockVolume > 1000 group by stockSymbol order by total_value desc limit 10;
 stocksymbol | total_value 
-------------+--------------------
 WPO | 267022.80000000005 
 WTM | 117073.61 
 MTB | 106871.27 
 MKL | 82668.22 
 PC | 67790.19999999998 
 KYO | 60137.99999999997 
 JNPR | 59107.12999999994 
 BCS | 57008.43000000009 
 NVR | 56314.829999999994 
 SPW | 56300.86999999995 
(10 rows)

Query 20140827_215533_00018_96n4f, FINISHED, 1 node
Splits: 3 total, 3 done (100.00%)
0:04 [813K rows, 42MB] [217K rows/s, 11.2MB/s]

Bundan sonrasında Presto’yu incelemek, performans karşılaştırmaları yapmak size kalıyor. Bu yazımızı sevdiyseniz Spark SQL ve Impala yazılarımız da ilginizi çekebilir. Presto ile ilgili ayrıntıları kendi sitesinde bulabilirsiniz.

, , , ,

2 thoughts on “Facebook Presto

  • presto-user dedi ki:

    Guzel yazi, tesekkurler.

    >>Ancak arkasında bir topluluk veya ticari bir firma olmadığı için de geleceği konusunda kafamızda bir soru işareti olmuyor değil.

    Presto’nun arkasinda bir community olmadigi pek de dogru degil. Cok buyuk olmasa da aktif bir Presto community var. Dediginiz gibi ticari bir firma yok arkasinda ama production sistemlerinde Presto kullanan pek cok firma var.

  • Hakan İlter dedi ki:

    Discovery servis ile ilgili bir ekleme yapmam gerekti.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.