【发布时间】:2016-07-17 01:46:29
【问题描述】:
我正在尝试通过 JAVA 代码在 SAP HANA 上使用 spark sql 执行查询。在对数据框对象调用任何操作时,我会得到 java.io.NotSerializableException。在下面的代码中,当调用 df.count(); 时,会抛出 NotSerializableException。
public class SaphanaTest implements Serializable {
private static final long serialVersionUID = 1L;
public void call() {
SparkConf sparkconf = new SparkConf().set("spark.master", "local[*]");
SparkContext sc = new SparkContext(sparkconf);
HiveContext sqlContext = new HiveContext(sc);
try {
Class.forName("com.sap.db.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Map<String, String> options = new HashMap<String, String>();
options.put("url",
"jdbc:sap://<IP>:30015/system");
options.put("user", "SYSTEM");
options.put("password", "Saphana123");
options.put("dbtable", "SYSTEM.TEST1");
DataFrame df = sqlContext.load("jdbc", options);
df.registerTempTable("temp");
df = sqlContext.sql("select * from temp");
long count = df.count();
sc.stop();
}
public static void main(String[] args) {
SaphanaTest test = new SaphanaTest();
test.call();
}
}
错误堆栈跟踪:
线程“main”中的异常org.apache.spark.SparkException:任务不可序列化 org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:315) 在 org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:305) 在 org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:132) 在 org.apache.spark.SparkContext.clean(SparkContext.scala:1893) 在 org.apache.spark.SparkContext.runJob(SparkContext.scala:1766) 在 org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1.org$apache$spark$rdd$RDD$$anonfun$$collectPartition$1(RDD.scala:900) 在 org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1$$anonfun$apply$30.apply(RDD.scala:902) 在 org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1$$anonfun$apply$30.apply(RDD.scala:902) 在 scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) 在 scala.collection.convert.Wrappers$IteratorWrapper.hasNext(Wrappers.scala:29) 在 com.impetus.saphana.SaphanaTest.main(SaphanaTest.java:48) 导致 由:java.io.NotSerializableException:com.sap.db.jdbc.topology.Host 序列化堆栈: - 对象不可序列化(类:com.sap.db.jdbc.topology.Host,值:172.26.52.54:30015) - writeObject 数据(类:java.util.ArrayList) - 对象(类 java.util.ArrayList,[172.26.52.54:30015]) - writeObject 数据(类:java.util.Hashtable) - 对象(类 java.util.Properties,{dburl=jdbc:sap://172.26.52.54:30015,user=SYSTEM, 密码=Saphana123, url=jdbc:sap://172.26.52.54:30015/?system&user=SYSTEM&password=Saphana123, dbtable=SYSTEM.TEST1,主机列表=[172.26.52.54:30015]}) - 字段(类:org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1,名称: properties$1,类型:类 java.util.Properties) - 对象(类 org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1, )
有什么建议吗? 在通过 google 进行研究后,我发现了一个使连接属性可序列化的建议。但我不知道如何使它在火花中可序列化。
感谢您对此的帮助。 提前谢谢你。
【问题讨论】:
标签: java jdbc apache-spark apache-spark-sql