ho messa a punto un semplice test per lo streaming di file di testo da S3 e preso a lavorare quando ho provato qualcosa di simileSpark Streaming textFileStream che non supportano i caratteri jolly
val input = ssc.textFileStream("s3n://mybucket/2015/04/03/")
e nel secchio avrei file di log di andare lì e tutto funzionerebbe bene.
Ma se il loro era una sottocartella, non avrebbe trovato alcun file che hanno sistemati nella sottocartella (e sì, sono consapevole che HDFS non effettivamente utilizzare una struttura di cartelle)
val input = ssc.textFileStream("s3n://mybucket/2015/04/")
Quindi, ho cercato di fare semplicemente i caratteri jolly come ho fatto prima con un'applicazione standard di scintilla
val input = ssc.textFileStream("s3n://mybucket/2015/04/*")
Ma quando provo questo genera un errore
java.io.FileNotFoundException: File s3n://mybucket/2015/04/* does not exist.
at org.apache.hadoop.fs.s3native.NativeS3FileSystem.listStatus(NativeS3FileSystem.java:506)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1483)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1523)
at org.apache.spark.streaming.dstream.FileInputDStream.findNewFiles(FileInputDStream.scala:176)
at org.apache.spark.streaming.dstream.FileInputDStream.compute(FileInputDStream.scala:134)
at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1.apply(DStream.scala:300)
at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1$$anonfun$1.apply(DStream.scala:300)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1.apply(DStream.scala:299)
at org.apache.spark.streaming.dstream.DStream$$anonfun$getOrCompute$1.apply(DStream.scala:287)
at scala.Option.orElse(Option.scala:257)
.....
So per certo che è possibile utilizzare i caratteri jolly durante la lettura di fileInput per le applicazioni a scintilla standard, ma sembra che quando si esegue lo streaming input, non lo faccia né elabora automaticamente i file nelle sottocartelle. C'è qualcosa che mi manca qui ??
In definitiva quello che mi serve è un lavoro di streaming per essere in esecuzione 24/7 che sarà il monitoraggio di un secchio S3 che ha i log in esso riposte in base alla data
Quindi qualcosa di simile
s3n://mybucket/<YEAR>/<MONTH>/<DAY>/<LogfileName>
C'è qualche modo di consegnarlo in cima alla maggior parte delle cartelle e legge automaticamente i file che appaiono in qualsiasi cartella (perché ovviamente la data aumenterà ogni giorno)?
EDIT
Così sul scavare nella documentazione in http://spark.apache.org/docs/latest/streaming-programming-guide.html#basic-sources si afferma che le directory nidificate non sono supportate.
Qualcuno può far luce sul perché questo è il caso?
Inoltre, poiché i miei file saranno annidati in base alla loro data, quale sarebbe un buon modo per risolvere questo problema nella mia applicazione di streaming? È un po 'complicato dal momento che i log impiegano alcuni minuti per essere scritti su S3 e quindi l'ultimo file scritto per il giorno potrebbe essere scritto nella cartella del giorno precedente anche se siamo a pochi minuti dal nuovo giorno.
In realtà non sono sicuro se s3 supportano i caratteri jolly ... – eliasah
Lo fa sicuramente. I miei lavori hanno utilizzato i caratteri jolly negli ultimi 8 mesi. Inoltre, solo per un controllo di integrità ho appena eseguito un lavoro con input jolly, ha funzionato bene. Ho notato che è un po 'schizzinosi riguardo richiedono che non si fa qualcosa di simile S3N: // MyBucket/2015/04 * come dice che Exception in thread java.io.IOException "principale" : non un file: S3N: // MyBucket/2015/04/01 che ha un senso in quanto non è un file Ma se lo fai S3N: // MyBucket/2015/04/* E ' analizza correttamente tutti i file nelle sottocartelle dei giorni .... Questo tipo di mi sembra un insetto. –
Vado a rispondere alla domanda. Ricordo di avere un problema simile ma non ricordo come l'ho risolto. – eliasah