2016-05-18 15 views
2

Ich versuche, über pyspark zu einer MySQL mit jdbc zu verbinden. Ich konnte es außerhalb von EMR machen. Aber wenn ich mit EMR versuche, startet pyspark nicht richtig.AWS EMR PySpark Verbindung mysql

Der Befehl, den ich in meiner Maschine

pyspark --conf spark.executor.extraClassPath=/home/hadoop/mysql-connector-java-5.1.38-bin.jar --driver-class-path /home/hadoop/mysql-connector-java-5.1.38-bin.jar --jars /home/hadoop/mysql-connector-java-5.1.38-bin.jar 

und die folgende Ausgabe:

16/05/18 14:29:21 INFO Client: Application report for application_1463578502297_0011 (state: FAILED) 
16/05/18 14:29:21 INFO Client: 
    client token: N/A 
    diagnostics: Application application_1463578502297_0011 failed 2 times due to AM Container for appattempt_1463578502297_0011_000002 exited with exitCode: 1 
For more detailed output, check application tracking page:http://ip-10-24-0-75.ec2.internal:8088/cluster/app/application_1463578502297_0011Then, click on links to logs of each attempt. 
Diagnostics: Exception from container-launch. 
Container id: container_1463578502297_0011_02_000001 
Exit code: 1 
Stack trace: ExitCodeException exitCode=1: 
    at org.apache.hadoop.util.Shell.runCommand(Shell.java:545) 
    at org.apache.hadoop.util.Shell.run(Shell.java:456) 
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722) 
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212) 
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) 
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 


Container exited with a non-zero exit code 1 
Failing this attempt. Failing the application. 
    ApplicationMaster host: N/A 
    ApplicationMaster RPC port: -1 
    queue: default 
    start time: 1463581754050 
    final status: FAILED 
    tracking URL: http://ip-10-24-0-75.ec2.internal:8088/cluster/app/application_1463578502297_0011 
    user: hadoop 
16/05/18 14:29:21 INFO Client: Deleting staging directory .sparkStaging/application_1463578502297_0011 
16/05/18 14:29:21 ERROR SparkContext: Error initializing SparkContext. 
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master. 
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:124) 
    at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:64) 
    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:144) 
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:530) 
    at org.apache.spark.api.java.JavaSparkContext.<init>(JavaSparkContext.scala:59) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:234) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381) 
    at py4j.Gateway.invoke(Gateway.java:214) 
    at py4j.commands.ConstructorCommand.invokeConstructor(ConstructorCommand.java:79) 
    at py4j.commands.ConstructorCommand.execute(ConstructorCommand.java:68) 
    at py4j.GatewayConnection.run(GatewayConnection.java:209) 
    at java.lang.Thread.run(Thread.java:745) 

Ich versuchte auch kein zusätzliches Glas verwenden, aber mit mariadb.jdbc verbinden mit denen ich gelesen habe Treiber ist der Standard:

from pyspark.sql import SQLContext 
sqlctx = SQLContext(sc) 
df = sqlctx.read.format("jdbc").option("url", "jdbc:mysql://ip:port/db").option("driver", "com.mariadb.jdbc.Driver").option("dbtable", "...").option("user", "....").option("password", "...").load() 

aber ich bekomme

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/spark/python/pyspark/sql/readwriter.py", line 139, in load 
    return self._df(self._jreader.load()) 
    File "/usr/lib/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py", line 813, in __call__ 
    File "/usr/lib/spark/python/pyspark/sql/utils.py", line 45, in deco 
    return f(*a, **kw) 
    File "/usr/lib/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py", line 308, in get_return_value 
py4j.protocol.Py4JJavaError: An error occurred while calling o81.load. 
: java.lang.ClassNotFoundException: com.mariadb.jdbc.Driver 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at org.apache.spark.sql.execution.datasources.jdbc.DriverRegistry$.register(DriverRegistry.scala:38) 
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:45) 
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:45) 
    at scala.Option.foreach(Option.scala:236) 
    at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.createConnectionFactory(JdbcUtils.scala:45) 
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:120) 
    at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:91) 
    at org.apache.spark.sql.execution.datasources.jdbc.DefaultSource.createRelation(DefaultSource.scala:57) 
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:158) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:119) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:381) 
    at py4j.Gateway.invoke(Gateway.java:259) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:209) 
    at java.lang.Thread.run(Thread.java:745) 

Wie soll es getan werden?

Danke, Pedro Rosanes.

+0

auf den sparkHistory UI Gehen Sie Job und Umgebungen Registerkarte überprüfen und sehen, ob alle erforderlichen Bibliotheken – vgunnu

+0

wie erwartet geladen werden Versuchen Sie nur allein die --jars Option angeben? –

+0

sieht es so aus, als ob Sie den mysql-Konnektor in classpath und den Treiber für MariaDB in den Verbindungseigenschaften haben. Haben Sie '.option (" driver "," com.mysql.jdbc.Driver ")' '? –

Antwort

3

Wenn Sie Spark-Job auf Amazon EMR 3.x oder EMR 4.x ausführen möchten, müssen Sie folgende Dinge tun:

1) Sie können die Funken defaults.conf Eigenschaften erwähnen, während Bootstrapping dh Sie die Konfiguration von Treiber Classpath ändern und Executor Classpath Eigenschaft und auch maximizeResourceAllocation (für weitere Informationen in den Kommentaren fragen, wenn Sie benötigen.) docs

2) Sie müssen alle zum Download der erforderlich Gläser dh (mysql-connector.jar und MariaDB-connector.jar) in Ihrem Fall MariaDB und MySQL JDBC-Anschluss Gläser an alle Classpath Standorten wie Spark, Garn und Hadoop auf allen Knoten entweder es ist MASTER, CORE oder TASK (Spark-On Yarn Szenario deckt die meisten) bootstrap scripts docs

3) und wenn Ihr Spark-Job wird nur von Treiber-Knoten zu Ihrer Datenbank in Verbindung steht, dann können Sie nur es brauchen verwenden --jars und werden Sie Ausnahme nicht geben und funktioniert gut.

4) auch empfehlen Sie Master als Garn-Cluster zu versuchen statt lokalen oder Garn-Client

In Ihrem Fall, wenn Sie MariaDB oder MySQL verwenden entweder kopieren Sie Ihre Gläser auf $ SPARK_HOME/lib, $ HADOOP_HOME/lib usw. auf jedem Knoten des Clusters und dann zu versuchen.

Später können Sie Bootstrap-Aktionen verwenden, um Ihre Gläser auf allen Knoten während der Zeit der Cluster-Erstellung zu kopieren.

Bitte kommentieren Sie unten für weitere Informationen.

+1

Verbindung über den Treiberknoten funktioniert nur mit --jars (wie in 3). Um über die anderen zu verbinden, muss ich herausfinden, wie ich ohne ssh sparks-default.conf bearbeiten kann (wie Sie in 2). –

Verwandte Themen