我正在尝试对评论进行感性分析。程序在Spark上运行成功,但我遇到的问题是70个分区中的68个分区导致大约20%的时间与最后2个分区所花费的时间相比。我检查过我的数据在所有分区上均匀分布,甚至还检查了不同的样本数据。
此外,我已使用persist(StorageLevel.MEMORY_AND_DISK_SER)
为所有数据帧运行代码,并在不再需要这些数据帧时立即取消这些数据框。
我也尝试增加和减少分区数量,但仍然需要最后2个任务,这需要很长时间。以下是我正在使用的当前配置
--master yarn \
--deploy-mode client \
--num-executors 15 \
--executor-cores 5 \
--executor-memory 32g \
--driver-memory 8g \
--driver-cores 8 \
我使用过KryoSerializer。以下是在sparkConf
中设置的sparkConf.set("spark.driver.allowMultipleContexts", "true")
sparkConf.set("spark.scheduler.mode", "FAIR")
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
sparkConf.set("spark.kryoserializer.buffer.max", "1024m")
如何进行优化,以便最后2个分区不花费那么多时间? 感谢
答案 0 :(得分:1)
尝试使用KYRO序列化,默认的java序列化有点慢。 当它写回DISK并获取数据时,它正在传输大量数据,因此您需要使用更好的序列化技术。
答案 1 :(得分:0)
您正在以客户端模式运行,请尝试在群集模式下运行。在集群模式下,驱动程序在集群中作为另一个进程启动。
答案 2 :(得分:0)
执行程序处理时间大部分都不依赖于您对数据进行分区的方式以及当时繁忙的工作节点。尝试重新查看分区逻辑(尝试增加分区号)并增加核心和执行程序内存的数量。它根据您的特定用例进行特定调整。在我的情况下,我将分区数从100增加到1000,执行程序的数量增加到10,核心2解决了这个问题。它还取决于你的数据集的大小。
答案 3 :(得分:0)
NLP任务可能需要不同的时间,具体取决于数据因素。例如,斯坦福大学的CoreNLP需要很长时间才能在长句上做NER(时间会随着句子中令牌数的平方而上升)。
如果每次都是一个不同的分区,那么我猜你的群集的大小是不方便的:执行者的数量不会均匀分配到分区的数量。检查此问题的一种简单方法是将70个分区重新划分为700个分区,并查看所用时间是否仍为2个或3个分区,或者时间是否均匀。如果它仍然是两个或三个分区,则可能是数据问题。如果时间平均,则归因于分区/执行器不匹配。