我在AWS上有一个由2个从节点和1个主节点组成的集群,所有实例都是m1.large类型。我正在运行Spark版本1.4,对来自Redshift的4m数据的Spark性能进行基准测试。我通过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配置:
spark.executor.memory 6154m
spark.driver.memory 3g
spark.shuffle.spill false
spark.default.parallelism 8
rest被设置为其默认值。有人能看出我漏掉了什么吗?
.explain()
打印出来),并查看Spark Web UI以确定哪些部分需要最多时间。你使用的表是否有其他列?只缓存查询所需的列可能会有所帮助。 - krcz