Scala AWS EMR客户端出错:java.lang.NoSuchFieldError:签名\u区域
在部署的服务器上运行AWS EMR客户端时,我突然遇到了此错误。这不会在本地发生,并且运行良好。基本上,我有一个EMR客户端,用于构建和执行以下步骤:Scala AWS EMR客户端出错:java.lang.NoSuchFieldError:签名\u区域,scala,amazon-web-services,Scala,Amazon Web Services,在部署的服务器上运行AWS EMR客户端时,我突然遇到了此错误。这不会在本地发生,并且运行良好。基本上,我有一个EMR客户端,用于构建和执行以下步骤: class EMRClient(emrClusterId:String) extends LazyLogging{ val accessKey = ...// access key val secretKey = ...//secret key val credentials = new BasicAWSCredentials(ac
class EMRClient(emrClusterId:String) extends LazyLogging{
val accessKey = ...// access key
val secretKey = ...//secret key
val credentials = new BasicAWSCredentials(accessKey, secretKey)
val REGION = <my region>
println(">>>>>>>>>>>>>>>>>>>>Initializing EMR client for clusterId " + emrClusterId + " . The region is " + REGION)
val emr = AmazonElasticMapReduceClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(REGION)
.build()
def executeHQLStep(s3ScriptPath:String, stepName:String, args:String = ""): AddJobFlowStepsResult= {
val hqlScriptStep = buildHQLStep(hqlScriptPath, stepName, args)
val stepSet = new java.util.HashSet[StepConfig]()
//stepSet.add(enableDebugging)
stepSet.add(hqlScriptStep)
executeJobFlowSteps(stepSet)
}
/**
* Builds a StepConfig to be executed in a job flow for a given .hql file from S3
* @param hqlScriptPath the location in S3 of the script file containing the script to run
* @param args optional field for arguments for hive script.
* @param stepName An identifier to give to EMR to name your Step
* @return
*/
private def buildHQLStep(hqlScriptPath:String, stepName:String, args:String= ""): StepConfig = {
new StepConfig()
.withName(stepName)
.withActionOnFailure(ActionOnFailure.CANCEL_AND_WAIT)
.withHadoopJarStep(stepFactory.newRunHiveScriptStep(hqlScriptPath, args))
}
private def executeJobFlowSteps(steps: java.util.Set[StepConfig]): AddJobFlowStepsResult = {
emr.addJobFlowSteps(new AddJobFlowStepsRequest()
.withJobFlowId(emrClusterId)
.withSteps(steps)) // where the error is thrown
}
}
类EMRClient(emrclustrid:String)扩展了懒散日志记录{
val accessKey=…//访问密钥
val secretKey=…//密钥
val凭证=新的基本凭证(accessKey、secretKey)
val区域=
println(“>>>>>>>>>>>>>>>>>>>正在初始化群集ID“+emrClusterId+”的EMR客户端。区域为“+region”)
val emr=AmazonElasticMapReduceClientBuilder
.standard()
.具有凭证(新AWSStaticCredentialsProvider(凭证))
.withRegion(地区)
.build()
def executeHQLStep(s3ScriptPath:String,stepName:String,args:String=”“):AddJobFlowStepsResult={
val hqlScriptStep=buildHQLStep(hqlScriptPath,stepName,args)
val stepSet=new java.util.HashSet[StepConfig]()
//stepSet.add(启用调试)
stepSet.add(hqlScriptStep)
executeJobFlowSteps(步骤集)
}
/**
*为S3中给定的.hql文件构建要在作业流中执行的StepConfig
*@param hqlScriptPath包含要运行的脚本的脚本文件在S3中的位置
*@param args配置单元脚本参数的可选字段。
*@param stepName给EMR一个标识符来命名您的步骤
*@返回
*/
私有def buildHQLStep(hqlScriptPath:String,stepName:String,args:String=”“):StepConfig={
新的StepConfig()
.withName(步骤名称)
.withActionOnFailure(ActionOnFailure.取消并等待)
.withHadoopJarStep(stepFactory.newRunHiveScriptStep(hqlScriptPath,args))
}
私有def executeJobFlowSteps(步骤:java.util.Set[StepConfig]):AddJobFlowStepResult={
emr.addJobFlowSteps(新的addJobFlowStepRequest()
.withJobFlowId(emrClusterId)
.withSteps(steps))//引发错误的位置
}
}
但是,当在服务器上实例化此类时,顶部的println
语句都不可见,将调用myexecuteJobFlowSteps
方法并抛出此错误:
java.lang.NoSuchFieldError:签名\u区域
在com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient.executeadjobflowsteps(AmazonElasticMapReduceClient.java:439)上
位于com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClient.addJobFlowSteps(AmazonElasticMapReduceClient.java:421)
在emrservices.EMRClient.executeJobFlowSteps(EMRClient.scala:64)
位于emrservices.EMRClient.executeHQLStep(EMRClient.scala:44)
这个项目由几个项目组成,类似于我的问题说它与它们的AWS依赖关系有关,但是所有的项目在build.sbt的库依赖关系中都有这样的内容:“com.amazonaws”%“AWS java sdk”%“1.11.286”
你知道问题是什么吗?这看起来像是将aws java sdk的1.11.286版本与旧版本(1.11.149)的aws java sdk核心混合在一起。较新的客户端正在使用添加到核心模块的新字段,但由于您的核心模块已过期,您将看到“无此类字段”错误。您能确保所有依赖项彼此同步吗?这看起来像是将aws java sdk的1.11.286版本与旧版本(1.11.149)的aws java sdk核心混合在一起。较新的客户端正在使用添加到核心模块的新字段,但由于您的核心模块已过期,您将看到“无此类字段”错误。您能否确保所有依赖项都彼此同步?回答得很好!然而,你可能想考虑把最后一句话移到问题的评论上,并把其余的回答作为你的回答。在答案中寻找反馈并不是SO的真正意图。答案很棒!然而,你可能想考虑把最后一句话移到问题的评论上,并把其余的回答作为你的回答。在答案中寻找反馈并不是SO的真正意图。