在将jar添加到新的sparkContexts之后,EMR Spark Submit提交应用程序(客户端模式)未获取UDF

时间:2019-03-08 23:48:25

标签: apache-spark jar user-defined-functions amazon-emr

我的spark执行失败,并显示AnalysisException: Undefined function: 'to_char'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 2 pos 18,因为它无法识别我的jar中的UDF,而jar是在调用spark commit和启动JVM之后添加的。

我的工作流程如下:

  • 使用运行脚本的步骤启动EMR集群,该脚本在CLIENT模式下在包含我的应用程序的程序集jar上调用spark提交(此时没有jar,因为jar稍后将作为我的应用程序的参数)
  • 应用程序现在已启动并正在运行,因此我使用一些包含要从S3中使用的JAR的参数来卷曲端点。
  • 在应用程序中,使用新的spark配置创建了一个新的spark上下文,该配置添加了sparkConfiguration.set("spark.jars", "s3://somejar")之类的jar(EMR步骤日志显示该jar已成功添加)
  • 所有UDF都在新创建的Spark会话中注册,该会话包含刚才提到的spark上下文
  • 在此火花上下文上执行工作,该火花上下文尝试在s3://somejar中使用UDF并失败,并表示找不到UDF

我阅读了Spark 2.2文档(https://spark.apache.org/docs/2.2.1/configuration.html#runtime-environment),它说spark配置spark.jars应该将列出的jar添加到驱动程序和所有worker节点,但似乎jar不是在节点的类路径中,即使spark上下文中的参数是新鲜的。让我兴奋的部分是,其他配置(例如spark.driver.extraClassPath)的描述中有一条注释,说您不能在JVM启动后将其添加到spark上下文中,但是该注释不存在spark.jars,让我觉得这样做是可以的。

我认为,如果我使用jars作为参数重新提交spark-submit,则UDF将在节点上被识别,因为所有内容都将在JVM启动时放在类路径中,但是我不想去做。是否可以将jars添加到已经在客户端模式下提交了火花的应用程序中?

0 个答案:

没有答案