La programación Spark MySQL no puede obtener datos
Un punto a tener en cuenta aquí: el método mencionado en este artículo para resolver el problema de que Spark insertIntoJDBC no puede encontrar el controlador Mysql es para el modo independiente (es decir, el modo local). En un entorno de clúster, el siguiente método no funcionará. Esto se debe a que hay un error al cargar el paquete del controlador mysql en un entorno distribuido. Los archivos jar distribuidos por --jars en las versiones 1.3 y anteriores se cargan en el lado del ejecutor a través del cargador de clases especializado de Spark. El administrador de controladores JDBC utiliza el cargador de clases predeterminado del sistema, por lo que no se puede reconocer. Un método posible es preinstalar el controlador JDBC en todos los nodos ejecutores y colocarlo en la ruta de clases predeterminada.
Sin embargo, Spark 1.4 debería haber solucionado este problema, es decir, los archivos jar distribuidos por --jars también se incluirán en la categoría del cargador de clases de YARN.
Hoy usé DataFrame en Spark para insertar RDD en Mysql, pero se siguió informando la siguiente información de excepción:
01
[itelbog@iteblog~] $ ? bin/spark-submit --master local[2]
02
--jars lib/mysql-connector-java-5.1.35.jar
03
--class? spark.sparkToJDBC ./spark-test_2.10-1.0.jar
04
05
El ensamblaje Spark se ha creado con Hive, incluidos los archivos jar de Datanucleus en classpath
06
Excepción en el hilo "principal" java.sql.SQLException: no se encontró ningún controlador adecuado para
07
jdbc:mysql://www.iteblog.com:3306/spark?user=rootamp;password=123amp;useUnicode=
08
trueamp; caracterEncoding=utf8amp; autoReconnect=true
09
en java.sql.DriverManager.getConnection(DriverManager.java: 602)
10 p>
en java.sql.DriverManager.getConnection(DriverManager.java:207)
11
en org.apache.spark.sql.DataFrame.createJDBCTable(DataFrame . scala: 1189)
12
en spark.SparkToJDBC$.toMysqlFromJavaBean(SparkToJDBC.scala: 20)
13
en spark .SparkToJDBC$.main(SparkToJDBC.scala: 47)
14
en spark.SparkToJDBC.main(SparkToJDBC.scala)
15
en sun.reflect.NativeMethodAccessorImpl.invoke0(Método nativo)
16
en sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
17
en sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
18
en ja
va.lang.reflect.Method.invoke(Method.java:597)
19
en org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy $SparkSubmit$
20
$runMain(SparkSubmit.scala:569)
21
en org.apache.spark.deploy .SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
22
en org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189) p> p>
23
en org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
24
en org .apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Se siente muy extraño. Agregué el controlador Mysql al iniciar el trabajo. ¿Cómo pudo ocurrir esta excepción? Agregar Mysql al parámetro --jars es inútil. Después de buscar, descubrí que el trabajo enviado puede configurar la ruta de clases del controlador agregando el parámetro --driver-class-path. Después de intentarlo, ¡no se produjeron errores!
1
[itelbog@iteblog ~]$? bin/spark-submit --master local[2]
2
--driver-class-path lib/mysql-connector-java-5.1.35.jar
3
--class spark.SparkToJDBC ./spark-test_2.10- 1.0.jar
De hecho, también podemos configurar la variable de entorno del controlador configurando SPARK_CLASSPATH en conf/spark-env.sh del paquete de instalación de Spark, de la siguiente manera:
(Nota Aquí lo interesante es que en la versión Spark 1.3, al configurar Spark de la siguiente manera, al ejecutar el programa, se le indicará que este método de configuración está obsoleto en las versiones posteriores a Spark 1.0. Se recomienda utilizar los otros dos métodos. ; uno de ellos es el mencionado anteriormente. La otra forma es configurar spark.executor.extraClassPath en el archivo de configuración. El formato de configuración específico se agregará después de la prueba)
1
<. p>exportar SPARK_CLASSPATH=$SPARK_CLASSPATH:/ iteblog/com/mysql-connector-java-5.1.35.jarEsto también puede resolver la excepción anterior.
Sin embargo, no podemos configurar SPARK_CLASSPATH y enviar el trabajo con el parámetro --driver-class-path en conf/spark-env.sh al mismo tiempo; de lo contrario, se producirá la siguiente excepción:
Ver código fuente imprimir ayuda
p>01
[itelbog@iteblog~]$? bin/spark-submit --master local[2]
02
-- driver-class-path lib/mysql-connector-java-5.1.35.jar
03
--class spark.SparkToJDBC ./spark- test_2.10-1.0.jar
04
05
El ensamblaje Spark se ha creado con Hive, incluidos los jar de Datanucleus en classpath
06
Excepción en el hilo "main"org.apache.spark.SparkException:
07
Se encontraron tanto spark.driver.extraClassPath como SPARK_CLASSPATH. anterior.
08
en org.apache.spark.SparkConf$$anonfun$validateSettings$6$$anonfun$apply
09
$7.apply(SparkConf .scala: 339)
10
en org.apache.spark.SparkConf$$anonfun$validateSettings$6$$anonfun$apply
11
$7.apply(SparkConf.scala:337)
12
en scala.collection.immutable.List.foreach(List.scala: 318)
13
en org.apache.spark.SparkConf$$anonfun$validateSettings$6.apply(SparkConf.scala: 337)
14 p>
en org.apache.spark.SparkConf$$anonfun$validateSettings$6.apply(SparkConf.scala:325)
15
en scala.Option.foreach( Option.scala:236)
16
en org.apache.spark.SparkConf.validateSettings(SparkConf.scala:325)
17
en org.apache.spark.SparkContext.lt;initgt;(SparkContext.scala:197)
18
en spark.SparkToJDBC$.main(SparkToJDBC.scala:41)
19
en spark.SparkToJDBC.main(SparkToJDBC.scala)
20 p> p>
en sun.reflect.NativeMethodAccessorImpl.invoke0(Método nativo)
21
en sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
22
en sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
23
en java.lang.reflect .Method .invoke(Method.java:597)
24
en org.apache.spark.deploy.SparkSubmit$.org$apache$spark$
25
implementar$SparkSubmit$$runMain(SparkSubmit.scala:569)
26
en org.apache.spark.deploy.SparkSubmit$.doRunMain $1( SparkSubmit.scala:166)
27
en org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
28
en org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
29
en org.apache.spark. implementar.SparkSubmit.main(SparkSubmit.scala)