【问题标题】:Spark stream unable to read files created from flume in hdfsSpark 流无法读取从 hdfs 中的水槽创建的文件
【发布时间】:2015-08-23 17:32:32
【问题描述】:
我创建了一个实时应用程序,在该应用程序中,我使用 Flume 从博客将数据流写入 hdfs,然后使用 spark 流处理该数据。但是,当水槽在 hdfs 中写入和创建新文件时,火花流无法处理这些文件。如果我使用 put 命令将文件放入 hdfs 目录,则火花流能够读取和处理文件。任何有关相同的帮助都会很棒。
【问题讨论】:
标签:
hadoop
apache-spark
hdfs
spark-streaming
flume-ng
【解决方案1】:
您自己检测到了问题:当数据流继续时,HDFS 文件被“锁定”并且不能被任何其他进程读取。相反,正如你所经历的,如果你放了一批数据(那是你的文件,一批,而不是流),一旦上传就可以读取了。
无论如何,并且不是 Spark 流方面的专家,从 Spark Streaming Programming Guide,概述部分看来,您没有执行正确的部署。我的意思是,从那里显示的图片来看,流(在这种情况下由 Flume 生成)似乎必须直接发送到 Spark Streaming 引擎;然后将结果放入 HDFS。
尽管如此,如果你想维护你的部署,即 Flume -> HDFS -> Spark,那么我的建议是在临时 HDFS 文件夹中创建小批量数据,一旦小批量准备好,存储新数据在第二个小批量中,将第一批传递给 Spark 进行分析。
HTH
【解决方案2】:
除了 frb 的回答:这是正确的 - 带有 Flume 的 SparkStreaming 充当 Avro RPC 服务器 - 您需要配置一个指向您的 SparkStreaming 实例的 AvroSink。
【解决方案3】:
有了spark2,现在你可以直接将你的spark流连接到flume,见官方docs,然后在进程结束时在HDFS上写一次。
import org.apache.spark.streaming.flume._
val flumeStream = FlumeUtils.createStream(streamingContext, [chosen machine's hostname], [chosen port])