The Perfect Balance installation directory contains a complete example, including input data, of a Java MapReduce program that uses the Perfect Balance API.
For a description of the inverted index example and execution instructions, see orabalancer-<version>-h2/examples/invindx/README.txt
.
To explore the modified Java code, see orabalancer-<version>-h2/examples/jsrc/oracle/hadoop/balancer/examples/invindx/InvertedIndexMapred.java
or InvertedIndexMapreduce.java
.
The modifications to run Perfect Balance include the following:
The createBalancer
method validates the configuration properties and returns a Balancer
instance.
The waitForCompletion
method samples the data and creates a partitioning plan.
The addBalancingPlan
method adds the partitioning plan to the job configuration settings.
The configureCountingReducer
method collects additional load statistics.
The save
method saves the partition report and generates the Job Analyzer report.
Example 5-3 shows fragments from the inverted index Java code.
Example 5-3 Running Perfect Balance in a MapReduce Job
. . . import oracle.hadoop.balancer.Balancer; . . . ///// BEGIN: CODE TO INVOKE BALANCER (PART-1, before job submission) ////// Configuration conf = job.getConfiguration(); Balancer balancer = null; boolean useBalancer = conf.getBoolean("oracle.hadoop.balancer.driver.balance", true); if(useBalancer) { balancer = Balancer.createBalancer(conf); balancer.waitForCompletion(); balancer.addBalancingPlan(conf); } if(conf.getBoolean("oracle.hadoop.balancer.tools.useCountingReducer", true)) { Balancer.configureCountingReducer(conf); } ////////////// END: CODE TO INVOKE BALANCER (PART-1) ////////////////////// boolean isSuccess = job.waitForCompletion(true); /////////////////////////////////////////////////////////////////////////// // BEGIN: CODE TO INVOKE BALANCER (PART-2, after job completion, optional) // If balancer ran, this saves the partition file report into the _balancer // sub-directory of the job output directory. It also writes a JobAnalyzer // report. Balancer.save(job); ////////////// END: CODE TO INVOKE BALANCER (PART-2) ////////////////////// . . . }