5

Verileri birden çok çıktı dosyasına bölmek için Hive'ye talimat vermenin bir yolu var mı? Ya da çıktı dosyalarının boyutunu kaplayabiliriz. Ben Biz kovanında verileri tüm dışarı ön işlemeden http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.htmlKovan - dosyalar arasında veri bölme

paralel yükleme izin birden fazla dosya içine bölme verileri önerir Redshift kullanmak planlıyorum ve oluşturmak için bir yolu olup olmadığını merak ediyorum

, 10 say Kopyalamayı daha hızlı kaydırmak için kullanabileceğiniz 1GB dosyaları.

Ben https://cwiki.apache.org/Hive/adminmanual-configuration.html ve https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties bakıyordu ama kovan çıkışının bölünmesi hakkında gidebiliriz birkaç yol vardır

cevap

10

şey bulamıyorum. İlk ve en kolay yol, redüktör sayısını belirlemektir. Her biri, kendi çıktı dosyasına yazma sayısını azalttığından, belirttiğiniz redüktörlerin sayısı, yazılan çıktı dosyalarının sayısına karşılık gelecektir. Bazı Hive sorgularının belirttiğiniz redüktör sayısına neden olmayacağını unutmayın (örneğin, SELECT COUNT(*) FROM some_table her zaman bir redüktörle sonuçlanır). düşürücüler sayısını belirtmek için Sorgunuzun önce bu çalıştırın: Birden çıktı dosyasına bölünür olabilir

set mapred.reduce.tasks=10 

başka yolu da Hive bir bölümlenmiş tabloya Sorgunuzun sonuçlarını eklemek zorunda olacaktır. Bu, bölüm başına en az bir dosyaya neden olur. Bunun mantıklı olması için, bölümlendirmek için makul bir sütuna sahip olmanız gerekir. Örneğin, benzersiz bir kimlik sütununda bölümlemek istemezsiniz veya her kayıt için bir dosyaya sahip olursunuz. Bu yaklaşım, bölüm başına en az çıktı dosyasını ve en fazla numPartitions * numReducers garanti edecektir. İşte bir örnek (hive.exec.dynamic.partition.mode hakkında çok fazla endişelenme, bu sorgunun çalışması için ayarlanması gerekir).

hive.exec.dynamic.partition.mode=nonstrict 

CREATE TABLE table_to_export_to_redshift (
    id INT, 
    value INT 
) 
PARTITIONED BY (country STRING) 

INSERT OVERWRITE TABLE table_to_export_to_redshift 
PARTITION (country) 
SELECT id, value, country 
FROM some_table 

daha ince taneli kontrolü elde etmek için, kovan ve birden fazla dosya için komut yazma azaltmak için geçmek kendi azaltmak komut dosyası yazabilirsiniz. Kendi redükleyicinizi yazdıktan sonra, istediğiniz her şeyi yapabilirsiniz. Son olarak, Hive'i istediğiniz sayıda dosya çıktılamak için manevra yapmaya ve sadece bir kez bittikten sonra kendinizi parçalara ayırmaya çalışabilirsiniz. Varsayılan olarak, Hive tablolarını sıkıştırılmamış halde ve düz metin halinde depo dizininde (örneğin, /apps/hive/warehouse/table_to_export_to_redshift) depolar. Hadoop kabuk komutlarını, MapReduce işini, Domuz'u kullanabilir veya bunları Linux'a çekebilir ve istediğiniz gibi parçalayabilirsiniz.

Redshift ile ilgili herhangi bir deneyimim yok, bu nedenle önerilerinden bazıları, Redshift tarafından herhangi bir nedenden dolayı tüketime uygun olmayabilir.

Birkaç not: Dosyaları daha küçük parçalara ayırmak genellikle Hadoop için kötüdür. Redshift için bir hız artışı elde edebilirsiniz, ancak eğer dosyalar Hadoop ekosisteminin diğer parçaları tarafından tüketilirse (MapReduce, Hive, Pig, vb.) Dosyalar çok küçükse (1GB iyi olsa da) bir performans kaybı görebilirsiniz. . Ayrıca, ekstra işleme/geliştirici süresinin, Redshift veri yükünüze paralel olarak aldığınız zamandan tasarruf etmeye değer olduğundan emin olun.

+0

Awesome, teşekkürler –

+1

Örneğiniz herhangi bir bölümleme yapmıyor. 'CREATE TABLE' ve 'INSERT OVERWRITE' komutlarının her ikisi de kullanılacak bölüm (ler) i belirtmelidir. – libjack

+0

@libjack Bunu yakaladığınız için teşekkür ederiz. Yukarıda düzeltildi. –

İlgili konular