DISTRIBUTED MAPJOIN, MAPJOIN işleminin optimize edilmiş bir sürümüdür. Küçük bir tabloyu büyük bir tablo ile birleştirdiğinizde DISTRIBUTED MAPJOIN kullanabilirsiniz. Büyük tablo üzerindeki veri dağıtımı (shuffling) ve sıralama işlemlerini azaltmak için DISTRIBUTED MAPJOIN veya MAPJOIN tercih edebilirsiniz.
Kullanım notları
Birleştirilecek tabloların boyutları farklı olmalıdır. Büyük tablonun boyutu 10 TB'dan fazla, küçük tablonun boyutu ise [1 GB, 100 GB] aralığında olmalıdır.
Küçük tablodaki veriler dengeli dağıtılmalıdır. Küçük tabloda uzun kuyruk (long tail) verileri bulunuyorsa tablonun tek bir parçasında aşırı veri birikimi oluşur. Bu durum bellek yetersizliği (OOM) hatasına veya uzak yordam çağrısı (RPC) zaman aşımı sorununa yol açabilir.
Bir SQL görevi 20 dakikadan uzun sürüyorsa optimizasyon için DISTRIBUTED MAPJOIN kullanmanızı öneririz.
-
Görev çalışırken önemli miktarda kaynak tüketilir. Bu nedenle görevleri küçük bir kota grubunda çalıştırmamanızı öneririz.
NotKota grubunu Quotas sayfasından değiştirebilirsiniz. Daha fazla bilgi için bkz. Yeni MaxCompute konsolunda kotaları yönetme.
DISTRIBUTED MAPJOIN kullanma
Bir SELECT ifadesinde DISTRIBUTED MAPJOIN kullanmak için ifadeye /*+distmapjoin(<table_name>(shard_count=<n>,replica_count=<m>))*/ ipucunu eklemeniz gerekir. Hem shard_count hem de replica_count parametreleri görevlerin paralellik düzeyini belirler. Paralellik düzeyini hesaplamak için aşağıdaki formülü kullanabilirsiniz: Parallelism = shard_count × replica_count.
-
Parametreler
table_name: Birleştirmek istediğiniz küçük tablonun adı.
-
shard_count=<n>: Birleştirmek istediğiniz küçük tablonun veri parçalarının sayısı. Küçük tablonun veri parçaları veri işlemesi için her bir hesaplama düğümüne dağıtılır. n parça sayısını belirtir. Genellikle bu parametre tek bir sayıya ayarlanır.
Notshard_count parametresini manuel olarak belirtmenizi öneririz. shard_count parametresinin değerini küçük tablonun boyutuna göre tahmin edebilirsiniz. Tek bir parça düğümü tarafından işlenen tahmini veri miktarı [200 MB, 500 MB] aralığında olmalıdır.
shard_count parametresini aşırı yüksek bir değere ayarlarsanız veri işleme performansı ve kararlılığı olumsuz etkilenir. shard_count parametresini aşırı düşük bir değere ayarlarsanız bellek kaynaklarının aşırı kullanımı nedeniyle hata oluşabilir.
-
replica_count=<m>: Küçük tablonun çoğaltma sayısı. m çoğaltma sayısını belirtir. Varsayılan değer: 1.
NotAşırı erişim isteklerini azaltmak ve tek bir düğümün arızalanmasının tüm görevin başarısız olmasına neden olmasını önlemek için aynı parçadaki verilerin birden fazla çoğaltmasını oluşturabilirsiniz. Görevlerin yüksek paralelliği veya kararsız ortam performansı nedeniyle bir düğüm sık sık yeniden başlatılıyorsa replica_count parametresinin değerini artırabilirsiniz. Bu parametreyi 2 veya 3 olarak ayarlamanızı öneririz.
-
Sözdizimi
-- Recommended: Specify shard_count. replica_count defaults to 1. /*+distmapjoin(a(shard_count=5))*/ -- Recommended: Specify both shard_count and replica_count. /*+distmapjoin(a(shard_count=5,replica_count=2))*/ -- Use DISTRIBUTED MAPJOIN for multiple small tables. /*+distmapjoin(a(shard_count=5,replica_count=2),b(shard_count=5,replica_count=2)) */ -- Use DISTRIBUTED MAPJOIN and MAPJOIN together. /*+distmapjoin(a(shard_count=5,replica_count=2)),mapjoin(b)*/
Örnekler
Bu örnekte tmall_dump_lasttable adlı bölümlenmiş bir tabloya veri eklerken DISTRIBUTED MAPJOIN nasıl kullanılacağı açıklanmaktadır.
-
JOIN sözdizimi
insert OVERWRITE table tmall_dump_lasttable partition(ds='20211130') select t1.* from ( select nid, doc,type from search_ods.dump_lasttable where ds='20211203' )t1 join ( select distinct item_id from tbcdm.dim_tb_itm where ds='20211130' and bc_type='B' and is_online='Y' )t2 on t1.nid=t2.item_id; -
DISTRIBUTED MAPJOIN sözdizimi
insert OVERWRITE table tmall_dump_lasttable partition (ds='20211130') select /*+ distmapjoin(t2(shard_count=35)) */ t1.* from ( select nid, doc, type from search_ods.dump_lasttable where ds='20211203' )t1 join ( select distinct item_id from tbcdm.dim_tb_itm where ds='20211130' and bc_type='B' and is_online='Y' )t2 on t1.nid=t2.item_id;