@Mohit Jain basically there are two query engines— native and MSQ (multi-stage query). Native is designed for quick interactive queries, MSQ is designed for long running (minutes+) queries. Native uses persistent JVMs. MSQ uses dedicated JVMs (one per query) that are spun up for that query specifically, so there is some overhead to each query. We are still working on harmonizing the docs so it is more clear which doc applies to which engine (MSQ is much newer).
This doc is about how joins are executed in native:
https://druid.apache.org/docs/latest/querying/query-execution#join. They are always broadcast hash joins. So there is more of a "broadcast" not a "shuffle"
This doc is about joins in MSQ:
https://druid.apache.org/docs/latest/multi-stage-query/reference#joins. Joins can be broadcast or sort-merge. The sort-merge join is similar to Spark's sort-merge join. It shuffles based on the join key. With MSQ you can use the web console to understand performance of a query. It shows you each stage, how much time is spent in that stage, and how much data that stage processes.