Apache Hive Partitioning ve Bucketing: Veri Yönetimindeki Önemi

Enes Öztürk
5 min readApr 11, 2023

--

PartitioningBucketing

Apache Hive, dağıtık ortamlardaki popüler veri ambarlarından biridir. Apache Hive, büyük miktarda veriyi depolamak için kullanılır ve HDFS (Hadoop Dağıtılmış Dosya Sistemi) ortamında hızlı, paralel ve verimli bir şekilde işlenebilir. Hive sorgularının erişim süresini iyileştirmek için Hive tabloları çeşitli şekillerde depolanabilir. Hive tabloları partition ve bucketing olarak saklanabilir. Bu makalede, Hive tablosunda bölümleme ve kümelemeyi inceleyeceğim ve ne zama bölümleme ve ne zaman kümeleme yapılacağını tartışacağım.

Hive partitioning ve bucketing işlemleri, büyük veri kümesi yönetiminde önemli bir role sahiptir. Partitioning, verileri işleme işlemini daha hızlı hale getirirken, verilerin düzenli bir şekilde organize edilmesini sağlar. Bu nedenle veriye erişim daha hızlı ve daha verimli hale gelir. Bucketing ise verileri fiziksel olarak bölerek daha hızlı sorgu işleme süreleri elde etmeyi sağlar.

Hive Partitioning Nedir?

Hive partitioning, bir veri kümesinin parçalara bölünmesini sağlayan bir işlemdir. Veri kümesi belirli bir sütuna göre bölünerek partition’lar halinde tutulur. Bu sayede, veri setine yönelik sorguların daha hızlı bir şekilde gerçekleştirilmesi sağlanır. Partitioning işlemi, büyük veri kümesinin yönetimini kolaylaştırır ve veri saklama, yedekleme ve kurtarma işlemlerinde de faydalıdır.

Partitioning işlemi, bir tablo oluşturulurken belirli bir sütuna göre yapılandırılır. Örneğin bir alışveriş tablosu oluştururken tarih sütununa göre partition edebilirsiniz. Bu durumda, alışveriş tablosu aşağıdaki gibi olacaktır:

CREATE TABLE alisveris (
urun_id INT,
musteri_id INT,
fiyat DECIMAL(10,2),
tarih STRING
)
PARTITIONED BY (yil INT, ay INT, gun INT);

Yukarıdaki örnekte, “alisveris” adında bir tablo oluşturulur ve tablo, yıl, ay ve gün sütunlarına göre partition edilir. Bu sayede, veriler tarih sütunundaki değerlere göre partition edilir ve veriye erişim hızlandırılır.

Hive Bucketing Nedir?

Hive bucketing, veri kümesinin belirli bir sütuna göre gruplanmasını sağlayan bir işlemdir. Veriler belirli bir sütuna göre sıralanarak, belirli sayıda bucket’a bölünür. Bu sayede, verilerin daha hızlı bir şekilde işlenmesi ve sorgulanması sağlanır. Bucketing işlemi, veri sıralamasına ve veri sorgularının doğruluğuna da katkıda bulunur.

Bucketing işlemi, bir tablo oluşturulurken belirli bir sütuna göre yapılandırılır. Örneğin, bir kullanıcı etkinlikleri tablosu oluştururken kullanıcı id sütununa göre bucketing yapabilirsiniz. Bu durumda, kullanıcı etkinlikleri tablosu aşağıdaki gibi olacaktır:

CREATE TABLE kullanici_etkinlikleri (
kullanici_id INT,
etkinlik_tarihi STRING,
etkinlik_tipi STRING
)
CLUSTERED BY (kullanici_id) INTO 4 BUCKETS;

Yukarıdaki örnekte, “kullanici_etkinlikleri” adında bir tablo oluşturulur ve tablo, kullanıcı id sütununa göre bucketing edilir. Bu sayede, veriler kullanıcı id sütunundaki değerlere göre sıralanır ve belirli sayıda bucket’a bölünür. Bu işlem, verilerin daha hızlı bir şekilde işlenmesini ve sorgulanmasını sağlar.

Örneklerle Hive Partitioning ve Bucketing İşlemleri:

  1. Partitioning İşlemi:

Tablodaki verilerin review_date sütununun değerlerine göre yıllara ve aylara göre partitioning yapacağız.

Öncelikle, partitioning işlemi yapmak istediğimiz tablodan farklı olarak, partitioning işlemi yapacağımız yeni bir tablo oluşturuyoruz. Bu tabloda, review_year ve review_month sütunları partitioning anahtarları olarak belirlenmiştir. Bu sayede verilerimizi yıllara ve aylara göre bölümlere ayırmış olacağız.

Daha sonra, dynamic partitioning ayarlarını yapılandırıyoruz. hive.exec.dynamic.partition=true ve hive.exec.dynamic.partition.mode=nonstrict ayarları, verilerimizdeki partitioning anahtarlarının olmadığı bölümlere veri eklememizi sağlar.

Son adımda, INSERT INTO komutu ile partitioning işlemi yapacağımız yeni tabloya verileri ekliyoruz. Eklenen veriler, partitioning anahtarlarına göre ilgili bölümlere yerleştirilir.

SELECT COUNT(1) FROM test1.hotels_prt LIMIT 5; sorgusu ile partitioning işlemi sonrası tablomuzun kaç satırdan oluştuğunu kontrol ederken, SHOW PARTITIONS hotels_prt; sorgusu ile de tablodaki partition'ların detaylarını görüntüleyebiliriz.

-- Create the partitioned table
CREATE TABLE IF NOT EXISTS test1.hotels_prt (
Hotel_Address string,
Review_Date Date,
Additional_Number_of_Scoring int,
Average_Score double,
Hotel_Name string,
Reviewer_Nationality string,
Negative_Review string,
Review_Total_Negative_Word_Counts int,
Total_Number_of_Reviews int,
Positive_Review string,
Review_Total_Positive_Word_Counts int,
Total_Number_of_Reviews_Reviewer_Has_Given int,
Reviewer_Score double,
days_since_review string,
lat string,
lng string,
Tags string
)
PARTITIONED BY (review_year int, review_month int)
STORED AS ORC;
-- Enable dynamic partitioning
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
-- Insert the data into the partitioned table
INSERT INTO TABLE test1.hotels_prt PARTITION(review_year, review_month)
SELECT
Hotel_Address,
FROM_UNIXTIME(UNIX_TIMESTAMP(review_date , 'MM/dd/yyyy')) AS Review_Date,
Additional_Number_of_Scoring,
Average_Score,
Hotel_Name,
Reviewer_Nationality,
Negative_Review,
Review_Total_Negative_Word_Counts,
Total_Number_of_Reviews,
Positive_Review,
Review_Total_Positive_Word_Counts,
Total_Number_of_Reviews_Reviewer_Has_Given,
Reviewer_Score,
days_since_review,
lat,
lng,
Tags,
YEAR(FROM_UNIXTIME(UNIX_TIMESTAMP(review_date , 'MM/dd/yyyy'))) AS review_year,
MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(review_date , 'MM/dd/yyyy'))) AS review_month
FROM test1.hotels_parquet;
-- Check the partitioned table
SELECT COUNT(1) FROM test1.hotels_prt LIMIT 5;
SHOW PARTITIONS hotels_prt;

2. Bucketing İşlemi Örneği:

Tablo oluşturma işlemi “CREATE TABLE” komutu ile gerçekleştirilir. Bu örnekte, “test1” veritabanına “hotels_bucket” isimli yeni bir tablo oluşturuluyor. Tablodaki sütunlar ve veri tipleri belirtiliyor.

“CLUSTERED BY (Hotel_Name) INTO 8 BUCKETS” kısmı, tablonun bucket’lanarak oluşturulacağını belirtir. Bu yöntem, verilerin belirli bir sütuna göre gruplandırılması ve daha hızlı sorgulanabilmesi için kullanılır. Burada “Hotel_Name” sütunu baz alınarak 8 adet bucket oluşturulacak.

“ROW FORMAT DELIMITED” kısmında verilerin sınırlarının belirlendiği “FIELDS TERMINATED BY” ve “LINES TERMINATED BY” parametreleri belirtilir. Bu örnekte, her sütun virgülle ayrılırken, her satır “\n” karakteriyle bölünecek şekilde ayarlanmış.

“STORED AS ORC” ile verilerin ORC formatında saklanacağı belirtiliyor. ORC (Optimized Row Columnar), Hive’ın performansını artırmak için kullanılan bir sütun tabanlı depolama formatıdır.

“SET hive.enforce.bucketing = true;” komutu, bucket’lama işleminin zorunlu olduğunu belirtir.

“INSERT INTO” komutu ile veriler, önceden oluşturulan “hotels_bucket” tablosuna aktarılır. Verilerin kaynağı, “hotels_parquet” tablosudur.

“DESCRIBE FORMATTED” komutu ile tablonun özellikleri görüntülenir. “SELECT COUNT(1) FROM” sorgusu ile “hotels_bucket” tablosunda kaç adet kayıt olduğu sayısal olarak hesaplanır.

-- Create the bucketed table
CREATE TABLE IF NOT EXISTS test1.hotels_bucket (
Hotel_Address string,
Review_Date string,
Additional_Number_of_Scoring int,
Average_Score double,
Hotel_Name string,
Reviewer_Nationality string,
Negative_Review string,
Review_Total_Negative_Word_Counts int,
Total_Number_of_Reviews int,
Positive_Review string,
Review_Total_Positive_Word_Counts int,
Total_Number_of_Reviews_Reviewer_Has_Given int,
Reviewer_Score double,
days_since_review string,
lat string,
lng string,
Tags string
)
CLUSTERED BY (Hotel_Name) INTO 8 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORC;
-- Enable bucketing
SET hive.enforce.bucketing = true;
-- Insert data into the bucketed table
INSERT INTO test1.hotels_bucket SELECT * FROM test1.hotels_parquet;
-- Check the bucketed table
DESCRIBE FORMATTED test1.hotels_bucket;
SELECT COUNT(1) FROM test1.hotels_bucket;

Sonuç olarak Hive partitioning ve bucketing işlemleri, büyük veri kümesi yönetiminde önemli bir role sahiptir. Bu işlemler veriye erişimi hızlandırmak, sorgu işleme performansını artırmak ve veri boyutunu azaltmak için kullanılabilir. Partitioning, verileri belirli kriterlere göre gruplandırarak saklama yöntemidir. Bu sayede verilere daha hızlı erişim sağlanabilir ve sorgular daha hızlı işlenebilir. Bucketing ise partitioning işlemine benzer ancak verileri belirli bir sıralama yöntemiyle gruplandırır ve daha küçük parçalara böler. Bu sayede sorgular daha hızlı işlenebilir ve verilerin üzerindeki yük azaltılır.

Örneğin, bir e-ticaret sitesinin müşteri sipariş verilerini ele alalım. Verileri tarih ve müşteri ID’si gibi özelliklerine göre partition edebiliriz. Bu sayede belirli bir tarihteki veya belirli bir müşterinin siparişlerine hızlıca erişebiliriz. Bunun yanı sıra, verileri belirli bir sıralama ölçütüne göre bucketing işlemine tabi tutabiliriz. Örneğin, müşteri ID’si veya sipariş miktarına göre verileri küçük parçalara bölerek daha hızlı erişim sağlayabiliriz.

Hive partitioning ve bucketing işlemleri, büyük veri kümesi yönetiminde oldukça önemlidir. Bu işlemler, sorgu işleme performansını artırırken, verilerin üzerindeki yükü de azaltır. Doğru bir şekilde yapılandırıldığında, bu işlemler büyük veri kümesi yönetimini daha etkili ve verimli hale getirebilir.

Sonuç:
Yukarıdaki yazıda, bölümleme ve kovalamanın ne olduğunu anlamak çok basittir. Her ikisi de sorgu yürütme süresini/sorgu optimizasyonunu geliştirmek için kullanılır. Bir sütunun kardinalitesi düşükse (sütunda daha az sayıda farklı değer varsa) bölümleme kullanılır. Aksine, bir sütun çok yüksek kardinaliteye sahipse (sütunda daha fazla sayıda farklı değer varsa) bucketing tercih edilir.

📚 Örnek Çalışma: https://github.com/enessoztrk/ApacheHive_Partition_Bucketing

En son yayınlarımdan haberdar olmak ve benimle iletişime geçmek için:

LinkedIn: https://www.linkedin.com/in/enessoztrk/

Yeni yazılarımda görüşmek üzere…🧠

--

--