我设置一个简单的测试,流从S3的文本文件,当我试图像星火流textFileStream不支持通配符
val input = ssc.textFileStream("s3n://mybucket/2015/04/03/")
得到它的工作,并在桶我本来的日志文件去那里一切都会正常工作。
但是,如果他们是一个子文件夹,它不会发现,得到了投入的子文件夹的任何文件(是的,我知道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)
.....
我知道一个事实,即在读标准Spark应用程序的fileInput时可以使用通配符,但似乎在进行流输入时,它不会这样做,也不会自动处理子文件夹中的文件。有什么我在这里失踪?
最终什么,我需要的是全天候运行streaming作业将被监视具有按日期放在它的日志的S3桶
因此,像
s3n://mybucket/<YEAR>/<MONTH>/<DAY>/<LogfileName>
有什么方式将其交给最顶层的文件夹,并自动读取显示在任何文件夹中的文件(因为显然日期会每天增加)?
编辑
所以在挖掘到的文档在http://spark.apache.org/docs/latest/streaming-programming-guide.html#basic-sources它指出嵌套目录,不支持。
谁能说出为什么会出现这种情况?
另外,由于我的文件将根据日期进行嵌套,因此在流式传输应用程序中解决此问题的好方法是什么?这有点复杂,因为日志需要几分钟才能写入S3,所以即使我们在新的一天进入了几分钟,也可以将前一天写入的最后一个文件写入前一天的文件夹。
其实我不确定s3是否支持通配符...... – eliasah 2015-04-03 09:19:24
它当然是。过去8个月,我的工作一直使用通配符。另外,仅仅为了理智检查,我只是用通配符输入了一个工作,工作得很好。 我也注意到,这是一个有点挑剔要求,你不这样做 S3N:// mybucket/2015/04 * 如说 异常线程“main”产生java.io.IOException :不是一个文件:S3N:// mybucket/2015/4月1日 这是有道理的,因为它不是一个文件 但是,如果你 S3N:// mybucket/2015/04/* 它正确解析天子文件夹中的所有文件.... 这种感觉对我来说就像一个错误。 – 2015-04-03 17:00:07
我要投票回答这个问题。我记得有类似的问题,但我不记得我是如何解决它的。 – eliasah 2015-04-03 17:03:09