我是Spark的新手,我必须支持我们的顾问编写的应用程序。我阅读并观看了大量有关Spark的信息,但我仍然在努力解决这些小细节以正确调整工作。
情景:
以下是我用来写的代码:
rdd.coalesce(100)
.write().mode("append")
.partitionBy("year", "month")
.format(SPARK_AVRO_PACKAGE)
.save(appProps.getProperty(PAGEVIEW_CLEANSED));
我不确定是否应该努力改进代码或调整spark / cluster的性能。
UPDATE :我认为这段代码对我遇到的问题负有责任。我在SO上发现了类似的帖子(Spark not distributing load to tasks evenly),我不知道如何在我的情况下使用广播。
Dataset<Row> duplicatePrefetchPrerenderHashDS =
hashedPageViewDS
.select(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
.groupBy(hashedPageViewDS.col(PREFETCH_PRERENDER_HASH))
.count()
.withColumnRenamed("count", "cnt")
.where("cnt>1");
答案 0 :(得分:0)
您可以采取多种方法:
您可以尝试分发(“年”,“月”)这将确保每个文件夹只有1个分区写入。如果数据在年份和月份之间均匀分布。
如果问题实际上在某些年份出现偏差。然后我会说使用重新分区(1000)以及使用distributeBy(“年”,“月”,“COL1”)。在上面的例子中,COL1将是一个几乎像MONY或DATE的DAY一样事件分布的列。现在,不是将200(默认随机排序值)文件写入每个分区,而是COL1将决定没有写入的文件(30是有几天)
另一件有用的事情是使用重新分区(100)而不是合并(100),因为重新分区将均匀分布数据,从而导致更多分区为输出中的每个分区提供数据。
< / LI> 醇>