code:
[info] Here are other dependency conflicts that were resolved: [info] * javax.activation:activation:1.1.1 is selected over 1.1 [info] +- org.apache.commons:commons-email:1.4 (depends on 1.1.1) [info] +- com.sun.mail:javax.mail:1.5.2 (depends on 1.1) [success] Total time: 4 s, completed Jun 18, 2020 1:10:36 AM
J'obtiens l'erreur suivante:
libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.3.0", "org.apache.spark" %% "spark-sql" % "2.3.0", "com.typesafe" % "config" % "1.2.0", "mysql" % "mysql-connector-java" % "5.1.12", "org.apache.commons" % "commons-dbcp2" % "2.0.1", "org.apache.commons" % "commons-email" % "1.5", ) dependencyOverrides ++= Seq( "javax.activation" % "activation" % "1.1.1", "javax.mail" % "javax.mail-api" % "1.6.2" ) assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.last }
J'ai essayé de vérifier en utilisant telnet si le serveur smtp que j'ai j'utilise est actif. Je l'ai trouvé actif:
spark-submit --master yarn-cluster --class ImpressionThrottlingPattern --name Test_MukundDBRead /home/ml.user/mukund/prod/ImpressionThrottlingPatternGenerator/target/scala-2.11/TestMukund-assembly-1.0.jar
Voici mon fichier sbt:
name := "TestMukund" version := "1.0" scalaVersion := "2.11.8" val sparkVersion = "2.3.0" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % "2.3.0", "org.apache.spark" %% "spark-sql" % "2.3.0", "com.databricks" %% "spark-csv" % "1.5.0", "com.typesafe" % "config" % "1.2.0", "mysql" % "mysql-connector-java" % "5.1.12", "org.apache.commons" % "commons-dbcp2" % "2.0.1", "org.apache.commons" % "commons-email" % "1.4" ) assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
Je ne pense pas que le problème est avec le nom d'utilisateur et le mot de passe car l'erreur indique que le fournisseur smtp est lui-même introuvable. Je suis très nouveau dans le domaine de la scala et du débordement de pile. J'espère que les détails ci-dessus sont suffisants pour trouver la cause profonde du problème.
MODIFIER L'application est exécutée via la commande:
[root@qa-mukund mukund.sudharsan]# telnet smtp.office365.com 587 Trying xx.xx.xx.xxx... Connected to smtp.office365.com. Escape character is '^]'. 220 BY5PR04CA0025.outlook.office365.com Microsoft ESMTP MAIL Service ready at Wed, 17 Jun 2020 13:48:54 +0000
J'ai essayé de remplacer la version 1.6.2 de javax.mail-api verision en mettant à jour le fichier sbt comme suit: p >
0/06/17 05:22:32 ERROR ApplicationMaster: User class threw exception: org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.office365.com:587 org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.office365.com:587 at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1421) at org.apache.commons.mail.Email.send(Email.java:1448) at mail$send$.a(mail.scala:56) at ImpressionThrottlingPattern$.main(pattern.scala:292) at ImpressionThrottlingPattern.main(pattern.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$4.run(ApplicationMaster.scala:721) Caused by: javax.mail.NoSuchProviderException: No provider for smtp at javax.mail.Session.getProvider(Session.java:479) at javax.mail.Session.getTransport(Session.java:681) at javax.mail.Session.getTransport(Session.java:662) at javax.mail.Session.getTransport(Session.java:719) at javax.mail.Transport.send0(Transport.java:248) at javax.mail.Transport.send(Transport.java:124) at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411) ... 9 more
Mais cela n'a pas fonctionné aussi bien.
J'ai essayé d'exécuter la commande sbt expulsée et j'ai trouvé la sortie contenant les lignes suivantes (je ne sais pas si cela aiderait) :
object mail { // implicit def stringToSeq(single: String): Seq[String] = Seq(single) implicit def liftToOption[T](t: T): Option[T] = Some(t) sealed abstract class MailType case object Plain extends MailType case object Rich extends MailType case object MultiPart extends MailType case class Mail( from: (String, String), // (email -> name) to: Seq[String], cc: Seq[String] = Seq.empty, bcc: Seq[String] = Seq.empty, subject: String, message: String, richMessage: Option[String] = None, attachment: Option[(java.io.File)] = None ) object send { def a(mail: Mail) { import org.apache.commons.mail._ val format = if (mail.attachment.isDefined) MultiPart else if (mail.richMessage.isDefined) Rich else Plain val commonsMail: Email = format match { case Plain => new SimpleEmail().setMsg(mail.message) case Rich => new HtmlEmail().setHtmlMsg(mail.richMessage.get).setTextMsg(mail.message) case MultiPart => { val attachment = new EmailAttachment() attachment.setPath(mail.attachment.get.getAbsolutePath) attachment.setDisposition(EmailAttachment.ATTACHMENT) attachment.setName(mail.attachment.get.getName) new MultiPartEmail().attach(attachment).setMsg(mail.message) } } // TODO Set authentication from your configuration, sys properties or w/e commonsMail.setHostName("smtp.office365.com") commonsMail.setSmtpPort(587) commonsMail.setAuthentication("someUserName", "TestPassword") commonsMail.setStartTLSEnabled(true) // Can't add these via fluent API because it produces exceptions mail.to foreach (commonsMail.addTo(_)) mail.cc foreach (commonsMail.addCc(_)) mail.bcc foreach (commonsMail.addBcc(_)) commonsMail. setFrom(mail.from._1, mail.from._2). setSubject(mail.subject). send() } } }
3 Réponses :
L'erreur est due au fait que le code ne parvient pas à trouver / charger une implémentation de classe Java pour communiquer avec le serveur smtp
. nosuchproviderexception < / a>
Il doit y avoir une version multiple ou ancienne de javamail
ou activation
jar dans votre chemin de classe d'exécution. Assurez-vous de vous en débarrasser et de disposer de la dernière version
Pour vérifier l'arborescence de dépendances pour sbt,
sbt "inspecter l'arbre propre"
Merci pour votre suggestion. J'ai inclus les dernières versions du java mail et du jar d'activation dans mon fichier sbt: "javax.mail"% "javax.mail-api"% "1.6.2", "javax.activation"% "activation"% "1.1. 1 "Mais toujours la même erreur. Pourriez-vous s'il vous plaît aider à comprendre comment résoudre plusieurs fichiers JAR dans un problème d'exécution?
pouvez-vous vérifier l'arbre de dépendance trivial ajouté la commande sbt pour vérifier sbt @MukundSudharsan
J'ai essayé le sbt inspect tree clean mais je n'ai trouvé aucune information sur l'activation ou le jar javamain. Cependant, j'ai essayé d'exécuter sbt expulsé où j'ai pu trouver la ligne suivante: `` `` [info] * javax.activation: activation: 1.1.1 est sélectionné sur {1.1, 1.1, 1.1, 1.1} [info] + - net.java.dev.jets3t: jets3t: 0.9.4 (dépend de 1.1.1) [info] + - javax.xml.bind: jaxb-api: 2.2.2 (dépend de 1.1) [info] + - com. sun.mail: javax.mail: 1.5.6 (dépend de 1.1) `` En utilisant dependencyOverrides, je n'ai pas pu remplacer la version 1.5.6
Essayez d'utiliser la bibliothèque ci-dessous dans votre build.sbt pour résoudre ce problème.
"org.apache.commons" % "commons-email" % "1.5"
Merci pour la suggestion, mais n'a pas fonctionné en changeant la version de 1.4 à 1.5
Après beaucoup d'efforts, j'ai enfin pu résoudre ce problème,
val SparkVersion = "2.3.2" scalaVersion := "2.11.8" libraryDependencies ++= Seq( "org.apache.spark" % "spark-core_2.11" % SparkVersion, "org.apache.spark" % "spark-sql_2.11" % SparkVersion, "com.typesafe" % "config" % "1.2.0", "mysql" % "mysql-connector-java" % "5.1.12", "org.apache.commons" % "commons-dbcp2" % "2.0.1", "org.apache.commons" % "commons-email" % "1.4", )
spark-submit --jars <path_to_activation_jar>,<path_to_mail_jar> <other parameters>
Cependant, je me demande toujours comment le mail et le jar d'activation peuvent être automatiquement téléchargés via l'assembly sbt et ne pas passer explicitement.
Bienvenue à SO! Pourriez-vous également publier la commande que vous utilisez pour exécuter votre application?
Voici la commande: spark-submit --master yarn-cluster --class ImpressionThrottlingPattern --name Test_MukundDBRead /home/ml.user/mukund/prod/ImpressionThrottlingPatternGenerat ou / target / scala-2.11 / TestMukund-assembly - 1.0.jar
J'utilise le même code son fonctionnement, pouvez-vous mettre à jour votre dernier fichier build.sbt ??
Salut Srinivas. Merci pour ça. J'ai joint mes informations de fichier sbt dans la section des questions. Pourriez-vous s'il vous plaît partager votre configuration