blob: 255650edb519acc452812a5d67f3ac2376c278c2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pig.backend.hadoop.executionengine.mapReduceLayer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pig.EvalFunc;
import org.apache.pig.LoadFunc;
import org.apache.pig.StoreFunc;
import org.apache.pig.backend.hadoop.executionengine.physicalLayer.PigLogger;
import org.apache.pig.tools.pigstats.PigStatusReporter;
/**
*
* A singleton class that implements the PigLogger interface
* for use in map reduce context. Provides ability to aggregate
* warning messages
*/
public final class PigHadoopLogger implements PigLogger {
private static Log log = LogFactory.getLog(PigHadoopLogger.class);
private static PigHadoopLogger logger = null;
private PigStatusReporter reporter = null;
private boolean aggregate = false;
private PigHadoopLogger() {
}
/**
* Get singleton instance of the context
*/
public static PigHadoopLogger getInstance() {
if (logger == null) {
logger = new PigHadoopLogger();
}
return logger;
}
public void setReporter(PigStatusReporter reporter) {
this.reporter = reporter;
}
@Override
@SuppressWarnings("rawtypes")
public void warn(Object o, String msg, Enum warningEnum) {
String className = o.getClass().getName();
String displayMessage = className + "(" + warningEnum + "): " + msg;
if (getAggregate()) {
if (reporter != null) {
if (o instanceof EvalFunc || o instanceof LoadFunc || o instanceof StoreFunc) {
reporter.incrCounter(className, warningEnum.name(), 1);
}
// For backwards compatibility, always report with warningEnum, see PIG-3739
reporter.incrCounter(warningEnum, 1);
} else {
//TODO:
//in local mode of execution if the PigHadoopLogger is used initially,
//then aggregation cannot be performed as the reporter will be null.
//The reference to a reporter is given by Hadoop at run time.
//In local mode, due to the absence of Hadoop there will be no reporter
//Just print the warning message as is.
//If a warning message is printed in map reduce mode when aggregation
//is turned on then we have a problem, its a bug.
log.warn(displayMessage);
}
} else {
log.warn(displayMessage);
}
}
public synchronized boolean getAggregate() {
return aggregate;
}
public synchronized void setAggregate(boolean aggregate) {
this.aggregate = aggregate;
}
}