使用Apache Spark Steaming从HDFS流式传输文件

时间:2018-07-06 14:23:44

标签: scala apache-spark apache-spark-sql hdfs spark-streaming

如何使用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中流式传输文件。

1 个答案:

答案 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一起使用。