首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Apache Spark进行快速计算,但写入数据库会消耗大量时间

使用Apache Spark进行快速计算,但写入数据库会消耗大量时间
EN

Stack Overflow用户
提问于 2018-08-23 12:14:19
回答 2查看 847关注 0票数 0

我正在使用Apache spark从Oracle数据库中加载数据集,使用jdbc格式在Spark-Java.I中。我正在加载一个大小为10M和1M的数据集,并在dataset.After上执行各种操作。所有处理都完成了,我正在将多个数据集写入数据库,这几乎消耗了90%的时间。那么,如何降低这种写入Oracle数据库的速度呢?我尝试了执行器的各种组合--内存、核心、执行器的数量,但没有得到很大的差别。用于运行apache spark构建的jar文件的命令是:

代码语言:javascript
运行
复制
./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文件中写入方法如下:

代码语言:javascript
运行
复制
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进行优化的性能调优,以便加速写入数据库……

EN

回答 2

Stack Overflow用户

发布于 2018-08-23 12:40:28

尝试重新配置执行程序的总数,使其不超过可用内存,每个执行器只使用一个内核,这样您就可以获得更好的性能和并行性。

--num-executors=40 --executor-cores=1 --executor-memory=5G

请记住,JDBC连接对于每个执行器都是单线程的,因此只能使用一个核心。使用上述配置,将建立到RDBMS的40个并行连接。

此外,我建议使用.option("batchsize"," 10000 "),这样插入速度会更快,即一次插入10000条记录,而不是默认的1000条记录。

票数 1
EN

Stack Overflow用户

发布于 2018-08-23 15:19:58

使用spark-submit设置分区:

代码语言:javascript
运行
复制
spark.sql.shuffle.partitions=5000
conf spark.default.parallelism=5000

分区应为no of cores的倍数(8*625 = 5000)

如果你没有大量的数据,那么就不要有大量的分区。

您可以查看有关优化作业here的更多信息

您还可以设置这些属性:

batchsize:JDBC批处理大小,它决定每次往返插入多少行。这可以提高JDBC驱动程序的性能。此选项仅适用于写入。默认为1000。

numPartitions:可用于表读写并行的最大分区数。这也决定了并发JDBC连接的最大数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51978223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档