Sửa lỗi An error occurred while calling o84.getCatalogSource
Nguyên nhân bạn gặp lỗi “An error occurred while calling o84.getCatalogSource. No classification or connection in <db_name>.<view_name>.” nhưng câu lệnh với bảng này lại được thực hiện bình thường trên Athena, kiểm tra thấy bảng bạn đang sử dụng có classification là Unknown thì rất có thể là do Presto views (view tạo bởi Athena) ngoài Athena sẽ không thể sử dụng. Glue Data Catalog chỉ lưu trữ định nghĩa metadata của view, nên không có thông tin classification. (Xem phần giải thích cuối bài viết để biết thêm thông tin chi tiết + docs dẫn chứng cho nhận định này).
Giải pháp cho lỗi này là bạn hãy sử dụng Athena JDBC driver như là custom JDBC driver trong Glue job để có thể query view mà bạn muốn sử dụng.
Để sử dụng Athena JDBC driver trong Glue job bạn làm như sau:
- Bước 1: Download Athena JDBC driver tại đây: https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-with-jdbc.html
- Bước 2: Upload Athena JDBC driver đã download ở bước 1 lên S3 bucket.
- Bước 3: Chỉ định Athena JDBC driver trong Glue job: Tại màn hình tạo job, Click chọn tab “Job details”, click chọn “Advanced properties”. Chỉ định S3 URI dẫn tới Athena JDBC driver tại mục “Dependent JARs path” (customjdbc.png)
- Bước 4: Sửa lại script Glue job của bạn để query một Athena view như source cho data frame, như sample dưới đây:
athena_view_dataframe = (
glueContext.read.format("jdbc")
.option("driver", "com.simba.athena.jdbc.Driver")
.option("AwsCredentialsProviderClass","com.simba.athena.amazonaws.auth.InstanceProfileCredentialsProvider")
.option("url", "jdbc:awsathena://athena.ap-northeast-1.amazonaws.com:443")
.option("dbtable", "AwsDataCatalog.<database>.<table>")
.option("S3OutputLocation","s3://<s3-output-bucket>/")
.load()
)
datasource0 = DynamicFrame.fromDF(athena_view_dataframe, glueContext, "athena_view_source")
Tôi đã thực hiện kiểm chứng, và kết quả là:
- Khi chưa sử dụng Athena JDBC driver: Glue job bị lỗi “getCatalogSource. No classification or connection” giống như lỗi bạn gặp.
- Khi đã sử dụng Athena JDBC driver: Job thực hiện thành công.
Giải thích:
Để có được thông tin này, chúng tôi đã tham khảo ở 2 blog sau:
[1] Using Athena Views As A Source In Glue
https://dev.to/aws-builders/using-athena-views-as-a-source-in-glue-k09
[2]Extract and transform data from AWS Athena’s views and load into AWS S3 as a CSV file using AWS Glue.
https://medium.com/@teckonn/extract-and-transform-data-from-aws-athenas-views-and-load-into-aws-s3-as-a-csv-file-using-aws-bffe7e65db8d
Chúng tôi cũng đã kiểm chứng lại thông tin được nhắc đến trong blog tại các tài liệu sau:
[1] https://docs.aws.amazon.com/glue/latest/dg/tables-described.html
——
When you define a table manually using the console or an API, you specify the table schema and the value of a classification field that indicates the type and format of the data in the data source.
——
=> Bảng hiện tại đang có classification là Unknown nên Glue báo lỗi
[2] https://docs.aws.amazon.com/athena/latest/ug/views.html
——
You cannot use views created in Athena with federated data sources, external Hive metastores, or UDFs.
——
=> Hiện tại đang sử dụng view của Athena với Glue job, nên có lỗi xảy ra
[3] https://docs.aws.amazon.com/glue/latest/dg/console-tables.html
——
A table in the AWS Glue Data Catalog is the metadata definition that represents the data in a data store
——
=> Vì chỉ có metadata nên không có được thông tin classification