Spark读取hdfs文件多行缓存后刷入redis,最后如何clean up本地缓存

339 阅读1分钟

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
            }
        })