AWS Glue 4.0作业加载Trino Spark连接器失败求助
AWS Glue 4.0 集成Trino Spark连接器时出现CatalogNotFoundException问题
在AWS Glue 4.0作业中尝试使用Trino Spark连接器,遇到加载失败问题,报错找不到Catalog插件类。
Glue作业提交脚本相关代码
trino_drivers_list = list_s3_files(s3_bucket, "bd_cap/trino-drivers/", s3_client) trino_drivers = ",".join(trino_drivers_list) spark_configurations = [ f"spark.sql.extensions=io.trino.spark.TrinoSQLExtension", f"spark.sql.catalog.trino=io.trino.spark.TrinoCatalog", f'spark.sql.defaultCatalog=mytrinocatalog', f"spark.sql.catalog.mytrinocatalog.type=hive", f"spark.logConf=true", f"spark.driver.log.level=DEBUG", f"spark.executor.log.level=DEBUG", f"spark.driver.logClassPath=true", f"spark.executor.logClassPath=true" ] spark_string = ' --conf '.join(spark_configurations) job_args = { 'Description': description, 'Role': 'AWSGlueServiceRole', 'ExecutionProperty': { "MaxConcurrentRuns": 3 }, 'Command': { "Name": "glueetl", "ScriptLocation": script_path, "PythonVersion": "3" }, 'GlueVersion': '4.0', 'WorkerType': 'Standard', 'NumberOfWorkers': 1, 'DefaultArguments': { "--extra-py-files": ",".join(extra_py_files), "--additional-python-modules": python_modules, "--jars": trino_drivers, "--conf": spark_string } }
期望Glue运行的脚本相关代码
trino_drivers = [ "s3://my_s3bucket/bd_cap/trino-drivers/guava-30.1-jre.jar", "s3://my_s3bucket/bd_cap/trino-drivers/jackson-annotations-2.12.3.jar", "s3://my_s3bucket/bd_cap/trino-drivers/jackson-core-2.12.3.jar", "s3://my_s3bucket/bd_cap/trino-drivers/jackson-databind-2.12.3.jar", "s3://my_s3bucket/bd_cap/trino-drivers/log-0.197.jar", "s3://my_s3bucket/bd_cap/trino-drivers/slf4j-api-1.7.30.jar", "s3://my_s3bucket/bd_cap/trino-drivers/slf4j-nop-1.7.30.jar", "s3://my_s3bucket/bd_cap/trino-drivers/trino-jdbc-469.jar" ] spark = SparkSession.builder \ .appName("Trino Writer") \ .config("spark.sql.catalog.trino", "org.apache.spark.sql.trino.TrinoCatalog") \ .config("spark.sql.catalog.trino.uri", trino_url) \ .config("spark.sql.catalog.trino.user", trino_user) \ .config("spark.sql.catalog.trino.password", trino_password) \ .config("spark.jars", ",".join(trino_drivers)) \ .getOrCreate()
错误信息
py4j.protocol.Py4JJavaError: An error occurred while calling o1904.cache. : org.apache.spark.sql.connector.catalog.CatalogNotFoundException: Catalog 'mytrinocatalog' plugin class not found: spark.sql.catalog.mytrinocatalog is not defined at org.apache.spark.sql.errors.QueryExecutionErrors$.catalogPluginClassNotFoundError(QueryExecutionErrors.scala:1608)
已尝试的排查步骤
- 将所需Trino jar包上传至S3存储桶,包括
trino-jdbc-469.jar等文件; - 使用
mvn dependency:tree检查依赖冲突,未发现问题; - 配置Glue作业通过spark.jars属性加载S3中的jar包;
- 尝试使用--extra-jars选项和spark.jars.packages属性加载连接器;
- 通过
spark.sparkContext._jvm.ClassLoader.getSystemResources("")验证jar包已加载; - 尝试设置
spark.driver.extraClassPath和spark.executor.extraClassPath属性; - 尝试设置
spark.executor.extraJavaOptions和spark.driver.extraJavaOptions属性; - 在主脚本中直接设置
CLASSPATH环境变量。
解决方案
统一Catalog配置,消除冲突
提交脚本中同时配置了trino和mytrinocatalog两个Catalog,且默认Catalog设为mytrinocatalog但未定义其实现类,这是核心问题。修改提交脚本的spark_configurations:spark_configurations = [ f"spark.sql.extensions=io.trino.spark.TrinoSQLExtension", # 只配置一个Trino Catalog,命名为trino f"spark.sql.catalog.trino=io.trino.spark.TrinoCatalog", f"spark.sql.catalog.trino.uri={trino_url}", f"spark.sql.catalog.trino.user={trino_user}", f"spark.sql.catalog.trino.password={trino_password}", # 若需要默认使用Trino Catalog,设置defaultCatalog为trino f'spark.sql.defaultCatalog=trino', f"spark.logConf=true", f"spark.driver.log.level=DEBUG", f"spark.executor.log.level=DEBUG", f"spark.driver.logClassPath=true", f"spark.executor.logClassPath=true" ]同时移除期望脚本中重复的
SparkSession.builder代码——Glue作业的SparkSession由Glue初始化,自定义build会覆盖作业级配置,导致参数失效。替换为正确的Trino Spark连接器Jar包
当前使用的trino-jdbc-469.jar是JDBC驱动,而非Trino Spark连接器的Jar包。需要下载trino-spark-connector对应的Jar包(版本需匹配Trino集群和Glue 4.0对应的Spark 3.3版本),上传到S3后替换现有JDBC Jar。规范Jar包加载方式
在Glue作业的DefaultArguments中仅保留--jars参数指向正确的Trino Spark连接器及其依赖Jar,不要在脚本中设置spark.jars,避免重复加载引发冲突。验证类加载状态
在作业脚本中添加以下代码,确认Trino Catalog类是否成功加载:try: spark.sparkContext._jvm.io.trino.spark.TrinoCatalog print("TrinoCatalog class loaded successfully") except Exception as e: print(f"Failed to load TrinoCatalog: {str(e)}")
内容的提问来源于stack exchange,提问作者user100855
相关产品推荐
相关产品推荐

