簡體   English   中英

使用Spark Streaming讀取fileStream

[英]Reading fileStream with Spark Streaming

我在HDFS上有一個目錄,每10分鍾復制一個文件(現有文件將被覆蓋)。 我想使用Spark流( 1.6.0 )讀取文件的內容,並將其用作參考數據以將其加入其他流。

我將“ 記住窗口spark.streaming.fileStream.minRememberDuration為“ 600s ”,並將newFilesOnly設置為false ,因為啟動應用程序時,我不會從已經存在的HDFS中獲取初始數據。

val ssc = new StreamingContext(sparkConf, Seconds(2))
def defaultFilter(path: Path): Boolean = !path.getName().startsWith(".")
val lines: DStream[String] = 
   ssc.fileStream[LongWritable, Text, TextInputFormat](loc, defaultFilter(_), false).map(_._2.toString)
lines.foreachRDD { x => x.foreach(println) }

我的想法是將此DStream的內容持久保存到內存中,並將維護此“ 批處理查找緩存 ”的任務委托給Spark。 我希望在HDFS目錄中進行每次更改后,都可以自動擁有新數據,我可以將其加入其他流。

我不明白的是:

  • 當我啟動應用程序時,數據已加載,但是如果我在本地觸摸文件並覆蓋HDFS上的文件,我將不再看到其內容
  • 如何緩存和重新加載此數據?
  • 當我緩存它時,它將在工作程序節點上可用還是在驅動程序中發生(連同連接)?

我是否還應該將StreamingContext時間間隔設置為10分鍾,因為我每10分鍾只會更改一次?

只是一些原始想法。

當我啟動應用程序時,數據已加載,但是如果我在本地觸摸文件並覆蓋HDFS上的文件,我將不再看到其內容

為了使Spark Streaming能夠處理數據,必須原子創建文件,例如,通過將文件移動到Spark正在監視的目錄中。 文件重命名操作通常是原子的。 您可以測試一下以驗證其是否正常工作嗎?

如何緩存和重新加載此數據? 當我緩存它時,它將在工作程序節點上可用還是在驅動程序中發生(連同連接)?

簡單的解決方案可能是在foreachRDD()方法中注冊臨時表。 當在流傳輸期間會有新數據出現時,可以重新創建適當的表。 請記住,foreachRDD()方法中的邏輯應該是冪等的。

知道了表名后,您可以輕松創建一個單獨的查詢管道,該管道將聯接來自此預緩存的臨時表的數據。 只要確保將StreamingContext設置為記住足夠的流數據即可運行查詢。

我是否還應該將StreamingContext時間間隔設置為10分鍾,因為我每10分鍾只會更改一次?

在理想情況下,節奏應該匹配。 為了安全起見,您也可以檢查何時在foreachRDD()方法中接收到新數據的時間戳。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM