Я установил простой тест для потоковой передачи текстовых файлов с S3 и заставил его работать, когда я попробовал что-то вроде
val input = ssc.textFileStream("s3n://mybucket/2015/04/03/")
и в bucket я бы запустил файлы журналов, и все будет нормально работать.
Но если они были вложенной папкой, они не нашли бы файлы, которые были помещены во вложенную папку (и да, я знаю, что hdfs фактически не использует структуру папок)
val input = ssc.textFileStream("s3n://mybucket/2015/04/")
Итак, я попытался просто сделать подстановочные знаки, как это было раньше, при использовании стандартного искрового приложения
val input = ssc.textFileStream("s3n://mybucket/2015/04/*")
Но когда я пытаюсь это сделать, он выдает ошибку
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)
.....
Я знаю, что вы можете использовать подстановочные знаки при чтении fileInput для стандартных искровых приложений, но кажется, что при выполнении потокового ввода он не делает этого и не выполняет автоматическую обработку файлов в подпапках. Есть ли что-то, что я здесь отсутствует?
В конечном итоге мне нужна работа с потоками, работающая 24/7, которая будет контролировать ведро S3 с логами, помещенными в него по дате
Так что-то вроде
s3n://mybucket/<YEAR>/<MONTH>/<DAY>/<LogfileName>
Есть ли способ передать его самой большой папке и автоматически читать файлы, которые отображаются в любой папке (потому что, очевидно, дата будет увеличиваться каждый день)?
ИЗМЕНИТЬ
Итак, перейдя в документацию на http://spark.apache.org/docs/latest/streaming-programming-guide.html#basic-sources, говорится, что вложенные каталоги не поддерживаются.
Может кто-нибудь пролить свет на то, почему это так?
Кроме того, поскольку мои файлы будут вложенными в зависимости от их даты, что было бы хорошим способом решить эту проблему в моем потоковом приложении? Это немного сложно, так как журналы занимают несколько минут, чтобы записать их на S3, поэтому последний файл, написанный за день, может быть записан в папке предыдущего дня, даже если мы находимся несколько минут в новый день.