PROOF allows running a ROOT job (either interactive or batch) over a multi-core architecture or a farm of processing nodes. The main data I/O in PROOF is done via xrootd, but can be done by any global file system (lustre, GFS, etc). The load balancing is done via the PROOF packetizer infrastructure which let workers pull work packets. By letting the workers drive the process the system is auto-load balanced.
During processing, each worker node creates a partial output list with the results of processing its part of the dataset. At the end of processing each worker sends its output list to the master node where all the partial lists are merged. As a result, a final output list is created and send to the client. The operations on the objects in output lists must be independent on the order in which they executed, like e.g. filling of a histogram or calculating the maximum variable.