Presto ile S3 &Oracle join işlemi nasıl yapılır?

Genellikle farklı ortamlarda (HDFS,S3,RDBMS vb.) tutulan verileri bir araya getirip analiz edebilmek için ETL/ELT yöntemleri ile veriyi taşımak zorunda kalıyoruz. Bu durum hem operasyonel olarak hem de finansal olarak maliyetli bir işlem. Bu yazımda veriyi bulunduğu ortamlardan (S3 ve Oracle) taşımadan Presto ile nasıl sorgulayabileceğimizi göreceğiz.

Presto, ilk olarak Facebook tarafından geliştirilmeye başlanmış daha sonra Presto Foundation (Linux Foundation tarafından da destekleniyor) tarafından desteklenen gigabayttan petabaytlara kadar her boyuttaki farklı veri kaynaklarına karşı etkileşimli analitik sorguları çalıştırmak için kullanılan açık kaynaklı SQL sorgu motorudur.

S3 ise (Simple Storage Service), dosya(object) olarak verilerinizi saklamanızı sağlayan AWS ürünüdür.

Büyük Veri Analitiğinde veriden anlamlı bilgi çıkarma ve verilerden değer elde edebilmek için temel olarak kullanıdığımız uygulamalar (SQL,Hive,Spark,Presto,Athena vb.) ile structure, semi-structure ve un-structure yapıdakı daha önceden kaydettiğimiz yada stream dataların (HDFS,S3,Cloud,Kafka vb.) okunarak bir kaynak üzerinde hesaplanmasıdır. (Yarn,Mesos,Kubernetes vb..)

Bu çalışma için kendi yarattığım docker image’ı kullandım. Halihazırda kullandığınız Presto kurulumu varsa docker image oluşturma adımlarını geçerek Presto’nun bulunduğu klasör (presto-server/etc/catalog) altında hive.properties ve oracle.properties filelarını aşağıdaki örnekte olduğu gibi oluştabilirsiniz. Sonrasında Presto’nun kurulu olduğu server/container’ı restart etmeniz yeterli olacaktır.

Hive için C:\Git\prestoS3\etc\catalog altında :

Presto S3 de tutulan bir veriyi okuyabilmek için hive’ın metastore’una ihtiyaç duyuyor. Bu nedenle hive konfigürasyon bilgilerini ve s3 bağlantı bilgilerini ‘properties’ file olarak vermek gerekiyor.

hive.properties file’ı yaratıp içerisine aşağıdaki şekilde s3 servernıza bağlanabilmeniz için endpoint, access-key ve secret-key bilgilerinizi girip kaydetmelisiniz.

Eğer hazırda kurulu bir hive metastore server varsa onu da kullanabilirsiniz. ( https://prestodb.io/docs/current/connector/hive.html)
Ben metadatayı docker image içerisinde file olarak tutmayı tercih ettiğim için bu şekilde tanımladım.

connector.name=hive-hadoop2
hive.recursive-directories=true
hive.allow-drop-table=true
hive.metastore=file
hive.metastore.catalog.dir=file:///tmp/hive_catalog
hive.metastore.user=root

hive.s3.use-instance-credentials=true
hive.s3.endpoint=<hostname veya ip>:<port>
hive.s3.aws-access-key=<access-key>
hive.s3.aws-secret-key=<secret-key>

Oracle için C:\Git\prestoS3\etc\catalog altında :

oracle.properties file yaratıp, aşağıdaki şekilde Oracle veri tabanınıza bağlanabilmeniz için içerisine database bilgilerinizi girip kaydetmelisiniz.

https://prestodb.io/docs/current/connector/oracle.html den farklı olarak bu şekilde tanımlamamın nedeni presto ile gelen connectorün oracle 19.1 versiyonu ile uyumlu olmaması. Çözüm olarak presto ile gelen jarları ojdbc8.jar ve orai18n.jar ile değiştirdim. Bu connectorler kullandığınız Oracle versiyonuna göre değişiklik göstereceğinden benzer bağlantı sorunlarını yaşayabilirsiniz. Çözüm için presto connectorlerin bulunduğu path’e (/opt/presto/plugin/oracle/ ) https://download.oracle.com/otn-pub/otn_software/jdbc den kullandığınız oracle database versiyonuna uygun jarları indirmelisiniz.

connector.name=oracle
connection-url=jdbc:oracle:thin:user-name/password@//hostname:port/dbname

Bu adımlarda bittikten sonra docker image’i build edip çalıştırabiliriz.

win+r >> cmd >> cd C:\Git\prestoS3\ >> docker-compose up

Presto CLI için :

win+r >> cmd >> docker exec -it prestoS3 bin/presto-cli >> bash

Prestoya CLI yerine DBeaver, Apache Zeppelin vb. toollar ile de bağlanabiliriz. Bağlantı için com.facebook.presto.jdbc.PrestoDriver.jar yüklenmesi yeterli.

DBeaver ile bağlanablilmek için:

Ve son adım.. S3 de bulunan file’ı sorgulayabilmek için tablo yaratıp Oracle databaseindeki tablo ile join yapıyoruz.

Bir önceki yazımda bahsettiğim deltalake filelarınıda S3 den aynı yöntemle erişmeniz mümkün. Bunun için deltalake’in bulunduğu bucket’ı göstermeniz yeterli.

Örneğin: CREATE TABLE s3_read_delta ( id bigint) WITH ( format = ‘PARQUET’, external_location = ‘s3://delta/’);

Eğer stream datayı deltalake yazıyorsanız bu yöntemlede son kullanıcıya servis edebilirsiniz.

Birden fazla Oracle,Hive, vb. kaynağı(database,hdfs, vb.) tanımlamak için presto catalog altındaki “properties” uzantılı fileları düzenleyip isimlendirmeyi database adında yapabilirsiniz. Örneğin: Oracle da “HR” databaseinede bağlanmak istenirse hr.properties file yaratılıp bağlantı bilgileri ile kaydedildikten sonra presto server/container restart edilir. Sonrasında presto-cli’a bağlandıktan sonra show catalogs ; komutu ile yeni oracle database’i görebilir yada DBeaver ile bağlanıldığında sol tarafta hr olarak görüntülenebilir.

Kaynaklar :

Data Engineer