Scala 使用ApacheSpark蒸汽从HDFS流文件

Scala 使用ApacheSpark蒸汽从HDFS流文件,scala,apache-spark,apache-spark-sql,hdfs,spark-streaming,Scala,Apache Spark,Apache Spark Sql,Hdfs,Spark Streaming,如何使用apache spark对HDFS中已有的文件进行流式处理? 我有一个非常具体的用例,其中我有数百万的客户数据,我希望使用apache stream在客户级别处理它们。目前我正在尝试做的是将整个客户数据集和重新分区放在customerId上,并创建100个这样的分区,确保在一个流中传递唯一的客户多个记录 现在我有了HDFS位置中的所有数据 hdfs:///tmp/dataset 现在,使用上面的HDFS位置,我想要流式传输文件,这些文件将读取拼花地板文件,并获取数据集。我试过以下方法,但

如何使用apache spark对HDFS中已有的文件进行流式处理?

我有一个非常具体的用例,其中我有数百万的客户数据,我希望使用apache stream在客户级别处理它们。目前我正在尝试做的是将整个客户数据集和重新分区放在customerId上,并创建100个这样的分区,确保在一个流中传递唯一的客户多个记录

现在我有了HDFS位置中的所有数据

hdfs:///tmp/dataset

现在,使用上面的HDFS位置,我想要流式传输文件,这些文件将读取拼花地板文件,并获取数据集。我试过以下方法,但没有成功

// start stream
val sparkConf = new SparkConf().setAppName("StreamApp")

// Create the context
val ssc = new StreamingContext(sparkConf, Seconds(60))
val dstream = ssc.sparkContext.textFile("hdfs:///tmp/dataset")

println("dstream: " + dstream)
println("dstream count: " + dstream.count())
println("dstream context: " + dstream.context)

ssc.start()
ssc.awaitTermination()


NOTE: This solution doesn't stream data it just reads data from HDFS


我总是得到0的结果。如果HDFS中已经存在没有发布新文件的文件,则可以从HDFS流式传输文件。

TL;DR目前spark不支持此功能。您可以通过将文件移动到
hdfs:///tmp/dataset
启动流媒体上下文后


textFileStream
在内部使用
FileInputDStream
,它有一个选项
newFilesOnly
。但这不会处理所有现有文件,只处理在流上下文之前一分钟内修改的文件(由config value
spark.streaming.fileStream.minRememberDuration设置)。作为

当您将newFilesOnly设置为false时,这意味着此FileInputDStream不仅处理即将到来的文件,而且还包括在过去1分钟内到来的文件(不是所有旧文件)。FileInputDStream.MIN_memory_DURATION中定义的时间长度


您可以在启动流上下文之前创建一个(普通)RDD来删除现有文件。以后可以与流RDD一起使用。

最简单的方法是将文件移动到
hdfs:///tmp/dataset
流媒体上下文启动后。
// start stream
val sparkConf = new SparkConf().setAppName("StreamApp")

// Create the context
val ssc = new StreamingContext(sparkConf, Seconds(60))
val dstream = ssc.textFileStream("hdfs:///tmp/dataset")

println("dstream: " + dstream)
println("dstream count: " + dstream.count())
println("dstream context: " + dstream.context)

dstream.print()
ssc.start()
ssc.awaitTermination()