起源
故事的起源是同事接了一个非常傻*的需求叫按条数写文件,命题作文,能用的组件有Spark,Hdfs,Hbase,CarbonData,Obs,没了。
这需求具体是每次来多少数据不一定多少,要按一个规定的条数(具体我也忘了)去把它写到Hdfs里,生成多个文件。同事就问我做过这种东西没,怎么做。
为什么这需求很傻*
自从需求功能设计从组内切到组外,开始由不熟悉大数据组件的人做设计,不适合用spark做的需求就越来越多了。
动动脑,大概的想一下,RDD精准的去控制条数要首先拿到条数,这一个job就来了,然后要重新分区再去写文件,一个Shuffle又来了,数据要乾坤大挪移一遍。要不就要先写出去文件再读回来,吞了吐吐了吞何必呢。还有那种遍历文件找条数不够的写的方式,实话说,也挺有病的,况且这个文件名设计的不好就有并发写的问题,一个task重放没准就能撞见鬼。
怎么办
吐槽归吐槽,想想这东西怎么能成本比较小的实现呢?
抽象并且分解下这个需求,首先是,要指定条数写,那么在这之前就要拿到条数。什么是条数,就是index,那么,第一个问题就是,怎么给每条数据绑定index?有个api,zipWithIndex,分区大于1的时候会触发一个job。
关于写数据,这个也好办,查询出来数据条数,指定按规则repartition,单partition写成一个文件,就完事了。