如何使用apache spark流传输HDFS中已经存在的文件?
我有一个非常特定的用例,其中有数百万个客户数据,我想使用apache流在客户级别上处理它们。目前,我要做的是获取整个客户数据集,并在 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
和
// 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()
我总是得到0结果。如果没有发布新文件的HDFS中已经存在该文件,则可以从HDFS中流式传输文件。
答案 0 :(得分:0)
TL; DR 到目前为止,spark不支持此功能。您可以得到的最接近的方法是,在启动流上下文之后将文件移至hdfs:///tmp/dataset
中。
textFileStream
在内部使用FileInputDStream
,该选项具有选项newFilesOnly
。但这不会处理所有现有文件,而只会处理在流上下文之前一分钟内(由配置值spark.streaming.fileStream.minRememberDuration
设置)修改过的文件。以described in jira issue
当将newFilesOnly设置为false时,这意味着此FileInputDStream不仅将处理即将到来的文件,还将包括过去1分钟内出现的文件(不是所有旧文件)。在FileInputDStream.MIN_REMEMBER_DURATION中定义的时间长度。
或
您可以在开始流式传输上下文之前为现有文件创建(正常)RDD。以后可以与流RDD一起使用。