스파크 SQL에서는 JDBC 드라이버를 이용해서 데이터베이스에 접근할 때 다음과 같은 오류가 발생하는 경우가 있습니다.
에러 로그
19/11/12 03:07:36 INFO StateStoreCoordinatorRef: Registered StateStoreCoordinator endpoint
Exception in thread "main" java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$6.apply(JDBCOptions.scala:105)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$6.apply(JDBCOptions.scala:105)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:104)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.<init>(JDBCOptions.scala:35)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:32)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
원인
- JDBC 라이브러리가 정의되지 않았을 때
- JDBC URL이 제대로 전달되지 않았을 때
해결방법
JDBC URL이 제대로 전달되지 않았을 때
JDBC URL의 드라이버를 결정하는 스키마 정보가 제대로 전달되지 않았을 때 해당 오류가 발생합니다. jdbc:postgressql
, jdbc:mysql과
같이 정확한 스키마 정보가 전달되었는지 다시 확인합니다.
val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:postgresql:dbserver")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.load()
JDBC 라이브러리 정의 방법
라이브러리가 제대로 전달되지 않는 경우에 발생할 수도 있습니다. 이때는 driver-class-path
와 jars
에 드라이버 jar 파일을 전달하면 됩니다.
$ spark-submit --master yarn \
--driver-class-path mysql-connector-java-5.1.41.jar \
--jars mysql-connector-java-5.1.41.jar
참고
반응형