我設置一個簡單的測試,流從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