使用默认的foreache的性能缺陷是哪里?
首先,对于每条数据,都要单独去调用一次function,task为每个数据,都要去执行一次function函数。
如果100万条数据(一个partition),调用100万次,性能比较差
另外一个非常非常重要的一点
如果每个数据,你都要去创建一个数据库连接,那么你就得建立100万次数据库连接,但是要注意的是,数据库连接的创建和销毁,都是非常非常消耗性能的,虽然我们之前已经用了数据库连接池,只是创建了固定数量的数据库连接,但是你还是得多次通过数据库连接向mysql发送一条sql语句,如果有100万条,那么就100万次发送sql语句
以上俩点,(多次创建数据库连接,多次发送SQL语句,)都是非常非常消耗性能的
解决:
foreachpartition算子来写库:
1. 对于我们写的function函数,就调用一次,一次传入一个partition所有数据
2. 主要创建或者获取一个数据库连接就可以
3. 只要想数据库发送一次sql语句和多组参数即可
在使用foreache 还是 foreachePartition算子上,如果数据量不是很大可一用后者,数据量大后者容易OOM
那么用foreachePartition算子可以用批处理sql语句方法