在AWS EMR中使用自定义Jar依赖时如何避免类找不到异常
解决方案
问题根源在于你使用--driver-class-path时直接替换了EMR容器的默认类路径,导致EMR内置的EmrFileSystem相关类无法被加载。正确的做法是通过追加而非替换的方式添加自定义Jar,同时保留EMR的默认配置。
修改步骤
- 移除
--driver-class-path参数,改用spark.driver.extraClassPath和spark.executor.extraClassPath配置项,这两个参数会将自定义Jar追加到默认类路径之后,不会覆盖原有配置。 - 保留
--jars参数指定自定义Jar,确保Spark能将Jar分发给Driver和Executor。
修改后的代码
boto3.client("emr-containers").start_job_run( name=job_name, virtualClusterId=self.virtual_cluster_id, releaseLabel="emr-6.11.0-latest", executionRoleArn=role, jobDriver={ "sparkSubmitJobDriver": { "entryPoint": entry_point, "entryPointArguments": entry_point_args, "sparkSubmitParameters": '--jars s3://my_bucket/mysql-connector-j-8.0.32.jar \ --conf spark.driver.extraClassPath=s3://my_bucket/mysql-connector-j-8.0.32.jar \ --conf spark.executor.extraClassPath=s3://my_bucket/mysql-connector-j-8.0.32.jar \ --conf spark.kubernetes.driver.podTemplateFile=my_file.yaml \ --conf spark.kubernetes.executor.podTemplateFile=my_file.yaml', } }, )
额外说明
- 如果自定义Jar仅需在Driver端使用,可只配置
spark.driver.extraClassPath;若Executor也需要(如读写MySQL数据场景),则必须同时配置spark.executor.extraClassPath。 --jars参数会将指定Jar上传至Spark分布式缓存,确保Driver和Executor都能访问,与extraClassPath配合可保证类路径加载正确。
内容的提问来源于stack exchange,提问作者Rinze
相关产品推荐
相关产品推荐

