Apache Hive: Tarihçesi, Çalışma Mantığı ve Uygulama Alanları

Mehmet_ISIK
10 min read2 days ago

--

  1. Giriş
  2. Hive’ın Tarihçesi ve Neden Ortaya Çıktı?
    2.1. Hive’ın İlk Geliştirilişi
    2.2. Veritabanı ve Büyük Veri İhtiyacı
    2.3. Apache Topluluğuna Devri
  3. Hive Nedir ve Ne İçin Kullanılır?
    3.1. Hive’ın Tanımı
    3.2. SQL Benzeri Sorgulama Dili (HiveQL)
    3.3. Veri Ambarı Çözümü Olarak Hive
    3.4. Hangi Durumlar İçin Uygun?
  4. Hive’ın Çalışma Mantığı
    4.1. HiveQL ve Arka Planda Çalışan Motorlar
    4.2. Batch Processing (Toplu İşleme)
    4.3. MapReduce, Tez ve Spark Üzerinde Çalışma
    4.4. Optimizasyon
  5. Metastore Nedir?
    5.1. Metastore’un Tanımı
    5.2. Metastore’un Yapısı
    5.3. Meta Verilerin Yönetimi
    5.4. Hive Metastore’un Rolü
  6. Hive’ın Bileşenleri ve İç Yapısı
    6.1. Driver
    6.2. Compiler
    6.3. Optimizer
    6.4. Executor
    6.5. Hive Web Interface, Thrift Server ve Beeline
  7. Beeline ile Hive Arasındaki İlişki
    7.1. Beeline Nedir?
    7.2. Beeline ve Hive CLI Farkları
    7.3. JDBC ve ODBC Desteği
    7.4. Beeline’ın Kullanım Alanları
  8. Hive Tabloları: İç ve Dış Tablolar
    8.1. İç Tablolar (Internal Tables)
    8.2. Dış Tablolar (External Tables)
    8.3. İç ve Dış Tablolar Arasındaki Farklar
    8.4. Tabloların Yönetimi
  9. Hive Fonksiyonları ve Veri Türleri
    9.1. Veri Türleri
    9.2. Sayısal Veri Türleri
    9.3. Metin Veri Türleri
    9.4. Karmaşık Veri Türleri
    9.5. Fonksiyonlar
  10. Hive Partitions ve Buckets
    10.1. Partitioning (Bölümleme)
    10.2. Static vs Dynamic Partitioning
    10.3. Bucketing (Kovalama)
    10.4. Partitioning ve Bucketing Arasındaki Fark
  11. Hive’da Performans Optimizasyonu
    11.1. Partitioning ve Bucketing Kullanımı
    11.2. Indeksleme (Indexing)
    11.3. Join Optimizasyonu
    11.4. Query Caching ve Lazy Evaluation
    11.5. Tez ve Spark Kullanımı
  12. Hive’ın Kullanım Alanları
    12.1. Veri Ambarı Çözümleri
    12.2. Büyük Veri Analitiği
    12.3. ETL Süreçlerinde Hive
    12.4. Log Analizi ve Raporlama
    12.5. Veri Bilimi Projeleri
  13. Sonuç
Resim — 1: Apache Hive

1. Giriş

Hoşgeldiniz!

Büyük veri dünyasında, veriyi etkin bir şekilde işleme ve yönetme ihtiyacı, her zamankinden daha kritik bir hal almıştır. Modern işletmeler ve veri yoğun sistemler, büyüyen veri hacimlerine hızlı ve esnek çözümler sunmak için güçlü araçlara ihtiyaç duyarlar. Bu noktada Apache Hive, büyük veri analitiği ve veri ambarı çözümleri için geliştirilmiş en popüler teknolojilerden biri olarak karşımıza çıkıyor. Bu yazımızda, Hive’ın tarihçesini, çalışma mantığını ve çeşitli uygulama alanlarını detaylı bir şekilde inceleyeceğiz. Hive, SQL benzeri bir sorgu dili kullanarak HDFS üzerinde büyük veri kümelerini işleme yeteneği sunar ve kullanıcılarına büyük veriyi kolayca sorgulama imkanı tanır. Adım adım ilerleyerek, Hive’ın nasıl çalıştığını, nerelerde kullanıldığını ve büyük veri analitiğinde neden kritik bir rol oynadığını keşfedeceğiz. Bu rehber, Hive’ı daha iyi anlamanız ve büyük veri stratejilerinizi daha etkili bir şekilde şekillendirmenize yardımcı olacak.

2. Hive’ın Tarihçesi ve Neden Ortaya Çıktı?

2.1. Hive’ın İlk Geliştirilişi

  • Hive, Facebook tarafından 2008 yılında geliştirildi. O dönemde, Facebook’un büyük veri analizleri için daha hızlı ve esnek bir çözüme ihtiyacı vardı. Geleneksel veritabanı çözümleri, büyük veri hacimlerini işlemek için yeterli gelmiyordu. Hive, bu soruna çözüm olarak ortaya çıktı.

2.2. Veritabanı ve Büyük Veri İhtiyacı

  • Facebook’un büyüyen veri hacmi ve analitik ihtiyaçlarına karşılık, yapılandırılmış verilerin SQL benzeri bir dil ile işlenmesi gerekiyordu. Ancak bu verilerin HDFS üzerinde dağıtık şekilde saklanıp işlenmesi gerekiyordu. Hive, HDFS üzerine oturan bir veri ambarı çözümü olarak bu boşluğu doldurdu.

2.3. Apache Topluluğuna Devri

  • Facebook’un iç çözümü olarak başlayan Hive, açık kaynak olarak 2010 yılında Apache Software Foundation’a devredildi. Apache Hive, kısa sürede büyük veri ekosisteminde popüler hale geldi ve birçok şirket tarafından kullanılmaya başlandı.

3. Hive Nedir ve Ne İçin Kullanılır?

3.1. Hive’ın Tanımı

  • Hive, büyük veri kümeleri üzerinde SQL benzeri sorgular çalıştırarak veri ambarı işlemleri yapmamızı sağlayan bir veri işleme platformudur. HDFS (Hadoop Distributed File System) üzerine inşa edilmiş olan Hive, yapılandırılmış verileri kolayca sorgulayıp analiz edebilmek için geliştirilmiştir.

3.2. SQL Benzeri Sorgulama Dili (HiveQL)

  • Hive, SQL benzeri bir sorgu dili olan HiveQL (Hive Query Language) kullanır. Bu dil, SQL bilen kullanıcıların büyük veri kümeleri üzerinde sorgu çalıştırmasını kolaylaştırır. HiveQL, SQL’in birçok özelliğini destekler, ancak bazı gelişmiş SQL fonksiyonları ve operasyonlarını yerine getiremez.

3.3. Veri Ambarı Çözümü Olarak Hive

  • Hive, özellikle büyük verileri sorgulamak ve analiz etmek amacıyla kullanılan bir veri ambarı çözümüdür. SQL benzeri dili sayesinde veri bilimciler, analistler ve veri mühendisleri tarafından sıklıkla tercih edilir. Hadoop ekosisteminde, büyük veri kümeleri üzerinde veri ambarı işlevlerini yerine getirir.

3.4. Hangi Durumlar İçin Uygun?

  • Hive, büyük veri kümeleri üzerinde toplu işleme (batch processing) yapmak için idealdir. Özellikle çok büyük veri setlerinde analitik işlemler yapmak isteyen şirketler için uygundur. Ancak, gerçek zamanlı (streaming) veri işlemleri için uygun değildir. Ayrıca, Hive, daha çok ağır ve karmaşık analitik sorgular için optimize edilmiştir.

4. Hive’ın Çalışma Mantığı

4.1. HiveQL ve Arka Planda Çalışan Motorlar

  • Hive, SQL benzeri HiveQL diliyle yazılan sorguları kullanır. Bu sorgular doğrudan veritabanında çalışmaz; bunun yerine Hive, sorguları HDFS üzerinde çalışan dağıtık işleme motorlarına çevirir. Başlangıçta yalnızca MapReduce motorunu destekleyen Hive, şimdi Tez ve Spark gibi daha hızlı motorlarla da entegre çalışabilir.

4.2. Batch Processing (Toplu İşleme)

  • Hive, genellikle toplu işleme (batch processing) mantığına dayanır. Bu, büyük veri setlerini parçalar halinde işleyerek sonuçlara ulaşmayı sağlar. Hive, sorguları parçalara ayırıp dağıtık bir şekilde işleyerek yüksek veri hacimlerinde etkili sonuçlar almayı mümkün kılar.

4.3. MapReduce, Tez ve Spark Üzerinde Çalışma

  • Hive, sorguları çalıştırırken arka planda MapReduce, Apache Tez ya da Apache Spark gibi dağıtık işlem motorlarını kullanır. Hangi motorun kullanılacağı, sistemin konfigürasyonuna ve Hive’ın optimize edilme biçimine bağlıdır. MapReduce, daha eski ve yavaş bir yöntemken, Tez ve Spark ile çok daha hızlı sonuçlar alınabilir.

4.4. Optimizasyon

  • Hive, sorguların verimli bir şekilde çalışması için çeşitli optimizasyon teknikleri kullanır. Örneğin, sorgu çalıştırma sırasında gereksiz işlemleri atlamak, veriyi bölümlere ayırmak (partitioning) veya veriyi segmentlere ayırarak daha hızlı işlemek için kovalar (bucketing) kullanmak gibi yöntemlerle performansı artırabilir.

5. Metastore Nedir?

5.1. Metastore’un Tanımı

  • Hive Metastore, Hive sisteminde kritik bir bileşendir. Metastore, Hive’da oluşturulan veritabanları, tablolar, bölümler (partitions) ve kolonlar gibi meta verileri (metadata) yönetir ve saklar. Bu meta veriler, veri kümesinin HDFS’te nerede saklandığını, veri tiplerini ve tablo yapısını içeren bilgileri içerir.

5.2. Metastore’un Yapısı

  • Hive Metastore, genellikle bir RDBMS (Relational Database Management System) üzerinde çalışır. MySQL, PostgreSQL veya Oracle gibi ilişkisel veritabanları bu amaçla kullanılabilir. Hive Metastore, bu veritabanı üzerinde metadata bilgilerini saklar ve sorgular.

5.3. Meta Verilerin Yönetimi

  • Hive, HDFS üzerindeki fiziksel verileri değil, bu verilerin meta verilerini Metastore’da saklar. Örneğin, bir Hive tablosu oluşturulduğunda, tablonun hangi HDFS dosyasında bulunduğu ve kolonlarının veri türleri gibi bilgiler Metastore’da saklanır.

5.4. Hive Metastore’un Rolü

  • HiveQL sorguları çalıştırılırken Metastore, tablo ve veri yapısına dair bilgileri sağlayarak sorguların doğru şekilde işlenmesini sağlar. Ayrıca, Metastore, veri bölümlendirme ve kovalama gibi optimizasyonların da düzgün çalışmasını sağlar.

6. Hive’ın Bileşenleri ve İç Yapısı

  • Hive, dört ana bileşenden oluşur: Driver, Compiler, Optimizer ve Executor. Bu bileşenler, HiveQL sorgularını işleyerek sonuca ulaşılmasını sağlar.

6.1. Driver

  • Hive Driver, HiveQL sorgusunun Hive’a iletildiği ilk noktadır. Driver, kullanıcının girdiği sorguyu alır ve çalıştırılacak işlemleri sıraya koyar. Sorgunun tüm adımlarını izler ve hata kontrolünü yapar.

6.2. Compiler

  • Driver’dan gelen HiveQL sorgusu, Compiler bileşeni tarafından alınıp analiz edilir. Compiler, sorguyu MapReduce, Tez veya Spark gibi motorlar tarafından işlenebilir hale getirir. Sorgunun HDFS dosya sistemi ile olan ilişkisini belirler ve işlemleri optimize eder.

6.3. Optimizer

  • Hive’ın Optimizer bileşeni, sorguyu daha verimli hale getirmek için çeşitli optimizasyon teknikleri uygular. Örneğin, veri bölümlendirme (partitioning) veya birleştirme (join) işlemleri sırasında gereksiz işlemleri atlamak gibi optimizasyonlar yapılır. Amaç, sorgunun en kısa sürede ve en az kaynak kullanılarak işlenmesini sağlamaktır.

6.4. Executor

  • Executor, optimize edilmiş sorguyu alır ve işleme koyar. Bu aşamada, sorgu MapReduce, Tez ya da Spark motorlarına iletilir ve işlem tamamlanana kadar takip edilir. Sonuçlar hazır olduğunda kullanıcıya geri iletilir.

6.5. Hive Web Interface, Thrift Server ve Beeline

  • Hive, sorguların çalıştırılması için çeşitli arayüzler sunar. Hive Web Interface, Hive’ın web tabanlı bir arayüzüdür; Thrift Server ise Hive’a uzaktan bağlanmayı sağlayan bir servistir. Beeline ise Hive’ın komut satırı arayüzüdür ve JDBC/ODBC üzerinden çalışır.

7. Beeline ile Hive Arasındaki İlişki

7.1. Beeline Nedir?

  • Beeline, Hive’ın komut satırı arayüzü (CLI) olarak bilinen ve JDBC üzerinden Hive’a erişim sağlayan bir araçtır. Hive CLI ile benzer şekilde çalışsa da Beeline, özellikle uzak bağlantılar ve JDBC/ODBC desteği açısından daha esnektir.

7.2. Beeline ve Hive CLI Farkları

  • Geleneksel Hive CLI, Hive Server’a doğrudan bağlı olarak çalışır ve veritabanı üzerinde sorgu çalıştırır. Ancak Beeline, Hive Server üzerinden JDBC bağlantısıyla çalıştığı için daha güvenli ve esnek bir yapı sunar. Bu yapı, özellikle uzaktan erişim ve bağlantı yönetimi açısından avantaj sağlar.

7.3. JDBC ve ODBC Desteği

  • Beeline, JDBC (Java Database Connectivity) üzerinden Hive’a bağlanır. Bu sayede uzaktan erişim mümkün hale gelir ve veritabanı sorguları daha güvenli bir şekilde çalıştırılabilir. Ayrıca Beeline, Hive’a ODBC desteği sunarak diğer veri tabanı yönetim sistemleriyle entegrasyon sağlar.

7.4. Beeline’ın Kullanım Alanları

  • Beeline, özellikle veri analistleri ve mühendisleri için uzaktan erişim ve sorgu çalıştırmada kritik bir araçtır. JDBC/ODBC desteği sayesinde, farklı platformlardan Hive Server’a bağlanmak ve büyük veri kümelerini sorgulamak mümkündür.

8. Hive Tabloları: İç ve Dış Tablolar

8.1. İç Tablolar (Internal Tables)

  • Hive’da oluşturulan iç tablolar, HDFS üzerinde depolanan veri kümelerini yönetir. Bir iç tablo oluşturulduğunda, veriler HDFS’te belirli bir konuma kaydedilir ve Hive tarafından kontrol edilir. Bu tablolarda veri eklendiğinde, Hive bu verilerin depolanmasını ve yönetilmesini otomatik olarak sağlar.

8.2. Dış Tablolar (External Tables)

  • Dış tablolar, Hive tarafından değil, başka bir sistem veya kullanıcı tarafından yönetilen veri setlerini temsil eder. Hive, dış tablolardaki verileri yalnızca okur ve HDFS üzerinde fiziksel olarak veri saklamaz. Bu tablolar kullanıcılara, veri silindiğinde dosyaların korunmasını sağlar ve verilerin başka bir sistemle birlikte kullanılmasına olanak tanır.

8.3. İç ve Dış Tablolar Arasındaki Farklar

  • İç tablolar oluşturulduğunda, Hive veriyi HDFS’te yönetir ve tablo silindiğinde veri de silinir. Dış tablolarda ise sadece Hive tablosu silinir, fakat veri dosyaları HDFS’te kalmaya devam eder. Bu fark, verilerin güvenliği ve sürdürülebilirliği açısından önemli bir rol oynar.

8.4. Tabloların Yönetimi

  • İç ve dış tablolar HiveQL kullanılarak yönetilir. Tablo oluşturma, silme, veri ekleme gibi işlemler HiveQL sorgularıyla yapılır. Ayrıca tablo bölümlendirme ve indeksleme işlemleriyle veri sorgulama süreçleri optimize edilebilir.

9. Hive Fonksiyonları ve Veri Türleri

9.1. Veri Türleri

  • Hive, birçok farklı veri türünü destekler. Bunlar arasında sayısal veri türleri (int, bigint, float, double), metin veri türleri (string, char, varchar), tarih ve zaman veri türleri (date, timestamp), ve karmaşık veri türleri (array, map, struct) yer alır. Bu çeşitli veri türleri sayesinde, kullanıcılar büyük veri kümelerini esnek bir şekilde yönetebilir ve işleyebilir.

9.2. Sayısal Veri Türleri

  • Hive, tam sayı (int, bigint) ve ondalıklı sayı (float, double) veri türlerini destekler. Bu veri türleri, özellikle sayısal analizler ve hesaplamalar yaparken kullanışlıdır.

9.3. Metin Veri Türleri

  • Metin veri türleri arasında string, char ve varchar yer alır. String, değişken uzunluktaki metin verilerini depolarken, char ve varchar belirli uzunluktaki metin verilerini depolar. Metin manipülasyonları ve metin arama işlemleri bu veri türleri üzerinden yapılır.

9.4. Karmaşık Veri Türleri

  • Hive, büyük veri kümelerinde daha karmaşık verileri yönetmek için array, map ve struct gibi karmaşık veri türlerini de destekler. Örneğin, bir array bir dizi veriyi depolarken, map anahtar-değer (key — value)çiftlerini depolar. Struct ise birden fazla veri türünü bir arada tutarak kompleks veri yapıları oluşturur.

9.5. Fonksiyonlar

  • Hive, veri işleme sırasında kullanılan birçok fonksiyona sahiptir. Örnek olarak:
  • Matematiksel Fonksiyonlar: abs(), ceil(), floor(), round()
  • Metin Manipülasyon Fonksiyonları: concat(), substr(), upper(), lower()
  • Tarih ve Zaman Fonksiyonları: unix_timestamp(), date_add(), date_sub()

10. Hive Partitions ve Buckets

10.1. Partitioning (Bölümleme)

  • Hive’da partitioning, büyük veri kümelerini mantıksal alt kümelere ayırarak sorgulama işlemlerini hızlandırmak için kullanılan bir tekniktir. Partitioning, verilerin belirli bir sütuna göre bölümlenmesini sağlar, bu sayede yalnızca ilgili bölümdeki veriler sorgulanır. Örneğin, bir tarih sütununa göre veri bölümlendiğinde, sadece ilgili tarihlerdeki veriler üzerinde işlem yapılır, bu da sorgu performansını artırır.

10.2. Static vs Dynamic Partitioning

  • Statik Partitioning: Tabloları önceden belirlenmiş bir kritere göre bölümlendirir. Örneğin, bir tablo yıl, ay veya gün bazında statik olarak bölümlenebilir.
  • Dinamik Partitioning: Veri yüklenirken Hive’ın otomatik olarak bölümleri oluşturmasını sağlar. Bu yöntem, özellikle büyük veri kümelerinde bölümlendirme işini kolaylaştırır.

10.3. Bucketing (Kovalama)

  • Bucketing, verileri daha küçük gruplara (kovalara) ayırma işlemidir. Bu yöntem, partitioning ile birlikte kullanılarak verilerin daha verimli bir şekilde yönetilmesini sağlar. Veriler, belirli bir sütun veya kriter bazında kovalara ayrılır. Bu, özellikle belirli anahtarlara göre sorgu yaparken performansı artırabilir.

10.4. Partitioning ve Bucketing Arasındaki Fark

  • Partitioning, verileri belirli bir kriterle gruplandırırken, bucketing verileri rastgele bir şekilde daha küçük parçalara böler. Partitioning, verilerin mantıksal bölümlere ayrılmasını sağlarken, bucketing veri üzerinde daha hızlı işlem yapılmasını sağlar.

11. Hive’da Performans Optimizasyonu

11.1. Partitioning ve Bucketing Kullanımı

  • Hive’da büyük veri kümeleri üzerinde yapılan sorguların daha hızlı ve verimli olabilmesi için partitioning ve bucketing teknikleri sıkça kullanılır. Verileri mantıksal gruplara ayırmak ve bölümlere/kovalara bölmek, sorguların yalnızca ilgili veri parçaları üzerinde çalışmasını sağlar, böylece performans artışı sağlanır.

11.2. Indeksleme (Indexing)

  • Hive’da indeksleme, tablolar üzerinde yapılan sorguların hızını artırmak için kullanılan bir diğer tekniktir. İndeksler, tablolar üzerinde sık sorgulanan sütunlar için oluşturulur ve verilerin daha hızlı bulunmasını sağlar. Ancak, indekslerin oluşturulması ve güncellenmesi ekstra maliyet getirebilir, bu nedenle büyük veri setlerinde dikkatli kullanılması önerilir.

11.3. Join Optimizasyonu

  • Hive, büyük veri kümeleri üzerinde join işlemleri gerçekleştirirken, optimizasyon teknikleri kullanarak işlem süresini kısaltabilir. Özellikle MapJoin gibi teknikler, küçük tabloların bellekte tutulmasını sağlayarak join işlemlerini daha hızlı hale getirir. Büyük veri setleriyle çalışırken join sıralaması ve stratejisi de önemli bir rol oynar.

11.4. Query Caching ve Lazy Evaluation

  • Hive, belirli sorguların sonuçlarını önbelleğe alarak (query caching) sonraki sorgularda hız kazanmayı sağlar. Ayrıca, lazy evaluation gibi teknikler, işlemleri yalnızca gerekli olduğunda yaparak gereksiz hesaplamalardan kaçınır ve performansı artırır.

11.5. Tez ve Spark Kullanımı

  • Hive’da daha hızlı ve verimli sorgu yürütme motorları olan Tez ve Spark kullanılabilir. Tez, MapReduce’un yerini alarak daha hızlı ve düşük gecikmeli sorgular sunarken, Spark ise bellek içi hesaplama kabiliyeti ile performansı daha da artırabilir.

12. Hive’ın Kullanım Alanları

12.1. Veri Ambarı Çözümleri

  • Hive, büyük veri kümelerini sorgulamak ve analiz etmek için bir veri ambarı çözümü olarak kullanılır. Özellikle yapılandırılmış verilerin HDFS üzerinde depolanıp SQL benzeri sorgularla analiz edilmesi gereken durumlarda tercih edilir. Hive, bu anlamda geleneksel veri ambarı teknolojilerine alternatif sunar.

12.2. Büyük Veri Analitiği

  • Hive, büyük veri analitik platformlarının önemli bir bileşenidir. Veri analistleri, veri bilimciler ve mühendisler, büyük veri kümeleri üzerinde karmaşık sorgular çalıştırmak için Hive kullanır. Özellikle periyodik raporlamalar, toplu veri işlemleri ve veri analizleri için uygundur.

12.3. ETL Süreçlerinde Hive

  • Hive, büyük veri kümeleri üzerinde ETL (Extract, Transform, Load) süreçlerini yönetmek için kullanılabilir. Veri kaynaklarından gelen verilerin alınması, dönüştürülmesi ve yüklenmesi gibi işlemler Hive ile kolayca yapılabilir. Bu, özellikle Hadoop ekosisteminde büyük veri ile çalışan şirketler için önemlidir.

12.4. Log Analizi ve Raporlama

  • Hive, büyük çaplı log dosyalarının işlenmesi ve analiz edilmesi için de kullanılır. Özellikle web siteleri ve uygulamaların log verilerini işleyerek kullanıcı davranışlarını analiz etmek ve performans raporları oluşturmak için Hive ideal bir araçtır.

12.5. Veri Bilimi Projeleri

  • Veri bilimciler, büyük veri projelerinde Hive kullanarak veri setlerini hazırlayıp analiz ederler. Büyük veri kümeleri üzerinde yapılan analitik işlemler, veri bilimi projelerinde kullanılmak üzere Hive aracılığıyla işlenir ve sonuçlar veri bilimi modellerinde kullanılmak üzere dışa aktarılır.

13. Sonuç

Apache Hive, büyük veri dünyasında veri yönetimi ve analizi için önemli bir araç olarak öne çıkmaktadır. SQL benzeri sorgu diliyle, büyük veri kümeleri üzerinde hızlı ve etkili işlemler yapmayı mümkün kılan Hive, günümüzde birçok şirketin veri ambarı çözümü olarak kullanılmaya devam ediyor. Gelişen teknoloji ve Hadoop ekosisteminin büyümesiyle Hive, gelecekte de büyük veri projelerinde kritik bir rol oynamaya devam edecek gibi duruyor. Bu rehber ile Hive’ın tarihçesini, çalışma mantığını ve uygulama alanlarını detaylıca inceledik. Büyük veri stratejilerinizi şekillendirirken Hive’ı daha verimli bir şekilde kullanmanız dileğiyle.

Bir sonraki yazımda görüşmek üzere.

Her türlü iş birliği için, LinkedIn üzerinden bağlantı kurmak isterseniz buradan profilime ulaşabilirsiniz 😊

--

--