Facebook Presto
Presto, 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.
Spark SQL Cloudera Hadoop Developer Eğitimi
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.
Discovery servis ile ilgili bir ekleme yapmam gerekti.