@Romano, Anthony @KranthiPakala-MSFT
This is a known issue. ADF doesn't do any dynamic loadbalancing.
It is a primitive scheduler that divides the work into buckets at the start of the operation, and those buckets don't get replenished with any additional/remaining work once they are emptied.
Here is a reference:
"The queues are pre-created. This means there is no rebalancing of the queues during the runtime."
ADF is great for certain activities (ie. copy activities that ingest data into ADLS parquet). I think the intention is that ADF activities need to be driven by a "real" compute resource that can do the top-level orchestration. Eg. You can trigger your ADF pipelines using REST from a Web Job in Azure Service or from Azure Functions. As long as your top-level orchestration is outside of ADF, you have a lot of flexibility.
I had opened a support case and the documentation you see in the link above was the resolution of the case. Ideally ADF would use dynamic loadbalancing since that is how customers would expect it to behave.
Another solution is to organize your list of work manually with longer tasks sequenced on one side of the list and shorter tasks on the other. When this type of list is parallelized, it might end up being fairly well balanced. Unfortunately this is a hack and you can't always predict the amount of time that activities will take.