我正在使用一个带有两个节点的Spark集群,每个节点都有两个执行程序(每个执行程序使用2个内核和6GB内存)。
这是一个很好的群集配置,可以更快地执行我的spark作业吗?
我是一个新手,我正在处理8000万行数据,其中包括改组沉重的任务,例如聚合(计数)和联接操作(在数据帧上自行联接)。
瓶颈:
我应该采取什么方法,如何消除瓶颈?
任何建议都是非常可取的。
query =““(从表中选择x,y,z)作为df”
jdbcDF = spark.read.format("jdbc").option("url", mysqlUrl) \
.option("dbtable", query) \
.option("user", mysqldetails[2]) \
.option("password", mysqldetails[3]) \
.option("numPartitions", "1000")\
.load()
这给了我一个数据框,在jdbcDF.rdd.getNumPartitions()上给我的值为1。我在这里错过了什么吗?我想我没有并行化我的数据集。
答案 0 :(得分:1)
有多种方法可以提高应用程序的性能。 PFB的某些方面可能会有所帮助。
尝试减少要处理的记录和列的数量。如前所述,您是新手,可能不需要全部8000万行,因此可以根据需要过滤行。另外,选择必填而不是全部的列。
如果您经常使用某些数据,请尝试考虑对数据进行缓存,以便在下一步操作中将其从内存中读取。
如果要连接两个DataFrame,并且其中一个足够小以适合内存,则可以考虑使用broadcast join。
增加资源可能并不能在所有情况下提高应用程序的性能,但是查看集群的配置应该会有所帮助。最好投入更多资源并检查性能。
您还可以尝试使用Spark UI监视您的应用程序,并查看是否有比其他任务花费更多时间的任务。那么可能您需要处理数据的偏斜。
您可以尝试考虑根据过滤条件中使用的列对数据进行分区。