使用Spark Streaming读取fileStream

时间:2016-05-27 21:32:21

标签: scala hadoop apache-spark 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分钟只会更改一次?

1 个答案:

答案 0 :(得分:2)

只是一些原始想法。

  

当我启动应用程序时,数据已加载但如果我触摸则会加载   本地文件并覆盖HDFS上的文件我不会看到它的内容   打印出来了

对于Spark Streaming来处理数据,必须以原子方式创建文件,例如通过将文件移动到Spark正在监视的目录中。文件重命名操作通常是原子操作。你可以测试一下,确认它有效吗?

  

如何缓存和重新加载这些数据?   当我缓存它时,它将在工作节点上可用或者这样   (连同加入)会在驱动程序中发生吗?

直截了当的解决方案可能是在foreachRDD()方法中注册临时表。当流式传输期间出现新数据时,可以重新创建适当的表。请记住,foreachRDD()方法中的逻辑应该是幂等的。

了解表名后,您可以轻松创建一个单独的查询管道,该管道将连接此预先缓存的临时表中的数据。只需确保将StreamingContext设置为记住足够数量的流数据,以便查询可以运行。

  

我是否还应将StreamingContext时间间隔设置为10分钟   我每10分钟只会有变化吗?

在理想情况下,节奏应该匹配。为了安全起见,您还可以检查在foreachRDD()方法中收到新数据时的时间戳。