gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:14:23 25 4
gpt4 key购买 nike

我想将每个分区的数据保存到MySQL数据库。为此,我创建了实现 VoidFunction<> 的类:

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。如果您还有其他问题,请告诉我。

关于java - Apache Spark MySQL JavaRDD.foreachPartition - 为什么我收到 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com