我正在尝试使用数据源MySQL的Apache Spark。我有一个集群有1个主节点和1个从属节点,都有8 GB RAM和2个核心我正在提交我的SQL查询以使用spark-shell进行激发,并且该表有这么多行。我正在执行组到该表上。和时间由MySQL是5.2secs和使用火花时,我正在执行查询时间是21Secs。为什么发生这种情况?为什么spark还比mysql慢?
我还设置了一些配置,如partitionColumn,upperBound,lowerBound和numofPartitions但仍然没有变化。
我也曾尝试与执行使用1,2,4内核的查询,但在火花所花费的时间是相同的21Secs。
发生这个问题是因为我的MySQL数据库在单台机器上,而所有的火花节点都试图将数据查询到单台机器上?
任何人都可以帮我解决这个问题吗?
有一个名为demo_call_stats上我试图查询表的数据库是:
val jdbcDF = spark.read.format("jdbc").options(Map("url" -> "jdbc:mysql://192.168.0.31:3306/cmanalytics?user=root&password=","zeroDateTimeBehaviour"->"convertToNull", "dbtable" -> "cmanalytics.demo_call_stats", "fetchSize" -> "10000", "partitionColumn" -> "newpartition", "lowerBound" -> "0", "upperBound" -> "4", "numPartitions" -> "4")).load()
jdbcDF.createOrReplaceTempView("call_stats")
val sqlDF = sql("select Count(*), classification_id from call_stats where campaign_id = 77 group by classification_id")
sqlDF.show()
任何帮助将非常感激。
感谢
如果数据不在RAM中,Spark在执行计算之前需要将其拉出。因此,网络IO可能是一个瓶颈。由于我不确定你是如何衡量你的查询性能的,也不知道你的查询是什么,也不知道你的数据分布,所以我们在这里帮不了你的忙。 – eliasah
考虑共享一些代码和一些关于你的数据的信息!你可能没有得到一个具体的解决方案,但也许我可以帮助你一些指针。 – eliasah
@eliasah我正在测量使用火花Web UI的查询性能。 –