Spark查询运行非常缓慢

12

我在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被设置为其默认值。有人能看出我漏掉了什么吗?


1
仅内部查询的性能如何? - Geek
@Geek i1 花费了 13 秒(无缓存)。 - Arpit
我在缓存方面没有任何问题,但是查询即使在缓存后仍然不够快。在缓存数据框之后,完成查询需要17秒。 - Arpit
如果我是你,我会检查这个查询的物理计划(使用.explain()打印出来),并查看Spark Web UI以确定哪些部分需要最多时间。你使用的表是否有其他列?只缓存查询所需的列可能会有所帮助。 - krcz
@krcz 最耗时的是shuffle阶段和垃圾回收。 - Arpit
显示剩余6条评论
2个回答

4
这是正常的,不要期望Spark像mysql或postgres那样在几毫秒内运行。与Hive、Impala等其他大数据解决方案相比,Spark具有较低的延迟...您不能将其与经典数据库进行比较,Spark不是一个索引数据的数据库!
观看此视频:https://www.youtube.com/watch?v=8E0cVWKiuhk 他们在这里清楚地介绍了Spark: Spark not so low latency 你试过Apache Drill吗?我发现它比Spark更快一些(我用它来处理小的HDFS JSON文件,2/3Gb,对于SQL查询比Spark快得多)。

1
  1. default.parallelism 设置为2
  2. 使用 --num-executor-cores 8 启动Spark
  3. 修改此部分

df.registerTempTable('test') d=sqlContext.sql("""...

改为

df.registerTempTable('test') sqlContext.cacheTable("test") d=sqlContext.sql("""...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接