You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by GitBox <gi...@apache.org> on 2022/07/28 14:07:59 UTC

[GitHub] [spark] ulysses-you opened a new pull request, #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression

ulysses-you opened a new pull request, #37330:
URL: https://github.com/apache/spark/pull/37330

   <!--
   Thanks for sending a pull request!  Here are some tips for you:
     1. If this is your first time, please read our contributor guidelines: https://spark.apache.org/contributing.html
     2. Ensure you have added or run the appropriate tests for your PR: https://spark.apache.org/developer-tools.html
     3. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP][SPARK-XXXX] Your PR title ...'.
     4. Be sure to keep the PR description updated to reflect all changes.
     5. Please write your PR title to summarize what this PR proposes.
     6. If possible, provide a concise example to reproduce the issue for a faster review.
     7. If you want to add a new configuration, please read the guideline first for naming configurations in
        'core/src/main/scala/org/apache/spark/internal/config/ConfigEntry.scala'.
     8. If you want to add or modify an error type or message, please read the guideline first in
        'core/src/main/resources/error/README.md'.
   -->
   
   ### What changes were proposed in this pull request?
   <!--
   Please clarify what changes you are proposing. The purpose of this section is to outline the changes and how this PR fixes the issue. 
   If possible, please consider writing useful notes for better and faster reviews in your PR. See the examples below.
     1. If you refactor some codes with changing classes, showing the class hierarchy will help reviewers.
     2. If you fix some SQL features, you can provide some references of other DBMSes.
     3. If there is design documentation, please add the link.
     4. If there is a discussion in the mailing list, please add the link.
   -->
   Optimize Global sort to RepartitionByExpression, for example:
   ```
   Sort local             Sort local 
     Sort global    =>      RepartitionByExpression
   ```
   
   ### Why are the changes needed?
   <!--
   Please clarify why the changes are needed. For instance,
     1. If you propose a new API, clarify the use case for a new API.
     2. If you fix a bug, you can clarify why it is a bug.
   -->
   If a global sort below a local sort, the only meaningful thing is it's distribution. So this pr optimizes that global sort to RepartitionByExpression to save a local sort.
   
   ### Does this PR introduce _any_ user-facing change?
   <!--
   Note that it means *any* user-facing change including all aspects such as the documentation fix.
   If yes, please clarify the previous behavior and the change this PR proposes - provide the console output, description and/or an example to show the behavior difference if possible.
   If possible, please also clarify if this is a user-facing change compared to the released Spark versions or within the unreleased branches such as master.
   If no, write 'No'.
   -->
   no, only improve performance
   
   ### How was this patch tested?
   <!--
   If tests were added, say they were added here. Please make sure to add some test cases that check the changes thoroughly including negative and positive cases if possible.
   If it was tested in a way different from regular unit tests, please clarify how you tested step by step, ideally copy and paste-able, so that other reviewers can test and check, and descendants can verify in the future.
   If tests were not added, please describe why they were not added and/or why it was difficult to add.
   If benchmark tests were added, please run the benchmarks in GitHub Actions for the consistent environment, and the instructions could accord to: https://spark.apache.org/developer-tools.html#github-workflow-benchmarks.
   -->
   add test


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] [spark] cloud-fan closed pull request #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression

Posted by GitBox <gi...@apache.org>.
cloud-fan closed pull request #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression
URL: https://github.com/apache/spark/pull/37330


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "maytasm (via GitHub)" <gi...@apache.org>.
maytasm commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1868219583

   @cloud-fan Confirmed that PR https://github.com/apache/spark/pull/44429 fixed the issue I was having with the no-op sort!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "ulysses-you (via GitHub)" <gi...@apache.org>.
ulysses-you commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1837693411

   hi @maytasm , `Sort global` is semantics equal to `Sort local + RepartitionByExpression`. For your case, if there is only single value on the sort column, then Sort global would also introduce a range partitioning shuffle and make a single partition task at the end. Can you show a real case if you find any behavior change ?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] [spark] cloud-fan commented on pull request #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression

Posted by GitBox <gi...@apache.org>.
cloud-fan commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1199430528

   cc @sigmod


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "cloud-fan (via GitHub)" <gi...@apache.org>.
cloud-fan commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1867413757

   Oh now I get it. This is sort by a constant. Can you try the latest master branch? I think https://github.com/apache/spark/pull/44429/files#diff-11264d807efa58054cca2d220aae8fba644ee0f0f2a4722c46d52828394846efR214 has solved it.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "maytasm (via GitHub)" <gi...@apache.org>.
maytasm commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1867341537

   @ulysses-you 
   Sorry for the late reply. That is true unless the following condition is True for the `Sort global`:
   `    case s @ Sort(orders, _, child) if orders.isEmpty || orders.exists(_.child.foldable) =>
         val newOrders = orders.filterNot(_.child.foldable)
         if (newOrders.isEmpty) {
           applyLocally.lift(child).getOrElse(child)
         }
   `
   In the case that the above condition is True, then this `Sort global` will be removed. However, with this change (in this PR), the `Sort global` will not be removed as it would have been turn into a RepartitionByExpression
   
   Consider the following case: 
   `
   +- Sort [date#0 ASC NULLS FIRST], false
      +- Project [...]
         +- Sort [20231221 ASC NULLS FIRST], true
            +- Aggregate [...]
                  +- RelationV2[...] some_table
   `
   with the change from this PR, the `Sort [20231221 ASC NULLS FIRST], true` would be remove. We would end up with 
   `
   +- Sort [date#0 ASC NULLS FIRST], false
      +- Project [...]
            +- Aggregate [...]
                  +- RelationV2[...] some_table
   `
   However, with the change in this PR:
   `
   +- Sort [date#0 ASC NULLS FIRST], false
      +- Project [...]
         +- Exchange rangepartition (20231221 ASC NULL FIRST)
            +- Aggregate [...]
                  +- RelationV2[...] some_table
   `
   The problem here is that `Exchange rangepartition` reduces the partition to 1. Then the stages after that like the Sort on date#0 ran with a single task. 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "cloud-fan (via GitHub)" <gi...@apache.org>.
cloud-fan commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1867347895

   > without the change from this PR, the Sort [20231221 ASC NULLS FIRST], true would be remove.
   
   Are you sure? It looks wrong to do so


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] [spark] cloud-fan commented on pull request #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression

Posted by GitBox <gi...@apache.org>.
cloud-fan commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1201979396

   @ulysses-you can you open a backport PR for 3.3? I think this is a necessary followup of https://github.com/apache/spark/pull/37250 to avoid perf regression.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "maytasm (via GitHub)" <gi...@apache.org>.
maytasm commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1867364494

   @cloud-fan 
   Can you expand on why you think the `Sort [20231221 ASC NULLS FIRST], true` looks wrong to remove? It is a sort that has no reference and should be fine to remove.
   `Sort [20231221 ASC NULLS FIRST], true` would look something like:
   ![image](https://github.com/apache/spark/assets/52679095/e48f7a6d-2385-4734-af0a-0195ef8d31a9)
   Since Literal is foldable, `newOrders` would be empty. As `newOrders` is empty, the sort is then removed.
   This is explained in https://github.com/apache/spark/pull/11840 
   
   I believe this PR prevents the optimization added in https://github.com/apache/spark/pull/11840 to work as intended since it convert the no-op sort into RepartitionByExpression, which can no longer be removed


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


[GitHub] [spark] cloud-fan commented on pull request #37330: [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression

Posted by GitBox <gi...@apache.org>.
cloud-fan commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1200744193

   thanks, merging to master!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "maytasm (via GitHub)" <gi...@apache.org>.
maytasm commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1836761095

   @ulysses-you @cloud-fan 
   Not sure if I am missing something but can this causes performance degradation if my sort order is on a key with few/single values?
   For example, if I have 500 shuffle partitions...
   Without this change:
   ```
   Sort local    
     Sort global   
   ```
    both of the above stages would run with 500 tasks
   With this change: and say the RepartitionByExpression is on the column date and there is only a single value for this in my dataset
   ```
   Sort local 
      RepartitionByExpression
   ```
   RepartitionByExpression will run with 500 tasks and create a single partition
   then the Sort would run with a single task (as there is only a single partition)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org


Re: [PR] [SPARK-39911][SQL] Optimize global Sort to RepartitionByExpression [spark]

Posted by "maytasm (via GitHub)" <gi...@apache.org>.
maytasm commented on PR #37330:
URL: https://github.com/apache/spark/pull/37330#issuecomment-1867510631

   Ah! I haven't tried running yet but took a look at PR https://github.com/apache/spark/pull/44429/ and I think it does solve this issue. So basically the logic for converting `global sort` to `Exchange rangepartition` is moved into another rule, RemoveRedundantSorts, and EliminateSorts is run before RemoveRedundantSorts. Meaning the no-op sort like `Sort [20231221 ASC NULLS FIRST], true` would be remove by EliminateSorts already by the time RemoveRedundantSorts is run. 


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org