SparkR連結mysql資料庫(踩坑)

劉姥爺觀園子發表於2018-05-21

本文主要講述sparkR連結Mysql的過程和坑。

SparkR的開發可以用RStudio工具進行開發,連線spark可以通過RStudio介面中的Connections進行配置連線;具體方法這裡不做介紹。

下面為spark程式的部分程式碼:

if (nchar(Sys.getenv("SPARK_HOME")) < 1) {  
  Sys.setenv(SPARK_HOME = "/usr/local/spark/")  
}  
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))  
sc <- sparkR.init(master = "local[*]", sparkEnvir = list(spark.driver.memory="2g")) 
df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456")
newdata<-select(df,df$channel,df$stream_id,df$region,df$isp)
省略具體操作
write.jdbc(newdata, "jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8", "testmysql", mode="overwrite", user = "root", password = "123456"

在叢集和sparkR shell裡會有一個不知道是不是bug的坑。

復現:

1. 啟動sparkR;

2.進入sparkR中,載入mysql驅動:

sparkR.session(sparkPackages=”/usr/local/spark/jars/mysql-connector-java-8.0.11.jar”)

3. 連線資料庫,獲取資料:

df<-read.jdbc("jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8","channel",user="root",password="123456")

 在這一步的時候第一次執行是不會過去的,它會報一個異常:

18/05/21 15:44:56 ERROR RBackendHandler: jdbc on 5 failed

java.lang.reflect.InvocationTargetException……

Caused by: java.sql.SQLException: No suitable driver

at java.sql.DriverManager.getDriver(DriverManager.java:315)

at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)

at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions$$anonfun$7.apply(JDBCOptions.scala:84)

at scala.Option.getOrElse(Option.scala:121)…….

 

4. 再次執行第三步,並不會再次報錯,而是顯示成功;

 

在叢集中也一樣,即使新增了mysql驅動也會報出第三步的異常;叢集提交的命令為:(載入驅動的三個方式選一個就好,

但是提交.jar任務,選–driver-class-path引數)

./spark-submit –master spark://leeco:7077 –packages mysql:mysql-connector-java:8.0.11  –driver-class-path /usr/local/spark/jars/mysql-connector-java-8.0.11.jar –jars /usr/local/spark/jars/mysql-connector-java-8.0.11.jar /Users/leeco/work/R/analysis/analysisF.R

 

這裡的這個坑是在叢集中發現的,主要是sparkR第一次載入驅動的時候報異常,第二次正常執行,不知道是不是bug,

還是我的配置有問題,有大神知道可以告知,感激不盡。

解決辦法:

在R語言中捕獲異常,再次執行載入資料語句即可:

possibleError <- tryCatch(
df<-read.jdbc(“jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8″,”channel”,user=”root”,password=”123456″),
error=function(e) {0}
)
df<-read.jdbc(“jdbc:mysql://192.168.1.181:3306/dsj_test?user=root&password=123456&characterEncoding=utf8″,”channel”,user=”root”,password=”123456″)

再次提交叢集即可順利完成任務。

 

 

相關文章