【问题标题】:Connecting to SAPHANA from Spark从 Spark 连接到 SAPHANA
【发布时间】: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


    【解决方案1】:

    Blog 帖子中的注释部分解决了我的问题,您也可以尝试:

    注意:我已经使用最新的 SPS12 版本的 Hana JDBC 驱动程序 (ngdbc.jar) 针对 SPS10 和 SPS12 系统测试了 Spark,两者似乎都可以正常工作。旧版本的驱动程序在 Spark 中出现以下错误:'org.apache.spark.SparkException: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException: com.sap.db.jdbc.topology.Host'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-20
      • 2016-04-25
      • 1970-01-01
      • 2022-10-19
      • 2020-05-10
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多