Optimal operator placement for distributed stream processing applications