在 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结构。
- 按日期分区
- 然后按用户id的前2位进行分区
- 用户 ID 字段
- 用户其他相关信息
partition date
partition first 2 digit
User id
other info
17
01
01234
...
18
01
01234
...
18
02
02345
...
现在我尝试了两种方案,
在不同的驱动节点上创建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 个 spark 会话并使用与上述相同的字符串进行查询。本次session也获取了代码中限制的所有资源,相当于多session的情况。
- 1 个驱动程序 / 1 CPU / 4 GB
- 4 个执行器/每个执行器 1 CPU/每个执行器 4 GB
结果让我感到惊讶,在多个 spark 会话情况下每个应用程序的查询时间是 10 分钟,这比 5 的一个 spark 会话高得多分钟!
我很好奇为什么多个 spark 会话会使查询变慢?有没有人遇到同样的问题?
先谢谢大家了!
理论上,两种情况下的性能应该相同,但还有其他因素可能会影响作业的调度。根据我的经验,您可能会遇到任何这些限制。
- 您在其中触发 Spark 作业的作业池的资源少于 8 个作业实例所需的资源。假设每个 instance/run 需要 4 个执行器,所以当你是 运行 8 个作业实例时,这意味着你总共请求 32 个执行器。如果您的作业队列配置为支持 20 个执行程序(执行程序可能受到分配给队列的内核数或内存或两者的限制)。您的 8 个作业无法实现最大并行度,因此与同时获得所需的所有资源并能够实现最大并行度的单个实例 运行 相比,它看起来很慢
- 您的集群 运行 已满负荷运行,并将其中的大部分资源用于其他生产作业,因此同一作业的 8 个实例同时在等待资源。
- 如果您 运行 对 8 个实例进行单个测试,则可能在父目录或配置单元上发生写入作业 table 这可能导致您的作业进入等待状态。
这些是我在职业生涯中遇到的一些问题,也可能有其他因素。我建议从您的系统管理员那里获取 yarn schedular 或 queues 的访问权限,看看是否其中之一是罪魁祸首。
我在同一个 HDFS 文件的不同驱动程序节点查询上有多个 Spark 会话,比方说 Table T1。下面是T1结构。
- 按日期分区
- 然后按用户id的前2位进行分区
- 用户 ID 字段
- 用户其他相关信息
partition date | partition first 2 digit | User id | other info |
---|---|---|---|
17 | 01 | 01234 | ... |
18 | 01 | 01234 | ... |
18 | 02 | 02345 | ... |
现在我尝试了两种方案,
在不同的驱动节点上创建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 个 spark 会话并使用与上述相同的字符串进行查询。本次session也获取了代码中限制的所有资源,相当于多session的情况。
- 1 个驱动程序 / 1 CPU / 4 GB
- 4 个执行器/每个执行器 1 CPU/每个执行器 4 GB
结果让我感到惊讶,在多个 spark 会话情况下每个应用程序的查询时间是 10 分钟,这比 5 的一个 spark 会话高得多分钟!
我很好奇为什么多个 spark 会话会使查询变慢?有没有人遇到同样的问题?
先谢谢大家了!
理论上,两种情况下的性能应该相同,但还有其他因素可能会影响作业的调度。根据我的经验,您可能会遇到任何这些限制。
- 您在其中触发 Spark 作业的作业池的资源少于 8 个作业实例所需的资源。假设每个 instance/run 需要 4 个执行器,所以当你是 运行 8 个作业实例时,这意味着你总共请求 32 个执行器。如果您的作业队列配置为支持 20 个执行程序(执行程序可能受到分配给队列的内核数或内存或两者的限制)。您的 8 个作业无法实现最大并行度,因此与同时获得所需的所有资源并能够实现最大并行度的单个实例 运行 相比,它看起来很慢
- 您的集群 运行 已满负荷运行,并将其中的大部分资源用于其他生产作业,因此同一作业的 8 个实例同时在等待资源。
- 如果您 运行 对 8 个实例进行单个测试,则可能在父目录或配置单元上发生写入作业 table 这可能导致您的作业进入等待状态。
这些是我在职业生涯中遇到的一些问题,也可能有其他因素。我建议从您的系统管理员那里获取 yarn schedular 或 queues 的访问权限,看看是否其中之一是罪魁祸首。