gpt4 book ai didi

apache-spark - 连接两个表时的 Spark 性能问题

转载 作者:行者123 更新时间:2023-12-02 17:14:05 25 4
gpt4 key购买 nike

我有两个大的 Hive 表,我想用 spark.sql 加入它们。假设我们有表 1 和表 2,表 1 有 500 万行,表 2 有 7000 万行。表采用 snappy 格式并在 Hive 中存储为 parquet 文件。

我想加入它们并在某些列上进行一些聚合让我们说计算所有行和列的平均值(例如 doubleColumn)同时使用两个条件进行过滤(假设在 col1,col2 上)。

注意:我在一台机器上进行测试安装(尽管它非常强大)。我预计集群中的性能可能会有所不同。

我的第一个尝试是像这样使用 spark sql:

 val stat = sqlContext.sql("select count(id), avg(doubleColumn) " +
" FROM db.table1 as t1 JOIN db.table2 " +
" ON t1.id = t2.id " +
" WHERE col1 = val1 AND col2 = val2").collect

不幸的是,即使我为每个执行程序和驱动程序提供至少 8 GB 的内存,它也只能运行大约 5 分钟。我还尝试使用数据框语法并尝试先过滤行并仅选择特定列以获得更好的选择性,例如:

//Filter first and select only needed column
val df = spark.sql("SELECT * FROM db.tab1")
val tab1= df.filter($"col1" === "val1" && $"col2" === "val2").select("id")

val tab2= spark.sql("SELECT id, doubleColumn FROM db.tab2")
val joined = tab1.as("d1").join(tab2.as("d2"), $"d1.id" === $"d2.id")

//Take the aggregations on the joined df
import org.apache.spark.sql.functions;

joined.agg(
functions.count("id").as("count"),
functions.avg("doubleColumn").as("average")
).show();

但这并没有显着的性能提升。如何提高 join 的性能?

  • 执行此 spark.sql 或 dataframe 语法的最佳方法是什么?

  • 提供更多执行器或内存会有帮助吗?

  • 我应该使用缓存吗?
    我缓存了数据帧 tab1、tab2 和连接聚合获得了显着的 yield ,但我认为缓存我的数据帧不切实际,因为我们对并发感兴趣,许多用户同时询问一些分析查询。

  • 是否因为我在单节点上工作而无事可做,当我转到集群上的生产环境时我的问题就会消失?

奖励问题:我用 Impala 尝试了这个查询,它做了大约 40 秒,但它比 spark.sql 好得多。 Impala 怎么能比 Spark 更好呢?!

最佳答案

Which is the best way to do this spark.sql or dataframe syntax?

没有任何区别。

Giving more executors or memory will help?

仅当问题不是由数据倾斜引起并且您正确调整配置时。

Should I use cache?

如果多次重复使用输入数据,那么(正如您已经确定的那样)在性能方面可能是可取的。

Is there nothing to do because I work on single node and my problems would go away when I go to production environment on a cluster?

一般情况下,单节点性能测试是完全没有用的。它忽略了瓶颈(网络 IO/通信)和优势(分摊磁盘 I/O 和资源使用)。

但是,您可以显着减少并行度(spark.sql.shuffle.partitionssql.default.parallelism 和增加输入拆分大小)。专为分配负载而设计的违反直觉的 Spark 式并行性在单台机器上更像是一种负担,而不是一种 Assets 。与共享内存相比,它依赖于随机播放(磁盘写入!)进行通信,这使得事情变得极其缓慢,并且调度开销很大。

How can Impala be better than spark?!

因为它是专门为低延迟并发查询而设计的。这不是 Spark 的目标(数据库与 ETL 框架)。

像你一样

as we are interested in concurrency many users simultaneously asking the some analytical query.

Spark 听起来不是一个正确的选择。

关于apache-spark - 连接两个表时的 Spark 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47569552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com