Hadoop MapReduce提供了setUp()和cleanUp()操作,用于执行作业前后的初始化和清理,而Spark并没有提供这些Hook。
场景:假设Spark读取一个1T的文件,每一行解析后刷入redis,为了减小Redis集群压力,在本地缓存1000行后pipeline刷入。
问题:当读取到文件最后一行时,本地缓存只有800个记录,此时虽然不足1000行,但也要触发刷Redis,该怎么操作?
答案:利用Spark的
newAPIHadoopFile.mapPartitions(FlatMapFunction<T,R>)
具体写法如:
sparkContext.newAPIHadoopFile(input, ParquetInputFormat.class, LongWritable.class, Text.class, hadoopConf)
.mapPartitions(tuple2Iterator -> {
if (tuple2Iterator.hasNext()) {
// parse line and cache in local
} else {
// flush to redis
}
})