簡體   English   中英

Apache Spark MySQL JavaRDD.foreachPartition-為什么我收到ClassNotFoundException

[英]Apache Spark MySQL JavaRDD.foreachPartition - why I getting ClassNotFoundException

我想將每個分區的數據保存到MySQL數據庫。 為此,我創建了實現VoidFunction<> Class:

public class DatabaseSaveFunction implements VoidFunction<Iterator<String>> {

    /**
     * 
     */
    private static final long serialVersionUID = -7039277486852158360L;

    public void call(Iterator<String> it) {
        Connection connect = null;
        PreparedStatement preparedStatement = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connect = DriverManager.getConnection("jdbc:mysql://"
                    + "xxx.us-west-2.rds.amazonaws.com" + "/"
                    + "xxx", "xxx", "xxx");

            preparedStatement = connect
                    .prepareStatement("insert into  testdatabase.test values (default, ?)");

            while (it.hasNext()) {
                String outputElement = it.next();
                preparedStatement.setString(1, "" + outputElement.length());
                preparedStatement.executeUpdate();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                connect.close();
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在主方法類中,我正在調用:

output.foreachPartition(new DatabaseSaveFunction());

我收到以下錯誤:

15/05/06 15:34:00 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 1.0 (TID 4, ip-172-31-36-44.us-west-2.compute.internal): java.lang.ClassNotFoundException: DatabaseSaveFunction
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)

工人日志:

15/05/06 15:34:00 ERROR executor.Executor: Exception in task 1.0 in stage 1.0 (TID 5)
java.lang.ClassNotFoundException: DatabaseSaveFunction
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:274)

有人可以告訴我我在做什么錯嗎? 我對此非常感謝。

將外部類導出到jar中,然后添加類似sc.addJar(“ / path / x.jar”),其中sc是您的main中的JavaSparkContext。 然后,您將不會收到此錯誤。 該錯誤是因為您的spark程序無法找到該類。 此外,在spark 1.3及更高版本中,您可以簡單地使用jdbc的映射選項,然后使用load(“ jdbc”,options)創建數據幀並從任何RDBMS加載數據。 它真的很方便。 我不確定此方法是否可以將任何RDBMS連接到spark。 如果您還有其他問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM