我有大量数据,而且我希望有效地(即使用相对较小的Spark群集)执行COUNT和DISTINCT操作之一。
如果我做了看似显而易见的事情,即将数据加载到数据帧中:
df = spark.read.format("CSV").load("s3://somebucket/loadsofcsvdata/*").toDF()
df.registerView("someview")
然后尝试运行查询:
domains = sqlContext.sql("""SELECT domain, COUNT(id) FROM someview GROUP BY domain""")
domains.take(1000).show()
我的群集只是崩溃和灼伤 - 丢失内存异常或以其他方式挂起/崩溃/未完成操作。
我猜测在那里的某个地方有某种联系,这使得其中一个执行者感到震惊。记忆?
当源数据规模庞大且目标数据不足时(上述查询中的域列表相对较短,并且应该如此),执行此类操作的理想方法是什么?容易适应记忆)
答案 0 :(得分:1)
我建议调整执行程序设置。特别是,正确设置以下参数可以显着提高性能。
spark.executor.instances
spark.executor.memory
spark.yarn.executor.memoryOverhead
spark.executor.cores
在您的情况下,我还建议根据要求调整分区数,尤其是将参数从默认值200提升到更高值。
spark.sql.shuffle.partitions