在 Hadoop table 中查询同一分区的多个 spark 会话是否会使查询变慢?

Do multiple spark sessions which query on the same partition in Hadoop table make the query slower?

我在同一个 HDFS 文件的不同驱动程序节点查询上有多个 Spark 会话,比方说 Table T1。下面是T1结构。

partition date partition first 2 digit User id other info
17 01 01234 ...
18 01 01234 ...
18 02 02345 ...

现在我尝试了两种方案,

  1. 在不同的驱动节点上创建8个多个spark会话(使用集群模式)并发查询完全相同的分区和用户id,每个会话获取代码中限制的所有资源,例如每个会话花费

    • 1 个驱动程序 / 1 CPU / 4 GB
    • 4 个执行器/每个执行器 1 CPU/每个执行器 4 GB

下面是示例查询。

SELECT * FROM T1 
WHERE user_id = '01234' AND partition_date IN ('17', '18') AND partition_first_2_digit IN ('01', '02')
  1. 仅创建 1 个 spark 会话并使用与上述相同的字符串进行查询。本次session也获取了代码中限制的所有资源,相当于多session的情况。

    • 1 个驱动程序 / 1 CPU / 4 GB
    • 4 个执行器/每个执行器 1 CPU/每个执行器 4 GB

结果让我感到惊讶,在多个 spark 会话情况下每个应用程序的查询时间是 10 分钟,这比 5 的一个 spark 会话高得多分钟!

我很好奇为什么多个 spark 会话会使查询变慢?有没有人遇到同样的问题?

先谢谢大家了!

理论上,两种情况下的性能应该相同,但还有其他因素可能会影响作业的调度。根据我的经验,您可能会遇到任何这些限制。

  1. 您在其中触发 Spark 作业的作业池的资源少于 8 个作业实例所需的资源。假设每个 instance/run 需要 4 个执行器,所以当你是 运行 8 个作业实例时,这意味着你总共请求 32 个执行器。如果您的作业队列配置为支持 20 个执行程序(执行程序可能受到分配给队列的内核数或内存或两者的限制)。您的 8 个作业无法实现最大并行度,因此与同时获得所需的所有资源并能够实现最大并行度的单个实例 运行 相比,它看起来很慢
  2. 您的集群 运行 已满负荷运行,并将其中的大部分资源用于其他生产作业,因此同一作业的 8 个实例同时在等待资源。
  3. 如果您 运行 对 8 个实例进行单个测试,则可能在父目录或配置单元上发生写入作业 table 这可能导致您的作业进入等待状态。

这些是我在职业生涯中遇到的一些问题,也可能有其他因素。我建议从您的系统管理员那里获取 yarn schedular 或 queues 的访问权限,看看是否其中之一是罪魁祸首。