Ho due impostazioni HDFS e voglio copiare (non migrare o spostare) alcune tabelle da HDFS1 a HDFS2. Come posso copiare i dati da un HDFS a un altro HDFS? È possibile tramite Sqoop o un'altra riga di comando?Come si copia i dati da un HDFS a un altro HDFS?
risposta
DistCp (copia distribuita) è uno strumento utilizzato per copiare i dati tra i cluster. Utilizza MapReduce per effettuare la distribuzione, la gestione e il recupero degli errori e il reporting. Espande un elenco di file e directory in input per mappare le attività, ognuna delle quali copierà una partizione dei file specificati nell'elenco sorgente.
utilizzati: $ hadoop distcp <src> <dst>
esempio: $ hadoop distcp hdfs://nn1:8020/file1 hdfs://nn2:8020/file2
file1
da nn1
viene copiato nn2
con nome file2
Distcp è il miglior strumento fin d'ora. Sqoop viene utilizzato per copiare i dati dal database relazionale a HDFS e viceversa, ma non tra HDFS e HDFS.
Maggiori informazioni:
Ci sono due versioni disponibili - le performance di runtime in distcp2
è più rispetto al distcp
distcp
viene utilizzato per copiare i dati a e dai filesystem hadoop in parallelo. È simile al comando generico hadoop fs -cp
. Nel processo in background, distcp
viene implementato come un lavoro MapReduce in cui i mapping sono implementati solo per la copia in parallelo attraverso il cluster.
Usage:
copia un file all'altro
% hadoop distcp file1 file2
directory copiare da una posizione a un'altra
% hadoop distcp dir1 dir2
Se dir2
non esiste, verrà creata tale cartella e verrà copiato il contenuto. Se dir2
esiste già, allora verrà copiato sotto di esso. L'opzione -overwrite
impone la sovrascrittura dei file all'interno della stessa cartella. L'opzione -update
aggiorna solo i file che sono stati modificati.
trasferimento di dati tra due cluster HDFS
% hadoop distcp -update -delete hdfs://nn1/dir1 hdfs://nn2/dir2
-delete
opzione consente di eliminare i file o le directory dalla destinazione che non sono presenti nella sorgente.
Hadoop viene fornito con un programma utile chiamato distcp
per la copia in parallelo di grandi quantità di dati da e verso Hadoop Filesystems. Il caso d'uso canonico per distcp è per il trasferimento di dati tra due cluster HDFS. Se i cluster eseguono versioni identiche di hadoop, lo schema hdfs è appropriato da utilizzare.
$ hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
I dati nella directory di /foo
namenode1 verranno copiati/bar directory di namenode2. Se la directory /bar
non esiste, la creerà. Inoltre possiamo menzionare più percorsi sorgente.
Simile al comando rsync
, il comando distcp per impostazione predefinita salterà i file già esistenti. Possiamo anche utilizzare l'opzione -overwrite
per sovrascrivere i file esistenti nella directory di destinazione. L'opzione -update
aggiornerà solo i file che sono stati modificati.
$ hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo
distcp
può anche essere implementato come un lavoro MapReduce in cui il lavoro di copiatura è fatto dalle mappe che corrono in parallelo all'interno del cluster. Non ci saranno riduttori.
Se si tenta di copiare i dati tra due cluster HDFS che eseguono versioni diverse, la copia verrà elaborata non funzionerà, poiché i sistemi RPC non sono compatibili. In tal caso, è necessario utilizzare i filesystem HFTP basati su HTTP di sola lettura per leggere dal sorgente. Qui il lavoro deve essere eseguito sul cluster di destinazione.
$ hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
50070 è il numero di porta predefinito per il server Web incorporato del namenode.
Provare dtIngest, è stato sviluppato sulla piattaforma Apache Apex. Questo strumento copia i dati da diverse fonti come HDFS, unità condivisa, NFS, FTP, Kafka verso diverse destinazioni. La copia dei dati dal cluster HDFS remoto al cluster HDFS locale è supportata da dtIngest. dtIngest esegue processi filati per copiare i dati in modo parallelo, quindi è molto veloce. Si occupa della gestione degli errori, del ripristino ecc. E supporta periodicamente le directory di polling per eseguire copie continue.
Usage: dtingest [OPZIONE] ... SourceURL ... destinationUrl esempio: HDFS dtingest: HDFS 8020/Fonte:: // // nN1 nN2: 8020/dest
E 'anche utile notare che è possibile eseguire i lavori MapReduce sottostanti con il cluster di origine o di destinazione in questo modo:
hadoop --config /path/to/hadoop/config distcp <src> <dst>