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