Ö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.

  • 🗂️ Bölüm bir dizindir: Bölümleme anahtarının her farklı değeri, HDFS'deki tablo klasörünün altında kendi alt dizinini oluşturur.
  • ✂️ Bölme budaması: Bölümleme anahtarına göre filtreleme yapan bir sorgu, tüm tabloyu taramak yerine yalnızca eşleşen dizinleri okur.
  • ⚙️ Dinamik mod gereklidir: Bir SELECT sorgusundan birçok bölüm yüklemek için hive.exec.dynamic.partition.mode ayarının nonstrict olarak ayarlanması gerekir.
  • 🧮 Kova bir dosyadır: CLUSTERED BY, seçilen sütunu özetler ve her satırı sabit sayıda dosyadan birine yazar.
  • 🔍 Örnekleme ve birleştirmeler: Gruplandırılmış tablolar, düz tabloların sağlayamadığı verimli TABLESAMPLE okumalarını ve harita tarafı grup birleştirmelerini destekler.
  • 📐 Kardinaliteye göre seçin: Eyalet veya tarih gibi düşük kardinaliteli sütunlara göre bölümleme yapın ve kullanıcı tanımlayıcıları gibi yüksek kardinaliteli sütunları gruplandırın.

Hive bölümlemeleri ve kovaları, örnek bir uygulama ile açıklanmıştı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.

  1. allstates tablosunun oluşturulması
    create table allstates(state string, District string,Enrolments string)
    
    row format delimited
    
    fields terminated by ',';
    
  2. Oluşturulan "allstates" tablosuna veri yükleniyor.
    Load data local inpath '/home/hduser/Desktop/AllStates.csv' into table allstates;
  3. Bölüm tablosunun oluşturulması
    create table state_part(District string,Enrolments string) PARTITIONED BY(state string);
  4. Bölümleme için bu özelliği ayarlamamız gerekiyor
    set hive.exec.dynamic.partition.mode=nonstrict
  5. Verileri bölüm tablosuna yükleme
    INSERT OVERWRITE TABLE state_part PARTITION(state)
    SELECT district,enrolments,state from  allstates;
  6. 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.

Hive shell, üç sınırlayıcı sütun içeren allstates tablosunu oluşturuyor.

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.

AllStates.csv dosyasını allstates tablosuna yüklüyor ve state_part bölümlenmiş tablosunu oluşturuyoruz.

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.

MapReduce işinin çıktısı, durum değeri başına bir Hive bölümünü yüklüyor.

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.

HDFS listesi, Hive veri deposunda 38 adet state_part bölüm dizinini gösteriyor.

Yukarıdaki koddan aşağıdaki şeyleri yapıyoruz

  1. "Eyalet", "ilçe" ve "kayıtlar" gibi 3 sütun adına sahip "allstates" tablosunun oluşturulması.
  2. Veriler allstates tablosuna yükleniyor.
  3. Bölüm anahtarı olarak durum içeren bölüm tablosunun oluşturulması
  4. Bu adımda bölümleme modunu katı olmayan (non-strict) olarak ayarlayın (bu mod dinamik bölümleme modunu etkinleştirecektir).
  5. Verilerin state_part bölüm tablosuna yüklenmesi
  6. Bölüm anahtarı olarak duruma dayalı bölüm tablolarının fiili işlenmesi ve oluşturulması
  7. 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.

Hive CREATE TABLE ifadesi, samplebucket'ı dört bölüme ayırıyor.

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.

INSERT OVERWRITE ifadesi, çalışan satırlarını samplebucket tablosuna kopyalıyor.

) 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ı.

samplebucket dizini altında oluşturulan dört kova dosyasının HDFS listesi

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.

SSS

Hive kabuğunda SHOW PARTITIONS table_name komutunu çalıştırın. Bu komut, metastore'u okur ve her bölüm dizini için bir satır yazdırır; bu, HDFS'de depo yolunu listelemekten daha hızlıdır ve ayrıca metastore'un senkronize olduğunu doğrular.

ALTER TABLE table_name ADD PARTITION (state='Goa') komutu yeni bir dizin kaydeder ve ALTER TABLE table_name DROP PARTITION (state='Goa') komutu bu dizini siler. Silme işlemiping Yönetilen bir bölüm verilerini silerken, drop işlemi verilerini siler.ping Harici bir işlem yalnızca metastore kaydını temizler.

Hive, varsayılan olarak dinamik bölümleme sayısını düğüm başına 100 ve sorgu başına 1000 ile sınırlandırır. Daha fazla farklı değere sahip bir anahtar bu sınırı aşar ve işlemi sonlandırır. hive.exec.max.dynamic.partitions.pernode ve hive.exec.max.dynamic.partitions değerlerini yükseltin veya daha geniş bir anahtar seçin.

Hayır. Hive 0.x ve 1.x sürümlerinde, indirgeyici sayısının kova sayısıyla eşleşmesini sağlamak için gerekliydi. HIVE-12331, Hive 2.0'da bunu kaldırdı ve motor artık hem indirgeyici sayısını hem de kümeleme sütununu tablodan alıyor.

TABLESAMPLE(BUCKET x OUT OF y ON column) komutu, her şeyi taramak yerine yalnızca eşleşen kova dosyalarını okur. Yazma sırasında satırlar aynı sütunda hash'lendiği için, örneklem tekrarlanabilir ve rastgele satır filtrelemesinden çok daha ucuzdur.

Bir tabloyu binlerce küçük dosyaya bölmek, NameNode belleğini boşa harcar ve her dosya için bir görev başlatır, bu nedenle taramalar yavaşlar. Genellikle çok yüksek kardinaliteye sahip bir bölümleme anahtarından sonra gelir. Daha kaba anahtarlar, gruplandırma veya dosya sıkıştırma bu sorunu çözer.

Evet. Cloudera Workload XM gibi araçlardaki sorgu günlüğü analizi ve makine öğrenimi modelleri, sütunları filtre sıklığı, çarpıklık ve kardinaliteye göre sıralar ve ardından bir düzen önerir. Önerilen düzen henüz gözden geçirilmeli, çünkü planlanan iş yüklerini göremiyor.

Copilot, bir yorumdan hızlıca PARTITIONED BY ve CLUSTERED BY ifadeleri oluşturur ve yardımcı araçlar tüm yükleme betiğini üretebilir. Model yalnızca isimlerden tahmin yürüttüğü için, oluşturulan kova sayısını ve anahtarını her zaman gerçek kardinaliteyle karşılaştırın.

Bu yazıyı şu şekilde özetleyin: