【发布时间】:2015-07-29 07:18:35
【问题描述】:
我在 AWS 上有一个集群,有 2 个从属服务器和 1 个主服务器。所有实例都是 m1.large 类型。我正在运行火花版本 1.4。我正在对来自红移的 400 万数据的火花性能进行基准测试。我通过 pyspark shell 触发了一个查询
df = sqlContext.load(source="jdbc", url="connection_string", dbtable="table_name", user='user', password="pass")
df.registerTempTable('test')
d=sqlContext.sql("""
select user_id from (
select -- (i1)
sum(total),
user_id
from
(select --(i2)
avg(total) as total,
user_id
from
test
group by
order_id,
user_id) as a
group by
user_id
having sum(total) > 0
) as b
"""
)
当我执行 d.count() 时,上面的查询在 df 没有被缓存时需要 30 秒,而当df 被缓存在内存中时需要 17 秒。
我预计这些时间会接近 1-2 秒。
这些是我的火花配置:
spark.executor.memory 6154m
spark.driver.memory 3g
spark.shuffle.spill false
spark.default.parallelism 8
rest 设置为其默认值。任何人都可以看到我在这里缺少什么吗?
【问题讨论】:
-
仅内部查询的性能如何?
-
@Geek i1 耗时 13 秒(无缓存)。
-
.cache()只告诉 spark 在 spark 操作需要它时缓存它。第一次总是很慢。后续访问应该更快。我还注意到 EC2 上的 spark 没有激活c3-8xlarge上的所有内核,因为未设置 executor-cores。 -
我在缓存方面没有任何问题,但问题是即使在缓存之后查询也不够快。缓存数据帧后需要 17 秒才能完成。
-
如果我是你,我会检查此类查询的物理计划(使用
.explain()打印它)并查看 Spark Web UI 以检查哪些部分花费的时间最多。您使用的表是否还有其他列?仅缓存查询所需的内容可能会有所帮助。
标签: apache-spark apache-spark-sql pyspark