Mis trabajos de Amazon EMR no se pueden conectar al catálogo de datos de AWS Glue.
Descripción corta
Amazon EMR usa el catálogo de datos como un almacén de metadatos persistente cuando usa Apache Spark, Apache Hive o Presto/Trino. Puede compartir el catálogo de datos entre diferentes clústeres, servicios, aplicaciones o cuentas de AWS.
Sin embargo, la conexión al catálogo de datos puede fallar por los siguientes motivos:
- Permisos insuficientes para el catálogo de datos de Glue.
- Permisos insuficientes para los objetos de Amazon Simple Storage Service (Amazon S3) especificados como ubicación de la tabla.
- Permisos insuficientes para el servicio AWS Key Management Service (AWS KMS) para objetos cifrados.
- Permisos insuficientes en AWS Lake Formation.
- Falta la configuración de los parámetros del clúster de EMR o es incorrecta.
- Formato de consulta incorrecto.
Resolución
El perfil de instancia de EC2 no tiene permisos suficientes para el catálogo de datos o el bucket de S3
Para acceder al catálogo de datos desde la misma cuenta o desde varias cuentas, las siguientes personas deben tener permisos para las acciones de AWS Glue y para el bucket de S3:
- El perfil de instancia de Amazon Elastic Compute Cloud (Amazon EC2).
- El rol de AWS Identity and Access Management (IAM) llamando al catálogo de datos.
Si faltan los permisos, aparece un error similar al siguiente:
Unable to verify existence of default database: com.amazonaws.services.glue.model.AccessDeniedException:
User: arn:aws:sts::Acct-id:assumed-role/Role/instance-id is not authorized to perform: glue:GetDatabase on resource: arn:aws:glue:region:Acct-id:catalog because no identity-based policy allows the glue:GetDatabase action
(Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null
Para solucionar problemas al acceder al catálogo de datos desde la misma cuenta, compruebe los permisos del perfil de instancia o del usuario de IAM.
Para solucionar problemas al acceder a las cuentas cruzadas del catálogo de datos, compruebe todos los permisos de la cuenta de llamada y la configuración. A continuación, compruebe que se proporciona acceso a S3 entre cuentas.
El perfil de instancia de EC2 no tiene los permisos de AWS KMS necesarios
Si el catálogo de datos se cifra con una clave administrada por el cliente, el perfil de instancia de EC2 debe tener los permisos necesarios para acceder a la clave. Si faltan los permisos, es posible que aparezca un error similar al siguiente. El error aparece en la consola de EMR si utiliza la CLI de spark-shell, la CLI de Hive o la CLI de Presto/Trino. El error aparece en los registros del contenedor si envía el código mediante programación.
Caused by: MetaException(message:User: arn:aws:sts::acct-id:assumed-role/Role/instance-id is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:region:acct-id:key/fe90458f-beba-460e-8cae-25782ea9f8b3 because no identity-based policy allows the kms:GenerateDataKey action (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null)
(Service: AWSGlue; Status Code: 400; Error Code: GlueEncryptionException; Request ID: request-id; Proxy: null))
Para evitar el error anterior, añada los permisos de AWS KMS necesarios para permitir el acceso a la clave.
Si la cuenta de AWS que llama al servicio no es la misma cuenta en la que está presente el catálogo de datos, haga lo siguiente:
- Active el uso compartido de claves si la cuenta de AWS que realiza la llamada se encuentra en la misma región que el catálogo de datos.
- Para el acceso multirregional, cree una clave multirregional para compartirla con otras cuentas.
El perfil de instancia no tiene acceso a AWS Lake Formation o las tablas de Glue no tienen las concesiones requeridas
Cuando los permisos del catálogo de datos se administran o registran en AWS Lake Formation, el rol debe tener permisos de Lake Formation en el objeto. Si faltan los permisos de Lake Formation en el rol, es posible que aparezca el siguiente error:
pyspark.sql.utils.AnalysisException: Unable to verify existence of default database: com.amazonaws.services glue.model.AccessDeniedException:
Insufficient Lake Formation permission(s) on default (Service: AWSGlue; Status Code: 400; Error Code: AccessDeniedException; Request ID: request-id; Proxy: null)
Para resolver el error anterior, añada las concesiones necesarias al rol de perfil de instancia de EC2. Además, conceda concesiones a las tablas de Glue o a la base de datos junto con los permisos de las tablas.
El clúster de EMR no tiene las configuraciones correctas o la cadena de consulta es incorrecta
Si los permisos son correctos, pero la configuración es incorrecta, aparece el siguiente error en spark-shell al intentar acceder a Glue entre cuentas:
An error occurred (EntityNotFoundException) when calling the GetTables operation: Database db-name not found.
Alternativa:
org.apache.spark.sql.AnalysisException: Table or view not found: acct-id/db.table-name line 2 pos 14
Para resolver este error, añada todos los parámetros necesarios para las configuraciones respectivas.