ş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.
Awesome, teşekkürler –
Ö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
@libjack Bunu yakaladığınız için teşekkür ederiz. Yukarıda düzeltildi. –