17 Ocak 2023 Salı

Spark Pool ve SQL Pool Arası İletişim Yöntemleri (Azure Synapse Analytics)

Modern LakeHouse veri yönetim mimarisinin uygulanabildiği önemli bir platform olan Azure Synapse Analytics hizmeti Data&Analytics konusunda muhteşem yetenekler sunuyor. 

Azure Synapse Analytics üzerindeki mevcut yetenekler bir yandan gelişmeye devam ederken, bir yandan da yeni yetenekler gündemimize giriyor.

Bu yazımızda neredeyse Synapse'in doğuşundan beri var olan iki yetenek yani Spark Pool ve SQL Pool arasındaki iletişime odaklanalım istiyorum. İki Pool arasındaki iletişimin hangi şekillerde olabileceği sorusu eğitimlerde sıkça sorulduğu için cevabın özetini yazılı hale getirmek ve sizlerle paylaşmak istedim. 

Bu yazıda söz konusu yöntemlerin detaylarını ele almanın öncelikli hedefim olmadığını belirteyim. Çünkü bu yöntemlerin bir kısmına ait detayları farklı makalelerde ele almıştık. Geriye kalanları da fırsat buldukça ele almayı planlıyorum.

Bu yazının konusuna geçmeden önce Synapse Analytics ile ilgili ilginizi çekeceğini düşündüğüm aşağıdaki makaleleri de sizlerle paylaşmak isterim:

Azure Synapse Analytics ile Bütünleşik Büyük Veri Analitiği - 1

Azure Synapse Analytics ile Bütünleşik Büyük Veri Analitiği - 2

Başlamadan önce bu iki Pool ile ilgili bazı hatırlatmalar yapalım:


  • SQL Pool, MPP mimarisine sahip SQL engine ile sunulan iki benzer SQL hizmetini temsil ediyor. Bunlar özetle veri tutacak bir tablo tanımlanamayan Serverless SQL Pool ve bildiğimiz anlamda tablolarında veri tutabilen Dedicated SQL Pool hizmetleridir. 
  • Spark Pool ise Distributed mimariye sahip optimize edilmiş bir Spark engine ile sunulan bir Spark hizmetidir. 
  • Dedicated SQL Pool ve Spark Pool hizmetlerinden birden fazla açmanız mümkün. Serverless SQL Pool ise Synapse hizmeti ayağa kalktığında kullanıma sunulur ve kapatılamaz.
  • Spark Pool tarafında Managed ve Unmanaged (external) tablo oluşturabilir ve bu tabloları Hive'a kaydedilebilirsiniz. Verileri Hive'a kaydetmeden doğrudan depolama birimine yazmak da mümkün.
  • Serverless SQL Pool tarafında CET (Create Extertal Table) ile depolama birimindeki verileri okuyabilir, bir SELECT çıktısını CETAS (Create Externatal Table As Select) ile depolama birimine kaydedebilirsiniz. Dedicated SQL Pool tarafında ek olarak CT (Create Table) ile fiziksel veri tutabilen tablolar oluşturabilirsiniz.
Hadi gelin şimdi SQL Pool ve Spark Pool arasındaki iletişim yöntemlerine bir göz atalım:


Azure Storage Account Üzerinden İletişim


Synapse hizmeti ayağa kaldırıldığında bağlı bir hizmet olarak Data Lake Storage Gen 2 depolama hizmeti de ayağa kalkar. Bu depolama hizmeti büyük verinin verimli şekilde işlenmesi için gerekli özelliklere sahiptir. 

Dilerseniz daha sonra faklı bir Storage Account ekleyebilir veya mevcut Storage Accountlarınızı kullanabilirsiniz. Storage Accountlardaki dosyalara erişmek için eğer public değilse için Access Key, Shared Access Signature, User Identity, Managed Identity seçeneklerini tercih edebilirsiniz.

Spark Pool tarafından bu Storage Accountlara kolayca erişebilir, verileri işleyebilir ve çıktıları tekrar Storage Accounta kaydedebilirsiniz. Hemen ardından SQL Pool tarafından OPENROWSET fonksiyonu ve Polybase Engine desteği ile Storage Accounttaki verilere erişebilirsiniz. 

Ayrıca Dedicated SQL Pool, COPY scripti ile depolama birimlerindeki verileri yüksek hızda tabloya kopyalama özelliğine sahiptir.

SQL Pool tarafından depolama birimindeki verileri okuma konusuyla alakalı olan Data Virtualization konusuna bir göz atmak isterseniz şu videoyu incelemenizi tavsiye ederim:

Data Virtualization in Azure Synapse Analytics with SQL Pool 

Shared Metadata Özelliği ile İletişim (Serverless SQL Pool için)


Shared Metadata veya Metastore özelliği sayesinde oluşturduğumuz Lake Database tanımı Spark Poollarında Hive veritabanı olarak, Serverless SQL Pool tarafında da ayrı bir veritabanı olarak görünür.

Bu ortak veritabanındaki tablolara her iki tür Pool üzerinden de erişebiliriz. Tabi ki bu tablolar Serverless SQL Pool tarafında external table olarak görüneceğinden veri girişlerini Spark Pool üzerinden yapmanız gerekir.

Shared Metadata konusunda daha yakından bakmak isterseniz aşağıdaki yazımıza bir göz atabilirsiniz:

Azure Synapse Analytics üzerinde Lake Database Kullanımı ve Shared Metadata Deneyimi

Microsoft'un JDBC Connectorü ile İletişim


Apache Spark, SQL enginee bağlantı kurulmasını sağlayan genel bir JDBC connectorüne sahip. Buna ek olarak Microsoft özel bir JDBC connector geliştirdi. Microsoft'un geliştirmiş olduğu bu connector SQL enginea bağlantı konusunda genel JDBC connectorundan 15 kata kadar daha yüksek hız vaat ediyor.

Maven kütüphaneleri arasında "com.microsoft.azure:spark-mssql-connector" ismiyle yer alan bu connectorü Spark ortamına yüklemeniz gerekir. Sonrasında mesela bir tablo okumak için spark.read.format("com.microsoft.azure:spark-mssql-connector") şeklinde başlayan bir kod parçasına diğer option parametrelerini de ekleyerek SQL enginelara bağlantı kurabilirsiniz.

SqlAnalyticsConnector ile İletişim (Dedicated SQL Pool için)


Dedicated SQL Pool, Serverless SQL Pool'a ek olarak fiziksel tablo tutma özelliğine sahiptir demiştik. MPP mimarisine sahip bu engine 60 depolama segmenti ve 60 compute node ile büyük veri işleme konusunda oldukça etkili. Tekil işlemlerden ziyade toplu (bulk) işlemlerde ve özellikle sıkıştırmanın uygulandığı noktalarda bu mimarinin şovunu hayranlıkla izliyoruz.

Microsoft, Spark Pool ve Dedicated SQL Pool arasında doğal bir iletişim imkanı veren Scala da yazılmış bir Spark kütüphanesi sunuyor. Bu kütüphane ile Spark tarafındaki bir dataframe Dedicated SQL Pool tarafında bir tablo olarak kaydedilebilir. Ayrıca Dedicated SQL Pool tarafındaki bir tablo Spark Pool'dan kolayca okunabilir.

SQL tarafındaki verilerle harmanlanarak, Spark tarafında işlenen büyük verinin (Bronze, Silver Table), son tüketiciye (Rapor geliştiricileri) sunulduğu ve interaktif sorgulara cevap vermek üzere index, istatistik, meteralized view, caching özellikleriyle desteklendiği bir tablo (Gold Table) haline getirildiğini düşünün. Bu senaryonun gerçekleştirilmesi için iki Pool arasındaki iletişimi bir fonksiyonla sağlamak önemli bir konfor.

org.apache.spark.sql.SqlAnalyticsConnector._ ve com.microsoft.spark.sqlanalytics.utils.Constants isimli Scala modullerini import ettikten sonra, mesela SQL Pool'daki tabloyu okumak için spark.read.sqlanalytics("<DBName>.<Schema>.<TableName>") ifadesini diğer option parametrelerini de ekleyerek kullanabilirsiniz. 

Bu özellik her ne kadar Scala üzerinde olsa da oluşan DataFrame nesnelerini Tempview veya GlobalTempView olarak kaydedip farklı bir dil, mesela Python ile okuyabilirsiniz.

Spark Pool tarafındaki mevcut bir dataframei (adı df olsun) Dedicated SQL Pool'a tablo olarak kaydetmek isterseniz. Yine Scala ile df.write.sqlanalytics("<DBName>.<Schema>.<TableName>", Constants.INTERNAL) şeklinde bir kod parçası kullanabilirsiniz. Constants.INTERNAL ifadesi normal bir tablo oluştururken Constants.EXTERNAL ifadesi ile bir external tablo oluşturabilirsiniz.

Bu kodlarda geçen sqlanalytics fonksiyonunun ileride desteklenmeyeceği açıklanıyor, bunun yerine yeni synapsesql fonksiyonunu kullanmanızı öneririm.

Son Söz


Farklı şartlar altında ve farklı ihtiyaçlar doğrultusunda farklı yöntemler kullanılabilir. İhtiyacınıza ve içinde bulunduğunuz şartlara göre bir veya daha fazla yönteme yönelebilirsiniz.

Evet! Bazılarımızın bu yöntemlerin nasıl uygulandığını merak ettiğini ve bu yazıda görmek isteyebileceğini tahmin edebiliyorum. Fakat bu yazımızın amacı iki temel Pool arasındaki iletişim hakkında genel bir fikir vermekti. Bu noktada amacımıza ulaştığımızı düşünüyorum. 

Yöntemlerin uygulanması konusunda bir çok kaynağa kolayca ulaşabilirsiniz. Bazılarını blog yazılarımız ve video yayınlarımız arasında da bulabilirsiniz.

Hiç yorum yok:

Yorum Gönder