This project has retired. For details please refer to its Attic page.
MasterLoggingAggregator xref
View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.giraph.utils;
20  
21  import org.apache.giraph.aggregators.TextAppendAggregator;
22  import org.apache.giraph.master.MasterAggregatorUsage;
23  import org.apache.giraph.worker.WorkerAggregatorUsage;
24  import org.apache.hadoop.conf.Configuration;
25  import org.apache.hadoop.io.Text;
26  import org.apache.log4j.Logger;
27  
28  /**
29   * Helper class for using aggregator which gathers log messages from workers
30   * and prints them on master.
31   *
32   * If you want to track what's going on in your application,
33   * and want to have all those logs accessible in a single place in the end of
34   * each superstep, you can use option from this class.
35   *
36   * If you use a lot of log messages this might slow down your application,
37   * but it can easily be turned on/off without changing your code just by
38   * switching the option.
39   */
40  public class MasterLoggingAggregator {
41    /** Whether or not to use master logging aggregator */
42    public static final String USE_MASTER_LOGGING_AGGREGATOR =
43        "giraph.useMasterLoggingAggregator";
44    /** Default is not using master logging aggregator */
45    public static final boolean USE_MASTER_LOGGING_AGGREGATOR_DEFAULT = false;
46    /** Name of aggregator which will be gathering the logs */
47    public static final String MASTER_LOGGING_AGGREGATOR_NAME =
48        "masterLoggingAggregator";
49  
50    /** Class logger */
51    private static final Logger LOG =
52        Logger.getLogger(MasterLoggingAggregator.class);
53  
54    /** Do not instantiate */
55    private MasterLoggingAggregator() {
56    }
57  
58    /**
59     * Check if master logging aggregator is used.
60     *
61     * @param conf Configuration
62     * @return True iff master logging aggregator is used
63     */
64    public static boolean useMasterLoggingAggregator(Configuration conf) {
65      return conf.getBoolean(USE_MASTER_LOGGING_AGGREGATOR,
66          USE_MASTER_LOGGING_AGGREGATOR_DEFAULT);
67    }
68  
69    /**
70     * Set whether or not master logging aggregator should be used
71     *
72     * @param useMasterLoggingAggregator Whether or not we want
73     *                                   master logging aggregator to be used
74     * @param conf                       Configuration
75     */
76    public static void setUseMasterLoggingAggregator(
77        boolean useMasterLoggingAggregator, Configuration conf) {
78      conf.setBoolean(USE_MASTER_LOGGING_AGGREGATOR, useMasterLoggingAggregator);
79    }
80  
81    /**
82     * Aggregate some message to master logging aggregator,
83     * if the option for using it is set in the configuration.
84     *
85     * This is the method application implementation should use
86     * in order to add message to the aggregator.
87     *
88     * @param message               Message to log
89     * @param workerAggregatorUsage Worker aggregator usage
90     *                              (can be Vertex, WorkerContext, etc)
91     * @param conf                  Configuration
92     */
93    public static void aggregate(String message,
94        WorkerAggregatorUsage workerAggregatorUsage, Configuration conf) {
95      if (useMasterLoggingAggregator(conf)) {
96        workerAggregatorUsage.aggregate(
97            MASTER_LOGGING_AGGREGATOR_NAME, new Text(message));
98      }
99    }
100 
101   /**
102    * Register master logging aggregator,
103    * if the option for using it is set in the configuration.
104    *
105    * This method will be called by Giraph infrastructure on master.
106    *
107    * @param masterAggregatorUsage Master aggregator usage
108    * @param conf                  Configuration
109    */
110   public static void registerAggregator(
111       MasterAggregatorUsage masterAggregatorUsage, Configuration conf) {
112     if (useMasterLoggingAggregator(conf)) {
113       try {
114         masterAggregatorUsage.registerAggregator(MASTER_LOGGING_AGGREGATOR_NAME,
115             TextAppendAggregator.class);
116       } catch (InstantiationException e) {
117         throw new IllegalStateException("registerAggregator: " +
118             "InstantiationException occurred");
119       } catch (IllegalAccessException e) {
120         throw new IllegalStateException("registerAggregator: " +
121             "IllegalAccessException occurred");
122       }
123     }
124   }
125 
126   /**
127    * Print value of master logging aggregator on the master log,
128    * if the option for using it is set in the configuration.
129    *
130    * This method will be called by Giraph infrastructure on master.
131    *
132    * @param masterAggregatorUsage Master aggregator usage
133    * @param conf                  Configuration
134    */
135   public static void logAggregatedValue(
136       MasterAggregatorUsage masterAggregatorUsage, Configuration conf) {
137     if (useMasterLoggingAggregator(conf) && LOG.isInfoEnabled()) {
138       LOG.info("logAggregatedValue: \n" +
139           masterAggregatorUsage.getAggregatedValue(
140               MASTER_LOGGING_AGGREGATOR_NAME));
141     }
142   }
143 }