È necessario un aiuto per la migliore pratica di implementazione. L'ambiente operativo è la seguente: file di datiApache Spark on YARN: numero elevato di file di dati di input (combina più file di input in spark)
- Log arriva in modo irregolare.
- Le dimensioni di un file di dati di registro vanno da 3,9 KB a 8,5 MB. La media è di circa 1 MB.
- Il numero di record di un file di dati è compreso tra 13 righe e 22000 righe. La media è di circa 2700 linee.
- Il file di dati deve essere post-elaborato prima dell'aggregazione.
- L'algoritmo di post-elaborazione può essere modificato.
- Il file post-elaborazione viene gestito separatamente con il file di dati originale, poiché l'algoritmo di post-elaborazione potrebbe essere modificato.
- L'aggregazione giornaliera viene eseguita. Tutto il file di dati postelaborato deve essere filtrato record per record e viene calcolata l'aggregazione (media, max min ...).
- Poiché l'aggregazione è a grana fine, il numero di record dopo l'aggregazione non è così ridotto. Può essere circa la metà del numero dei record originali.
- In un punto, il numero del file post-elaborato può essere di circa 200.000.
- Un file di dati deve poter essere eliminato singolarmente.
In un test, ho cercato di elaborare 160.000 file post-processed by Spark iniziano con sc.textFile() con percorso glob, non è riuscito con eccezione OutOfMemory sul processo conducente.
Qual è la migliore pratica per gestire questo tipo di dati? Dovrei usare HBase invece dei file normali per salvare i dati post-elaborati?
Grazie per aver condiviso questo. Penso che l'argomento dimensione sia particolarmente prezioso, dal momento che non può essere specificato su coalesce(). – zeodtr
Questa soluzione è migliore della coalesce perché funziona a livello di mappa, ma si rafforza dopo. –
Poiché hasdoop supporta CombineTextInputFormat (almeno dalla 2.2), la combinazione di file di input di piccole dimensioni può essere eseguita con sc.newAPIHadoopFile(), senza implementare una classe personalizzata. – zeodtr