I'm trying to use org.slf4j.Logger
in spark. If I write as follows, I will get the error that non-static field cannot be referenced from a static context
. Because the method main
is static but logger
is non-static.
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.broadcast.Broadcast;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class simpleApp {
private final Logger logger = LoggerFactory.getLogger(getClass());
public static void main(String[] args) {
String logFile = "/user/beibei/zhaokai/spark_java/a.txt"; // Should be some file on your system
SparkConf conf = new SparkConf().setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(logFile).cache();
logger.info("loading graph from cache");
long numAs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("a"); }
}).count();
long numBs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("t"); }
}).count();
System.out.println("Lines with a: " + numAs + ", lines with t: " + numBs);
}
}
However, if I write like follows. I will get another
error Exception in thread "main" org.apache.spark.SparkException: Task not serializable.
Because the Object of Class simpleApp is not serializable.
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.broadcast.Broadcast;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class simpleApp {
private final Logger logger = LoggerFactory.getLogger(getClass());
public static void main(String[] args) {
new simpleApp().start();
}
private void start() {
String logFile = "/path/a.txt"; // Should be some file on your system
SparkConf conf = new SparkConf().setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(logFile).cache();
logger.info("loading graph from cache");
long numAs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("a"); }
}).count();
long numBs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) { return s.contains("t"); }
}).count();
System.out.println("Lines with a: " + numAs + ", lines with t: " + numBs);
}
}
So what am I supposed to do?
If I want to use some other packages like org.slf4j.Logger
, will I meet the same problem?