{"record":{"id":"61c7b3d379a4a534","repo":"apache/hadoop","slug":"signerinitializer-class-s-not-found-for-signer","errorCode":null,"errorMessage":"SignerInitializer class [%s] not found for signer [%s]","messagePattern":"SignerInitializer class \\[(.+?)\\] not found for signer \\[(.+?)\\]","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/SignerManager.java","lineNumber":95,"sourceCode":"            + \" for CustomSigner: [\" + customSigner + \"]\";\n        LOG.error(message);\n        throw new IllegalArgumentException(message);\n      }\n      if (parts.length == 1) {\n        // Nothing to do. Trying to use a pre-defined Signer\n      } else {\n        // Register any custom Signer\n        maybeRegisterSigner(parts[0], parts[1], ownerConf);\n\n        // If an initializer is specified, take care of instantiating it and\n        // setting it up\n        if (parts.length == 3) {\n          Class<? extends AwsSignerInitializer> clazz = null;\n          try {\n            clazz = (Class<? extends AwsSignerInitializer>) ownerConf\n                .getClassByName(parts[2]);\n          } catch (ClassNotFoundException e) {\n            throw new RuntimeException(String.format(\n                \"SignerInitializer class\" + \" [%s] not found for signer [%s]\",\n                parts[2], parts[0]), e);\n          }\n          LOG.debug(\"Creating signer initializer: [{}] for signer: [{}]\",\n              parts[2], parts[0]);\n          AwsSignerInitializer signerInitializer = ReflectionUtils\n              .newInstance(clazz, null);\n          initializers.add(signerInitializer);\n          signerInitializer\n              .registerStore(bucketName, ownerConf, delegationTokenProvider,\n                  ownerUgi);\n        }\n      }\n    }\n  }\n\n  /**\n   * Make sure the signer class is registered once with the AWS SDK.","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/auth/SignerManager.java#L77-L113","documentation":"When a custom signer entry has three parts, SignerManager loads the third part as an AwsSignerInitializer via ownerConf.getClassByName(parts[2]). If the class cannot be loaded, it wraps the ClassNotFoundException in a RuntimeException naming the missing initializer class and its signer. The initializer is responsible for setting up signer state (e.g. credential stores) before use.","triggerScenarios":"fs.s3a.custom.signers=Name:SignerClass:Initializer where the initializer FQCN is typo'd, the class was moved/renamed in a newer version, or its jar is absent from the classpath of the client initializing the S3A filesystem.","commonSituations":"Custom signer jar not shipped with the job (missing from Spark --jars/spark.jars, MR -libjars, or the cluster's lib directory); shading relocation changed the package name; version skew between the config template and the deployed jar.","solutions":["Correct the initializer FQCN in the third segment of the fs.s3a.custom.signers entry","Ship the jar containing the initializer to every client/executor that opens the s3a filesystem","Validate the name resolves in the same classloader context: run a tiny job on the cluster that calls Class.forName on the FQCN"],"exampleFix":"<!-- before: initializer package typo -->\n<property><name>fs.s3a.custom.signers</name>\n  <value>MySigner:com.example.MySigner:com.exmaple.MySignerInit</value></property>\n\n<!-- after -->\n<property><name>fs.s3a.custom.signers</name>\n  <value>MySigner:com.example.MySigner:com.example.MySignerInit</value></property>","handlingStrategy":"validation","validationCode":"for (String entry : conf.getTrimmedStrings(\"fs.s3a.custom.signers\")) {\n  String[] p = entry.split(\":\");\n  if (p.length == 3) {\n    conf.getClassByName(p[2]); // fails now with a clear CNFE naming the initializer\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  fs.initialize(uri, conf);\n} catch (RuntimeException e) {\n  if (e.getCause() instanceof ClassNotFoundException\n      && e.getMessage().contains(\"SignerInitializer class\")) {\n    // config/classpath defect: report and stop, no retry\n    throw new ConfigException(\"Missing signer initializer: \" + e.getCause().getMessage(), e);\n  }\n  throw e;\n}","preventionTips":["Ship custom signer jars with every client via spark.jars / -libjars","Fail fast: resolve all fs.s3a.custom.signers classes with Class.forName before starting work","Pin class names from one source of truth and lint them at deploy"],"tags":["aws","s3a","signer","classpath","class-not-found"],"backgroundTag":"class-not-found","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}