Currently the org.apache.hadoop.hdfs.server.mover.Mover$Processor#chooseTarget() always chooses the first matching target datanode from the candidate list. This may make the mover schedule a lot of task to a few of the datanodes (first several datanodes of the candidate list). The overall performance will suffer significantly from this because of the saturated network/disk usage. Specially, if the dfs.datanode.balance.max.concurrent.moves is set, the scheduled move task will be queued on a few of the storage group, regardless of other available storage groups. We need an algorithm which can distribute the move tasks approximately even across all the candidate target storage groups.
Thanks szetszwo for offline discussion.