Jadi saya telah menggunakan sbt dengan assembly untuk mengemas semua dependensi saya ke dalam satu jar untuk pekerjaan percikan saya. Saya punya beberapa pekerjaan di mana saya menggunakan c3p0
untuk menyiapkan informasi kumpulan koneksi, menyiarkannya, dan kemudian menggunakan foreachPartition
pada RDD untuk kemudian mengambil koneksi, dan memasukkan data ke dalam database. Dalam skrip build sbt saya, saya menyertakan
"mysql" % "mysql-connector-java" % "5.1.33"
Ini memastikan konektor JDBC dikemas dengan pekerjaan. Semuanya bekerja dengan baik.
Jadi baru-baru ini saya mulai bermain-main dengan SparkSQL dan menyadari bahwa jauh lebih mudah untuk hanya mengambil dataframe dan menyimpannya ke sumber jdbc dengan fitur-fitur baru di 1.3.0
Saya mendapatkan pengecualian berikut:
java.sql.SQLException: Tidak ditemukan driver yang sesuai untuk jdbc:mysql://some.domain.com/myschema?user=user&password=password at java.sql.DriverManager.getConnection(DriverManager.java:596) at java.sql.DriverManager.getConnection(DriverManager.java:233)
Ketika saya menjalankan ini secara lokal, saya mengatasinya dengan mengatur
SPARK_CLASSPATH=/path/where/mysql-connector-is.jar
Pada akhirnya apa yang ingin saya ketahui adalah, mengapa pekerjaan tidak mampu menemukan driver ketika seharusnya dipaketkan dengannya? Pekerjaan saya yang lain tidak pernah mengalami masalah ini. Dari apa yang saya tahu, baik c3p0
dan kode dataframe keduanya menggunakan java.sql.DriverManager
(yang menangani impor semuanya untuk Anda dari apa yang saya tahu) jadi seharusnya bekerja dengan baik? Jika ada sesuatu yang menghalangi metode assembly bekerja, apa yang perlu saya lakukan untuk membuat ini bekerja?
Orang ini mengalami masalah serupa: http://apache-spark-user-list.1001560.n3.nabble.com/How-to-use-DataFrame-with-MySQL-td22178.html
Apakah Anda sudah memperbarui driver konektor Anda ke versi terbaru? Juga, apakah Anda menentukan kelas driver ketika Anda memanggil load()?
Map<String, String> options = new HashMap<String, String>();
options.put("url", "jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
options.put("dbtable", "video");
options.put("driver", "com.mysql.cj.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options);
Di spark/conf/spark-defaults.conf, Anda juga dapat mengatur spark.driver.extraClassPath dan spark.executor.extraClassPath ke path dari driver MySql .jar Anda.
Ada trik Java sederhana untuk menyelesaikan masalah Anda. Anda harus menentukan instance Class.forName()
. Sebagai contoh:
val customers: RDD[(Int, String)] = new JdbcRDD(sc, () => {
Class.forName("com.mysql.jdbc.Driver")
DriverManager.getConnection(jdbcUrl)
},
"SELECT id, name from customer WHERE ? < id and id <= ?" ,
0, range, partitions, r => (r.getInt(1), r.getString(2)))
Periksa docs