在csvs上有效地执行带有spark的COUNT DISTINCT?

时间:2016-10-24 00:33:21

标签: optimization apache-spark pyspark apache-spark-sql

我有大量数据,而且我希望有效地(即使用相对较小的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()

我的群集只是崩溃和灼伤 - 丢失内存异常或以其他方式挂起/崩溃/未完成操作。

我猜测在那里的某个地方有某种联系,这使得其中一个执行者感到震惊。记忆?

当源数据规模庞大且目标数据不足时(上述查询中的域列表相对较短,并且应该如此),执行此类操作的理想方法是什么?容易适应记忆)

此问题的相关信息:What should be the optimal value for spark.sql.shuffle.partitions or how do we increase partitions when using Spark SQL?

1 个答案:

答案 0 :(得分:1)

我建议调整执行程序设置。特别是,正确设置以下参数可以显着提高性能。

spark.executor.instances
spark.executor.memory
spark.yarn.executor.memoryOverhead
spark.executor.cores

在您的情况下,我还建议根据要求调整分区数,尤其是将参数从默认值200提升到更高值。

spark.sql.shuffle.partitions