5

C'è un modo per istruire Hive per suddividere i dati in più file di output? O forse limitare la dimensione dei file di output.Hive: suddivisione dei dati tra file

Sto progettando di utilizzare Redshift, che raccomanda i dati scissione in più file per consentire il caricamento parallelo http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

Abbiamo pre-elaborare tutti i dati nei alveare, e mi chiedo se c'è un modo per creare, diciamo 10 File da 1 GB che potrebbero rendere più veloce la copia per il redshift.

stavo guardando https://cwiki.apache.org/Hive/adminmanual-configuration.html e https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties ma non riesco a trovare nulla

risposta

10

Ci sono un paio di modi si può andare su come dividere uscita Hive. Il primo e più semplice è impostare il numero di riduttori. Poiché ciascuno riduce le scritture nel proprio file di output, il numero di riduttori specificato corrisponde al numero di file di output scritti. Si noti che alcune query Hive non determinano il numero di riduzioni specificato (ad esempio, SELECT COUNT(*) FROM some_table produce sempre un riduttore). Per specificare il numero di riduttori di eseguire la prima query:

set mapred.reduce.tasks=10 

Un altro modo si potrebbe dividere in più file di output sarebbe di avere Hive inserire i risultati della query in una tabella partizionata. Ciò comporterebbe almeno un file per partizione. Affinché ciò abbia senso, è necessario disporre di una colonna ragionevole su cui partizionare. Ad esempio, non vorrai partizionare su una colonna id univoca o avresti un file per ogni record. Questo approccio garantirà almeno il file di output per partizione e al massimo numPartitions * numReducers. Ecco un esempio (non preoccuparti troppo di hive.exec.dynamic.partition.mode, deve essere impostato affinché questa query funzioni).

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 

per ottenere più controllo a grana fine, è possibile scrivere il proprio script ridurre al passare di scorporare e avere che riducono lo script di scrittura a più file. Una volta che stai scrivendo il tuo riduttore, puoi fare praticamente quello che vuoi.

Infine, puoi rinunciare a provare a manovrare Hive in modo da emettere il numero desiderato di file e dividerli da soli una volta terminato Hive. Per impostazione predefinita, Hive memorizza le sue tabelle non compresse e in testo normale nella sua directory di magazzino (ad esempio, /apps/hive/warehouse/table_to_export_to_redshift). Puoi usare i comandi della shell di Hadoop, un lavoro di MapReduce, Pig, o trascinarli in Linux e separarli a tuo piacimento.

Non ho alcuna esperienza con Redshift, quindi alcuni dei miei suggerimenti potrebbero non essere appropriati per il consumo da parte di Redshift per qualsiasi motivo.

Un paio di note: la suddivisione di file in file più piccoli è generalmente negativa per Hadoop. Potresti ottenere un aumento della velocità per Redshift, ma se i file vengono utilizzati da altre parti dell'ecosistema Hadoop (MapReduce, Hive, Pig, ecc.) Potresti vedere una perdita di prestazioni se i file sono troppo piccoli (anche se 1 GB andrebbe bene) . Assicurati inoltre che il tempo di elaborazione/sviluppo aggiuntivo valga il tempo risparmiato per il parallelismo del carico di dati di Redshift.

+0

Impressionante, grazie –

+1

L'esempio non esegue alcun partizionamento. Entrambi i comandi 'CREATE TABLE' e' INSERT OVERWRITE' devono specificare le partizioni da utilizzare. – libjack

+0

@libjack Grazie per averlo capito. Risolto sopra. –

Problemi correlati