我的目标是使用SparkStreaming监控用户输入。用户的输入是DStream,只是数据记录(短字符串(的键。程序需要通过用户输入的键值从HDFS序列文件(单条记录30MB,整个数据集约10,000条记录(中过滤和读取静态数据集(非常大的RDD,bigRDD(。然后程序计算bigRDD并将结果记录(每个30MB(返回给用户。我希望 bigRDD 的计算尽可能的在本地分发,避免网络上的数据传输,并使用 persist 来减少硬盘 IO 时间。具体步骤应该如何设计? 我试过了:
JavaStreamingContext jsc = new JavaStreamingContext(...) ;
JavaDStream<String> lines = jsc.socketTextStream(...) ;
seqRDD = jsc.sparkContext().sequenceFile(...);// RDD from sequence file can not cache.
bigRDD = pairRdd.mapToPair(...) ;// bigRDD is used for cache.
bigRDD.cache() ;
inputDStream = lines.mapToPair(...) ; // convert DStream<string> to PairDStream<string,string> for join.
inputDStream.foreachRDD (inputRdd-> {
bigRDD2 = inputRdd.join(bigRDD);
resultRDD = bigRDD2.map( ... do calculation ... );
send_result_to_user(resultRDD) ;
})
但我不知道这些步骤是否合适?
我将尝试每批广播来自DStream.RDD.collection((的数据,并使用RDD mapPartitions来处理数据。