我正在使用Apache spark从Oracle数据库中加载数据集,使用jdbc格式在Spark-Java.I中。我正在加载一个大小为10M和1M的数据集,并在dataset.After上执行各种操作。所有处理都完成了,我正在将多个数据集写入数据库,这几乎消耗了90%的时间。那么,如何降低这种写入Oracle数据库的速度呢?我尝试了执行器的各种组合--内存、核心、执行器的数量,但没有得到很大的差别。用于运行apache spark构建的jar文件的命令是:
./spark-submit --class com.sample.Transformation --conf spark.sql.shuffle.partitions=5001 --num-executors=22 --executor-cores=8 --executor-memory=10GB --jars /scratch/rmbbuild/spark_ormb/drools-jars/ojdbc6.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-api-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/drools-core-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/drools-compiler-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-soup-maven-support-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-internal-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/xstream-1.4.10.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-soup-commons-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/ecj-4.4.2.jar,/scratch/rmbbuild/spark_ormb/drools-jars/mvel2-2.4.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-soup-project-datamodel-commons-7.7.0.Final.jar,/scratch/rmbbuild/spark_ormb/drools-jars/kie-soup-project-datamodel-api-7.7.0.Final.jar --driver-class-path /scratch/rmbbuild/spark_ormb/drools-jars/ojdbc6.jar --master spark://10.180.182.218:7077 "/scratch/rmbbuild/spark_ormb/POC-jar/Transformation-0.0.1-SNAPSHOT.jar" > /scratch/rmbbuild/spark_ormb/POC-jar/logs/logs10.txt在Transformation.java文件中写入方法如下:
txndetailDS.write().mode("append").format("jdbc").option("url", connection).option("dbtable", CI_TXN_DETAIL).save();
finalpriceItemParamsGrpDS.distinct().write().mode("append").format("jdbc").option("url", connection).option("dbtable", CI_PRICEITEM_PARM_GRP_K).save();
finalpriceItemParamsGroupTable.distinct().write().mode("append").format("jdbc").option("url", connection).option("dbtable", CI_PRICEITEM_PARM_GRP).save();
finalPritmOutput.distinct().write().mode("append").format("jdbc").option("url", connection).option("dbtable", CI_TXN_DTL_PRITM).save();
outputDataSetforsummary.write().mode("append").format("jdbc").option("url", connection).option("dbtable", CI_TXN_DTL_PRITM_SUMMARY).save();那么,如果有谁遇到过这个问题,可以帮我解决吗?
或者如何在这种情况下对spark-submit进行优化的性能调优,以便加速写入数据库……
发布于 2018-08-23 12:40:28
尝试重新配置执行程序的总数,使其不超过可用内存,每个执行器只使用一个内核,这样您就可以获得更好的性能和并行性。
--num-executors=40 --executor-cores=1 --executor-memory=5G
请记住,JDBC连接对于每个执行器都是单线程的,因此只能使用一个核心。使用上述配置,将建立到RDBMS的40个并行连接。
此外,我建议使用.option("batchsize"," 10000 "),这样插入速度会更快,即一次插入10000条记录,而不是默认的1000条记录。
发布于 2018-08-23 15:19:58
使用spark-submit设置分区:
spark.sql.shuffle.partitions=5000
conf spark.default.parallelism=5000分区应为no of cores的倍数(8*625 = 5000)
如果你没有大量的数据,那么就不要有大量的分区。
您可以查看有关优化作业here的更多信息
您还可以设置这些属性:
batchsize:JDBC批处理大小,它决定每次往返插入多少行。这可以提高JDBC驱动程序的性能。此选项仅适用于写入。默认为1000。
numPartitions:可用于表读写并行的最大分区数。这也决定了并发JDBC连接的最大数量。
https://stackoverflow.com/questions/51978223
复制相似问题