Sto lavorando a un lavoro che elabora una struttura di directory annidata, contenente i file su più livelli:Hadoop MapReduce fornire le directory nidificate come input di lavoro
one/
├── three/
│ └── four/
│ ├── baz.txt
│ ├── bleh.txt
│ └── foo.txt
└── two/
├── bar.txt
└── gaa.txt
Quando aggiungo one/
come un percorso di ingresso, nessun file sono elaborato, poiché nessuno è immediatamente disponibile a livello di root.
Ho letto su job.addInputPathRecursively(..)
, ma questo sembra essere stato deprecato nelle versioni più recenti (sto usando hadoop 1.0.2). Ho scritto del codice per camminare sulle cartelle e aggiungere ogni dir con job.addInputPath(dir)
, che ha funzionato fino a quando il lavoro si è bloccato durante il tentativo di elaborare una directory come file di input per qualche motivo, ad es. - provare a fs.open(split.getPath())
, quando split.getPath()
è una directory (questo accade all'interno di LineRecordReader.java
).
Sto cercando di convincermi che ci deve essere un modo più semplice per fornire un lavoro con una struttura di directory annidata. Qualche idea?
EDIT - a quanto pare c'è uno open bug su questo.
È così diffuso utilizzare 'FileSystem # listStatus()' e aggiungerli ricorsivamente? –
Lo sto risolvendo in modo simile - ho scritto codice ricorsivo che attraversa le sottodirectory e aggiungo tutti i file ai percorsi di input –
@ThomasJungblut che fondamentalmente è il mio approccio attuale. Trovo strano che questa funzionalità non sia integrata.Un altro problema che sto riscontrando è che haemoop si blocca quando accede a una sottocartella senza file, solo altre cartelle (come 'one' e' one/three' nel mio esempio). Quindi, in pratica, ho bisogno di implementare la logica che aggiungerà le cartelle in modo ricorsivo a meno che ** solo ** abbiano altre cartelle al loro interno, invece dei file (devono ancora percorrere il loro contenuto per aggiungere file nidificati). Sembra un sacco di problemi solo per creare un lavoro. – sa125