Örnekle Kovan Bölmeleri ve Kovalar
⚡ Akıllı Özet
Bölümleme (partition) ve kova (bucket) olmak üzere iki yöntem, Apache Hive'ın tablo verilerini disk üzerinde bölmek için kullandığı araçlardır: bölümleme, her anahtar değeri için bir dizin oluştururken, kova satırları sabit sayıda dosyaya dönüştürür.
Tablolar, Bölümler ve Kovalar, Hive veri modellemesinin bileşenleridir. Bir tablo şemayı tanımlar, bir bölüm bu tabloyu disk üzerindeki dizinlere böler ve bir kova, bir dizin içindeki verileri sabit sayıda dosyaya böler.
Bölümler Nedir?
Hive Partitions, tabloları bölümleme anahtarlarına göre farklı parçalara ayırarak bölümlere ayırmanın bir yoludur. Fiziksel olarak, her bölüm HDFS'deki tablo klasörünün altında ayrı bir alt dizindir ve bu da Hive'ın ihtiyaç duymadığı verileri atlamasına olanak tanır.
Tabloda bir veya daha fazla bölümleme anahtarı olduğunda bölümleme (partition) kullanışlıdır. Bölümleme anahtarları, verilerin tabloda nasıl saklandığını belirlemek için temel unsurlardır. Bir bölümleme anahtarı veri dosyalarının içinde saklanmaz; değeri dizin adında kodlanır, bu nedenle bu anahtara göre filtreleme yapan bir sorgu, herhangi bir satır okunmadan önce tüm dizinleri eleyebilir. Buna bölümleme budaması (partition pruning) denir.
Örneğin: -
“Müşterinin, Hindistan operasyonlarına ait bazı e-ticaret verileri var ve bu verilerde her bir eyaletin (38 eyalet) operasyonları bir bütün olarak belirtiliyor. Eyalet sütununu bölümleme anahtarı olarak alıp, Hindistan verilerinin tamamı üzerinde bölümleme işlemi gerçekleştirirsek, Hindistan'da bulunan eyalet sayısına (38) eşit sayıda bölüm (38 bölüm) elde edebiliriz. Böylece her bir eyaletin verileri bölümleme tablolarında ayrı ayrı görüntülenebilir.”
Örnek Code Bölümler için kod parçası
Aşağıdaki altı ifade, Hive kabuğunda sırayla çalıştırılır. Her biri ayrı bir adımdır ve aşağıdaki ekran görüntüleri, aynı sıranın canlı bir kümede nasıl çalıştığını göstermektedir.
- allstates tablosunun oluşturulması
create table allstates(state string, District string,Enrolments string) row format delimited fields terminated by ',';
- Oluşturulan "allstates" tablosuna veri yükleniyor.
Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
- Bölüm tablosunun oluşturulması
create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
- Bölümleme için bu özelliği ayarlamamız gerekiyor
set hive.exec.dynamic.partition.mode=nonstrict - Verileri bölüm tablosuna yükleme
INSERT OVERWRITE TABLE state_part PARTITION(state) SELECT district,enrolments,state from allstates;
- Bölüm anahtarı olarak duruma dayalı bölüm tablolarının fiili işlenmesi ve oluşturulması
HDFS depolama alanında dosya adı olarak durum adı kullanılan 38 bölüm çıktısı olacak. Bunu bu adımda kontrol edeceğiz.
Aşağıdaki ekran görüntüleri, yukarıda belirtilen kodun çalıştırılmasını göstermektedir.
İlk ekranda, 1. adım şu noktada çalışır: kovan> istemi oluşturur ve oluşturur tüm eyaletler Üç sütunlu ve alan ayırıcı olarak virgül kullanılan bir tablo.
Sonraki ekranda 2. ve 3. adımlar gösteriliyor: AllStates.csv dosyası yükleniyor. tüm eyaletlerve bölümlenmiş tablo durum_parçası Bölümleme anahtarı olarak tanımlanan durumla oluşturulur.
4. ve 5. adımlar daha sonra gelir. Dinamik bölümleme modu katı olmayan olarak ayarlanır ve INSERT OVERWRITE ifadesi, her durum değeri için bir bölümün yüklendiğini gösteren günlük satırlarına sahip bir MapReduce işini başlatır.
HDFS'deki depo dizinini listelemek, 6. adımın sonucunu doğruluyor – komut satırı 38 öğe, bir tane de eksik öğe olduğunu bildiriyor. eyalet_bölümü/eyalet= Her eyalet için dizin.
Yukarıdaki koddan aşağıdaki şeyleri yapıyoruz
- "Eyalet", "ilçe" ve "kayıtlar" gibi 3 sütun adına sahip "allstates" tablosunun oluşturulması.
- Veriler allstates tablosuna yükleniyor.
- Bölüm anahtarı olarak durum içeren bölüm tablosunun oluşturulması
- Bu adımda bölümleme modunu katı olmayan (non-strict) olarak ayarlayın (bu mod dinamik bölümleme modunu etkinleştirecektir).
- Verilerin state_part bölüm tablosuna yüklenmesi
- Bölüm anahtarı olarak duruma dayalı bölüm tablolarının fiili işlenmesi ve oluşturulması
- HDFS depolama alanında dosya adı olarak durum adı kullanılan 38 bölüm çıktısı olacak. Bu adımda, HDFS'deki 38 bölüm çıktısını görüyoruz.
Hive'da Statik ve Dinamik Bölümleme Karşılaştırması
Yukarıdaki örnekte dinamik bölümleme kullanılmıştır, ancak Hive iki yükleme stilini destekler ve aralarındaki fark, ne kadar süre kullanılacağına karar verir.ping – ve her yükün ne kadar risk taşıdığı.
Statik bölümleme Bölümleme değerini ifadenin kendisinde belirtir, bu nedenle değer yükleme işlemi başlamadan önce bilinmelidir ve bir ifade tam olarak bir bölümü doldurur. Dinamik bölümleme Hive, SELECT listesinin son sütunundan bölümleme değerini okuyarak dizinleri çalışma zamanında oluşturur; bu nedenle örnekte 38 dizin oluşturmak için yalnızca tek bir INSERT işlemine ihtiyaç duyulur.
| Görünüş | Statik bölümleme | Dinamik bölümleme |
|---|---|---|
| Bölüm değeri | BÖLÜMLEME maddesinde elden teslim edilir. | Çalışma zamanında SELECT sütunundan okuyun. |
| İfade başına bölümler | Bir | çok |
| yapılandırma | Varsayılan katı modda çalışır. | hive.exec.dynamic.partition.mode ayarının nonstrict olarak ayarlanması gerekiyor. |
| Yük hızı | Daha hızlı, çünkü değer taramasına gerek yok. | İşlem satırları anahtara göre gruplandırdığı için daha yavaş çalışıyor. |
| En uygun | Günlük yük gibi küçük, bilinen setler | 38 eyalet gibi büyük veya bilinmeyen anahtar kümeleri |
Dinamik yüklemeler de sınırlandırılmıştır. Hive, bir işin oluşturabileceği bölüm sayısını sınırlar – varsayılan olarak eşleyici veya indirgeyici başına 100 ve tüm ifade için 1000 – ve bu sınırlardan herhangi biri aşıldığında iş başarısız olur, bu nedenle çok yüksek kardinaliteli bir anahtar için bu sınırların yükseltilmesi veya farklı bir tasarım gereklidir.
Kovalar Nedir?
Hive'da kovalar (buckets), Hive tablo verilerini birden fazla dosyaya veya dizine ayırmak için kullanılır. Verimli sorgulama için kullanılırlar ve bölümlemenin aksine, tablo oluşturulduğunda kova sayısı sabittir, bu nedenle verilerle birlikte asla artmaz.
- Bu bölümlerde bulunan veriler daha da alt bölümlere ayrılabilir.
- Bölme işlemi, tabloda seçtiğimiz belirli sütunların karma değerlerine göre gerçekleştirilir.
- Kovalar, her kaydı okumak ve kovalara yerleştirmek için arka uçta bir tür karma algoritması kullanır.
- Bir sıranın hangi kovaya düşeceği, şu kriterlere göre belirlenir: karma_fonksiyonu(kovalama_sütunu) mod kova_sayısıBu nedenle, eşit değerler her zaman aynı dosyaya kaydedilir.
- Hive 0.x ve 1.x sürümlerinde, gruplandırmanın etkinleştirilmesi gerekiyordu. hive.enforce.bucketing=true olarak ayarla; eklemeden önce
Bu son ayar, mevcut kümede geçmişe ait bir ayardır: Apache Hive kılavuzu Hive 2.x ve sonrasında buna gerek kalmadığını belirtmekte fayda var, çünkü motor artık indirgeyici sayısını ve kümeleme ölçütü sütununu tablo tanımından otomatik olarak alıyor.
) 1 Adım Aşağıda gösterildiği gibi Kova oluşturma.
Aşağıdaki ekran, CREATE TABLE ifadesini göstermektedir. örnek kovasıEn alttaki CLUSTERED BY maddesi, kova sayısını sabitler.
Yukarıdaki ekran görüntüsünden
- first_name, job_id, department, salary ve country gibi sütun adlarına sahip bir samplebucket oluşturuyoruz.
- Burada 4 adet kova oluşturuyoruz.
- Veriler yüklendikten sonra otomatik olarak 4 bölüme ayrılır.
- Ülke sütunu kümeleme sütunudur, bu nedenle bir ülkeye ait her satır aynı kova dosyasına yazılır.
) 2 Adım Verilerin samplebucket tablosuna yüklenmesi
Hive sisteminde "çalışanlar" tablosunun zaten oluşturulmuş olduğunu varsayarsak, bu adımda çalışanlar tablosundaki verilerin samplebucket tablosuna yüklenmesini göreceğiz.
Çalışan verilerini gruplara taşımaya başlamadan önce, verilerin first_name, job_id, department, salary ve country gibi sütun adlarından oluştuğundan emin olun.
Burada çalışanlar tablosundan samplebucket'a veri yüklüyoruz – aşağıdaki ekran görüntüsü kopyalama işlemini gerçekleştiren INSERT OVERWRITE ifadesini göstermektedir.
) 3 Adım 1. adımda oluşturulan 4 kova görüntüleniyor.
HDFS'deki tablo dizinini listelemek, fiziksel sonucu gösterir: tek bir dosya yerine dört numaralı veri dosyası.
Yukarıdaki ekran görüntüsünden de görülebileceği gibi, çalışanlar tablosundaki veriler 1. adımda oluşturulan 4 bölüme aktarılmıştır.
Hive Bölümleme ve Gruplandırma: Temel Farklar
Her iki özellik de bir tabloyu daha küçük parçalara ayırır, ancak bunu dosya sisteminin farklı seviyelerinde yaparlar ve farklı sorunlara çözüm sunarlar. Aşağıdaki tabloda bu iki özellik yan yana gösterilmiştir.
| Karşılaştırma noktası | Bölümleme | Kovalama |
|---|---|---|
| Birim oluşturuldu | Anahtar değerine göre bir dizin | Her bir karma kova için bir dosya |
| Bildirildi | BÖLÜMLENDİRİLMİŞ | ... TARAFINDAN KÜMELENMİŞ n KOVAYA |
| Parça sayısı | Farklı değerlerin sayısı arttıkça büyür. | Tablo oluşturma sırasında düzeltildi. |
| Veri dosyalarında saklanan sütun | Hayır, değer dizin adında saklıdır. | Evet – sütun normal bir sütun olarak kalıyor. |
| En iyi sütun türü | Eyalet, yıl veya ülke gibi düşük kardinaliteli sayılar. | Yüksek kardinalite, örneğin user_id veya transaction_id |
| Ana fayda | Bölüm budama işlemi gereksiz dizinleri atlar. | Dosya boyutları bile, ucuz örnekleme ve harita tarafı birleştirmeler |
İkisi rakip değil. Yaygın bir üretim düzeni, olgu tablosunu tarihe göre bölümlere ayırır ve ardından her günü birleştirme anahtarına göre gruplandırır; böylece bir sorgu tek bir dizine iner ve ardından bu dizin içindeki gruplar arasında birleştirme yapar.
Bölümleme, Gruplama veya Her İkisini Birden Ne Zaman Kullanmalı?
Bunlar arasında seçim yapmak, öncelikle sütunun kardinalitesi ve tabloyu okuyacak sorguların şekliyle başlar.
- Bölme Sorgular neredeyse her zaman aynı düşük kardinaliteli sütunda filtrelendiğinde ve farklı değerlerin sayısı milyonlar yerine yüzlerle ifade edildiğinde
- Kova Kullanışlı sütun, dizin olamayacak kadar çok farklı değere sahip olduğunda veya tablo o sütun üzerinden tekrar tekrar birleştirildiğinde veya örneklendiğinde
- İkisini de kullan Büyük olgu tabloları için: tarihe göre bölümleme yapın, ardından her bölüm içinde birleştirme anahtarına göre gruplama yapın.
Dikkat edilmesi gereken hata modu, küçük dosya problemidir. Çok yüksek kardinaliteye sahip bir sütunda (zaman damgası veya müşteri tanımlayıcısı gibi) bölümleme, her biri HDFS blok boyutunun çok altında bir dosya içeren binlerce küçük dizin oluşturur. Bu, NameNode belleğini şişirir ve her taramayı yavaşlatır; bu da bölümlemenin önlemeyi amaçladığı sonuçtur. Gruplama, dosya sayısı tablo tanımıyla sınırlandırıldığı için bunu önler.
Gruplandırmanın da kendine özgü bir dezavantajı var: düzen ancak her yazıcı ona uyarsa doğru olur. Oluşturma sırasında belirtilen grup sayısı meta veri olduğundan, doğru şekilde kümeleme yapmadan tabloya yazan bir iş, belirtilen düzenle eşleşmeyen dosyalar bırakabilir ve daha sonraki örnekleme veya grup birleştirmeleri yanlış satırları okuyabilir.








