Kıvılcım JDBC Sürücüsü bulunamadı

Bu yüzden tüm bağımlılıklarımı kıvılcım işlerim için tek bir kavanoza paketlemek için sbt'yi montajla kullanıyorum. Bağlantı havuzu bilgilerini ayarlamak, yayınlamak için c3p0 kullandığım, ardından yayınladığım ve ardından bağlantı kurmak için RDD'deki foreachPartition kullandığım ve ardından bağlantı kurmak için birkaç işim var. veriyi veritabanına. Sbt build betiğimde ekledim

"mysql" % "mysql-connector-java" % "5.1.33"

Bu, JDBC konektörünün işle birlikte paketlenmesini sağlar. Her şey harika çalışıyor.

So recently I started playing around with SparkSQL and realized it's much easier to simply take a dataframe and save it to a jdbc source with the new features in 1.3.0

Aşağıdaki istisna alıyorum:

java.sql.SQLException: No suitable driver found for 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)

Bunu yerel olarak çalıştırırken, onu ayarlayarak çevrimi kapattım

SPARK_CLASSPATH=/path/where/mysql-connector-is.jar

Nihayetinde bilmek istediğim şey şudur: iş niçin iş paketlendiğinde sürücüyü bulamıyor? Diğer işlerimde bu sorun hiç olmadı. Hem c3p0 hem de dataframe kodunu söyleyebileceklerimden her ikisi de java.sql.DriverManager (kullanabileceğim şeyden sizin için her şeyi içe aktarmayı ele alır) kullanır. iyi çalışmalı mı ?? Montaj yönteminin çalışmasını önleyen bir şey varsa, bu işlemi yapmak için ne yapmam gerekir?

24
İşlerini nasıl başlatıyorsun? Monte edilmiş kavanozunuzun MySQL sürücüsünü içerdiğini kontrol ettiniz mi?
katma yazar Daniel Darabos, kaynak
Aynı sorunu yaşıyorum, aynı zamanda MySQL'e kaydetmeye çalışıyorum. Bunun altına hiç gittin mi?
katma yazar Marcin, kaynak
Kavanozu kontrol ettim, MySQL sürücüsünü içeriyor. İşimi bin/spark-gönder - class "com.mypackage.MyJob" --verbose spark: //place.where.this.exists.com: 7077 MyJob.jar kullanarak başlatıyorum
katma yazar Adam Ritter, kaynak

10 cevap

This person was having similar issue: http://apache-spark-user-list.1001560.n3.nabble.com/How-to-use-DataFrame-with-MySQL-td22178.html

Bağlayıcı sürücülerinizi en son sürüme güncellediniz mi? Ayrıca load() öğesini çağırdığınızda sürücü sınıfını belirlediniz mi?

Map options = new HashMap();
options.put("url", "jdbc:mysql://localhost:3306/video_rcmd?user=root&password=123456");
options.put("dbtable", "video");
options.put("driver", "com.mysql.jdbc.Driver"); //here
DataFrame jdbcDF = sqlContext.load("jdbc", options); 

Spark/conf/spark-defaults.conf içinde spark.driver.extraClassPath ve spark.executor.extraClassPath öğelerini MySql sürücünüzün yoluna da

27
katma
"// here" yazınız için teşekkürler Ton!
katma yazar beloblotskiy, kaynak
"// here" işaretçisi için çok teşekkürler
katma yazar Despicable me, kaynak

Hem kıvılcım sürücüsü hem de uygulayıcı, sınıf yolunda MySQL sürücüye ihtiyaç duymaktadır;

spark.driver.extraClassPath = /mysql-connector-java-5.1.36.jar
spark.executor.extraClassPath = /mysql-connector-java-5.1.36.jar
17
katma
Python kullanarak bu benim için sorunu çözdü
katma yazar Sean, kaynak

These options are clearly mentioned in spark docs: --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

Yaptığım hata, uygulamamın kavanozundan sonra bu seçeneklerden bahsediyordu.

Ancak, doğru yol bu seçenekleri kıvılcım göndermeden hemen sonra belirtmektir:

kıvılcım gönder - sürücü sınıfı-yolu /somepath/project/mysql-connector-java-5.1.30-bin.jar --jars /somepath/project/mysql-connector-java-5.1.30-bin .jar - sınıf com.package.MyClass hedef/scala-2.11/project_2.11-1.0.jar

7
katma
EMR'ye iş gönderirken bunu doğru olarak nasıl yapıyorsunuz?
katma yazar Evan Zamir, kaynak
Orada da tüm sürücü sınıfına sahip bir uber kavanozu yapıyorum. Sürücü kavanozu ile spark-send komutunu yine de manuel olarak vermek zorunda mıyım?
katma yazar Abhi, kaynak
Sen bir hayat kurtarıcısın. Teşekkürler
katma yazar biniam_Ethiopia, kaynak
Bir ana kavanoz sağladıysanız, içindeki tüm kavanozların sınıf yolunda olması gerektiğini varsayalım. Bu yaklaşımı denedin mi?
katma yazar Ayush Vatsyayan, kaynak
EMR üzerinde çalışmadım - kontrol etmeniz gerekiyor.
katma yazar Ayush Vatsyayan, kaynak

These options are clearly mentioned in spark docs: --driver-class-path postgresql-9.4.1207.jar --jars postgresql-9.4.1207.jar

Yaptığım hata, uygulamamın kavanozundan sonra bu seçeneklerden bahsediyordu.

Ancak, doğru yol bu seçenekleri kıvılcım göndermeden hemen sonra belirtmektir:

kıvılcım gönder - sürücü sınıfı-yolu /somepath/project/mysql-connector-java-5.1.30-bin.jar --jars /somepath/project/mysql-connector-java-5.1.30-bin .jar - sınıf com.package.MyClass hedef/scala-2.11/project_2.11-1.0.jar

7
katma
EMR'ye iş gönderirken bunu doğru olarak nasıl yapıyorsunuz?
katma yazar Evan Zamir, kaynak
Orada da tüm sürücü sınıfına sahip bir uber kavanozu yapıyorum. Sürücü kavanozu ile spark-send komutunu yine de manuel olarak vermek zorunda mıyım?
katma yazar Abhi, kaynak
Sen bir hayat kurtarıcısın. Teşekkürler
katma yazar biniam_Ethiopia, kaynak
Bir ana kavanoz sağladıysanız, içindeki tüm kavanozların sınıf yolunda olması gerektiğini varsayalım. Bu yaklaşımı denedin mi?
katma yazar Ayush Vatsyayan, kaynak
EMR üzerinde çalışmadım - kontrol etmeniz gerekiyor.
katma yazar Ayush Vatsyayan, kaynak

spark.driver.extraClassPath istemci modunda çalışmıyor:

Not: İstemci modunda, bu yapılandırma doğrudan uygulamanızdaki SparkConf aracılığıyla ayarlanmamalıdır, çünkü JVM sürücüsü bu noktada zaten başlamıştır. Bunun yerine, lütfen bunu --driver-class-path komut satırı seçeneğiyle veya varsayılan özellikler dosyanızda ayarlayın.

SPARK_CLASSPATH Env değişkeni, Spark 1.0+ sürümünde kullanımdan kaldırılmıştır.

Önce jdbc sürücü kavanozlarını, aynı yerel dosya sistemi yolu altındaki her bir uygulayıcıya kopyalamanız ve sonra kıvılcım gönderirken aşağıdaki seçenekleri kullanmanız gerekir:

--driver-class-path "driver_local_file_system_jdbc_driver1.jar:driver_local_file_system_jdbc_driver2.jar"
--class "spark.executor.extraClassPath=executors_local_file_system_jdbc_driver1.jar:executors_local_file_system_jdbc_driver2.jar"

Örneğin TeraData durumunda, hem terajdbc4.jar hem de tdgssconfig.jar'a ihtiyacınız vardır.

Alternatif olarak, tüm çalışan düğümlerde compute_classpath.sh dosyasını değiştirin, Spark belgeleri şöyle diyor:

JDBC sürücüsü sınıfı, istemci oturumundaki ve tüm uygulayıcılardaki ilkel sınıf yükleyici tarafından görülebilir olmalıdır. Bunun nedeni, Java’nın DriverManager sınıfının, bir bağlantı açmaya başladığında ilkel sınıf yükleyici tarafından görülmeyen tüm sürücüleri görmezden gelmesine neden olan bir güvenlik kontrolü yapmasıdır. Bunu yapmanın uygun bir yolu, tüm çalışan düğümlerinde compute_classpath.sh dosyasını, sürücünüzün JAR'larını içerecek şekilde değiştirmektir.

6
katma

Sorununuzu çözmek için basit bir Java numarası var. Class.forName() örneğini belirtmelisiniz. Örneğin:

 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)))

Check the docs

3
katma
Scala'da kullandım: yeni JdbcRDD (sc,() => {Class.forName (driverName) .newInstance; DriverManager.getConnection (url, kullanıcı, şifre)}, "SELECT * FROM stats_20151230", 0, 0, 1) Teşekkürler !
katma yazar beloblotskiy, kaynak

Spark 2.2.0 ile python betiğinde SparkSession oturumu için ekstra sınıf yolu bilgisi eklenerek sorun benim için düzeltildi:

    spark = SparkSession \
        .builder \
        .appName("Python Spark SQL basic example") \
        .config("spark.driver.extraClassPath", "/path/to/jdbc/driver/postgresql-42.1.4.jar") \
        .getOrCreate()

See official documentation https://spark.apache.org/docs/latest/configuration.html

In my case, spark is not launched from cli command, but from django framework https://www.djangoproject.com/

2
katma
Amazon EMR'ye iş gönderirken bu işe yarayacak mıydı?
katma yazar Evan Zamir, kaynak

Jar dosyasını spark-env.sh içindeki SPARK_CLASSPATH'e ekliyorum, işe yarıyor.

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/local/spark-1.6.3-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar
1
katma

Küme modunda Mesos kümesi üzerinde iş yaparken de aynı sorunu yaşadım.

JDBC sürücüsünü kullanmak için, sistem sınıf yoluna bağımlılığı çerçeve sınıf yoluna eklemek gerekmez. Bunu yalnızca, kümenin her bir örneğinde spark-defaults.conf dosyasına bağımlılık ekleyerek buldum.

Eklenecek özellikler spark.driver.extraClassPath ve spark.executor.extraClassPath 'dir ve yol yerel dosya sisteminde olmalıdır.

1
katma
Tüm çözümleri burada denedim, hiçbir şey işe yaramaz, "uygun sürücü yok" hatası alıyorum. fikir?
katma yazar thebeancounter, kaynak

Küme modunda Mesos kümesi üzerinde iş yaparken de aynı sorunu yaşadım.

JDBC sürücüsünü kullanmak için, sistem sınıf yoluna bağımlılığı çerçeve sınıf yoluna eklemek gerekmez. Bunu yalnızca, kümenin her bir örneğinde spark-defaults.conf dosyasına bağımlılık ekleyerek buldum.

Eklenecek özellikler spark.driver.extraClassPath ve spark.executor.extraClassPath 'dir ve yol yerel dosya sisteminde olmalıdır.

1
katma
Tüm çözümleri burada denedim, hiçbir şey işe yaramaz, "uygun sürücü yok" hatası alıyorum. fikir?
katma yazar thebeancounter, kaynak