我的目标是使用SparkStreaming监视用户输入。用户的输入是DStream,仅是数据记录(短字符串)的键。该程序需要过滤并通过用户输入的键值从HDFS序列文件(单个记录30MB,整个数据集约为10,000条记录)中读取静态数据集(非常大的RDD,bigRDD)。然后,程序将计算bigRDD,并将结果记录(每个记录30MB)返回给用户。我希望bigRDD的计算将尽可能地在本地分发,避免在网络上传输数据,并坚持使用以减少硬盘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处理数据。