Avro vs. Parquet


92

Ho intenzione di utilizzare uno dei formati di file hadoop per il mio progetto relativo a hadoop. Ho capito parquet è efficace per la query colonna based e Avro per scansione completa o quando abbiamo bisogno di tutti i dati colonne!

Prima di procedere e scegliere uno dei formati di file, voglio capire quali sono gli svantaggi / svantaggi di uno rispetto all'altro. Qualcuno può spiegarmelo in termini semplici?

Risposte:


53

Se non hai già deciso, vado avanti e scrivo schemi Avro per i tuoi dati. Una volta fatto, scegliere tra i file contenitore Avro e i file Parquet è semplice quanto lo scambio, ad es.

job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());

per

job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());

Il formato Parquet sembra essere un po 'più impegnativo dal punto di vista della scrittura, ad esempio, richiede RAM per il buffering e CPU per l'ordinazione dei dati, ecc., Ma dovrebbe ridurre i costi di I / O, archiviazione e trasferimento e rendere efficiente legge soprattutto con query di tipo SQL (ad esempio, Hive o SparkSQL) che indirizzano solo una parte delle colonne.

In un progetto, sono finito per tornare dai contenitori Parquet ad Avro perché lo schema era troppo ampio e nidificato (essendo derivato da alcune classi orientate agli oggetti abbastanza gerarchiche) e ha prodotto migliaia di colonne Parquet. A loro volta, i nostri gruppi di righe erano molto ampi e poco profondi, il che significava che ci volle un'eternità prima che potessimo elaborare un piccolo numero di righe nell'ultima colonna di ogni gruppo.

Non ho ancora avuto molte possibilità di utilizzare Parquet per dati più normalizzati / sani, ma capisco che se usato bene, consente miglioramenti significativi delle prestazioni.


2
Parquet supporta anche set di dati / raccolte nidificati.
Tagar

@Ruslan: Sì, supportava tecnicamente le strutture annidate. Il problema era il numero molto elevato di colonne a causa di un'ampia denormalizzazione dei dati. Ha funzionato ma è stato molto lento.
piroscafo 25

4
Sì, scrivere i dati nel parquet è più costoso. Le letture sono invertite, soprattutto se le tue query normalmente leggono un sottoinsieme di colonne.
Tagar

4
Penso che Parquet sia adatto per la maggior parte dei casi d'uso tranne che i dati nella stessa colonna variano molto e vengono sempre analizzati su quasi tutte le colonne.
Rockie Yang,

Apache Arrow inoltre non supporta ancora la nidificazione mista (elenchi con dizionari o dizionari con elenchi). Quindi, se vuoi lavorare con un annidamento complesso in Parquet, sei bloccato con Spark, Hive, ecc. E strumenti che non si basano su Arrow per leggere e scrivere Parquet.
giosia

49

Avro è un formato basato su riga. Se desideri recuperare i dati nel loro insieme, puoi utilizzare Avro

Il parquet è un formato basato su colonne. Se i tuoi dati sono costituiti da molte colonne ma sei interessato a un sottoinsieme di colonne, puoi utilizzare Parquet

HBase è utile quando è coinvolto un aggiornamento frequente dei dati. Avro è veloce nel recupero, Parquet è molto più veloce.


7
Correggi le ultime due frasi nell'ultimo paragrafo. Sono assolutamente incomprensibili.
Cbhihe

39

Avro

  • Ampiamente usato come piattaforma di serializzazione
  • Basato su riga, offre un formato binario compatto e veloce
  • Lo schema è codificato nel file in modo che i dati possano essere rimossi
  • I file supportano la compressione a blocchi e sono divisibili
  • Supporta l'evoluzione dello schema

Parquet

  • Formato di file binario orientato alla colonna
  • Utilizza l'algoritmo di distruzione e assemblaggio dei record descritto nel documento Dremel
  • Ogni file di dati contiene i valori per un insieme di righe
  • Efficiente in termini di I / O del disco quando è necessario interrogare colonne specifiche

Dalla scelta di un formato di archiviazione dati HDFS: Avro vs. Parquet e altro ancora


30

Sia Avro che Parquet sono formati di archiviazione "auto-descrittivi", il che significa che entrambi incorporano dati, informazioni sui metadati e schemi durante l'archiviazione dei dati in un file. L'utilizzo di entrambi i formati di archiviazione dipende dal caso d'uso. Tre aspetti costituiscono la base su cui puoi scegliere quale formato sarà ottimale nel tuo caso:

  1. Operazione di lettura / scrittura : Parquet è un formato di file basato su colonne. Supporta l'indicizzazione. Per questo motivo è adatto per query di dati a bassa latenza, query di dati a bassa latenza, complesse o analitiche. Questo è generalmente utilizzato da utenti finali / data scientist.
    Nel frattempo Avro, essendo un formato di file basato su righe, viene utilizzato al meglio per operazioni a scrittura intensiva. Questo è generalmente utilizzato dai data engineer. Entrambi supportano i formati di serializzazione e compressione, sebbene lo facciano in modi diversi.

  2. Strumenti : il parquet è perfetto per Impala. (Impala è un motore di query SQL RDBM Massive Parallel Processing (MPP) che sa come operare sui dati che risiedono in uno o pochi motori di archiviazione esterni.) Anche in questo caso Parquet si presta bene a query complesse / interattive e veloce (bassa latenza ) esegue l'output sui dati in HDFS. Questo è supportato da CDH (Cloudera Distribution Hadoop). Hadoop supporta i formati ORC (Optimized Row Columnar) di Apache (le selezioni dipendono dalla distribuzione Hadoop), mentre Avro è più adatto all'elaborazione Spark.

  3. Evoluzione dello schema : l'evoluzione di uno schema DB significa cambiare la struttura del DB, quindi i suoi dati, e quindi la sua elaborazione delle query.
    Sia Parquet che Avro supportano l'evoluzione dello schema ma in misura diversa.
    Parquet è utile per le operazioni di 'accodamento', ad esempio l'aggiunta di colonne, ma non per rinominare le colonne a meno che 'lettura' non venga eseguita dall'indice.
    Avro è più adatto per aggiungere, eliminare e generalmente mutare colonne rispetto a Parquet. Storicamente Avro ha fornito una serie più ricca di possibilità di evoluzione dello schema rispetto a Parquet e, sebbene le loro capacità di evoluzione dello schema tendano a sfocarsi, Avro brilla ancora in quell'area, rispetto a Parquet.


5
La parte "Strumenti" è un po 'fuorviante. Parquet è utilizzato in modo efficiente da molti altri framework come Spark, Presto, Hive ecc. Avro non è specifico di Spark, è ampiamente utilizzato come formato di archiviazione HDFS e scenari di passaggio di messaggi come in Kafka.
ᐅ devrimbaris

2
Aakash Aggarwal: Puoi spiegare cosa intendi nel paragrafo 2 con "Avro è più adatto per l'elaborazione Spark"? Come accennato da devrimbaris, Parquet è molto ben integrato anche nell'ambiente di elaborazione Spark. o_O?!?
Cbhihe

11

La tua comprensione è giusta. In effetti, ci siamo imbattuti in una situazione simile durante la migrazione dei dati nel nostro DWH. Abbiamo scelto Parquet su Avro perché il risparmio su disco che abbiamo ottenuto è stato quasi il doppio di quello che abbiamo ottenuto con AVro. Inoltre, il tempo di elaborazione delle query è stato molto migliore di Avro. Ma sì, le nostre query erano basate sull'aggregazione, sulle operazioni basate su colonne, ecc.

Stiamo usando Hive 0.12 dalla distribuzione CDH. Hai detto che stai riscontrando problemi con Hive + Parquet, quali sono? Non ne abbiamo incontrati.


3

Silver Blaze ha messo bene la descrizione con un caso d'uso di esempio e ha descritto come Parquet fosse la scelta migliore per lui. Ha senso considerare l'uno sull'altro a seconda delle proprie esigenze. Sto anche fornendo una breve descrizione di diversi altri formati di file insieme al confronto della complessità dello spazio temporale. Spero che aiuti.

Esistono diversi formati di file che puoi utilizzare in Hive. Menzioni degni di nota sono AVRO, Parquet. RCFile e ORC. Ci sono alcuni buoni documenti disponibili online a cui puoi fare riferimento se desideri confrontare le prestazioni e l'utilizzo dello spazio di questi formati di file. Di seguito sono riportati alcuni collegamenti utili che ti aiuteranno a procedere.

Questo post sul blog

Questo collegamento da MapR [Tuttavia non parlano di parquet]

Questo collegamento da Inquidia

I collegamenti sopra indicati ti faranno andare avanti. Spero che questo risponda alla tua domanda.

Grazie!


0

Solo per una descrizione su Parquet, potete fare riferimento qui: http://bigdata.devcodenote.com/2015/04/parquet-file-format.html

Ho intenzione di scrivere molto presto su Avro e anche un confronto tra i 2. Lo pubblicherò qui una volta fatto.


Aspettando il confronto. Attualmente ho scelto Avro per il mio progetto in quanto il parquet ha problemi di compatibilità con l'alveare :)
Abhishek

1
@Abshinek, puoi fornire alcune informazioni sui problemi di compatibilità con hive e avro
EB

@EB Non dovrebbero esserci problemi, se ci sono, verrebbero menzionati su cwiki.apache.org/confluence/display/Hive/AvroSerDe
OneCricketeer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.