【发布时间】:2019-04-30 10:35:03
【问题描述】:
我正在尝试在 spark 中使用 org.slf4j.Logger。如果我写如下,我会得到non-static field cannot be referenced from a static context的错误。因为方法main 是静态的,而logger 是非静态的。
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);
}
}
但是,如果我这样写。我会再买一个
线程“主”org.apache.spark.SparkException 中的错误异常:任务 不可序列化。
因为simpleApp类的对象是不可序列化的。
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);
}
}
那我该怎么办?
如果我想使用其他一些包,比如org.slf4j.Logger,我会遇到同样的问题吗?
【问题讨论】:
-
那么让
logger成为simpleApp类的静态成员怎么样?例如LoggerFactory.getLogger(simpleApp.class)?
标签: java apache-spark slf4j