Athena for Spark의 알려진 문제 - Amazon Athena

Athena for Spark의 알려진 문제

이 페이지에서는 Apache Spark용 Athena의 일부 알려진 문제에 대해 설명합니다.

테이블을 생성할 때 잘못된 인수 예외 발생

Spark에서는 빈 위치 속성으로 데이터베이스를 생성할 수 없지만 Spark 외부에서 생성된 AWS Glue의 데이터베이스에는 빈 LOCATION 속성이 존재할 수 있습니다.

테이블을 생성하고 빈 LOCATION 필드가 있는 AWS Glue 데이터베이스를 지정하면 IllegalArgumentException: Cannot create a path from an empty string.(IllegalArgumentException: 빈 문자열에서 경로를 생성할 수 없습니다) 예외가 발생할 수 있습니다.

예를 들어 AWS Glue의 기본 데이터베이스에 빈 LOCATION 필드가 있는 경우에 다음 명령을 실행하면 예외가 발생합니다.

spark.sql("create table testTable (firstName STRING)")

권장 솔루션 A - AWS Glue를 사용하여 사용 중인 데이터베이스에 위치를 추가합니다.

AWS Glue 데이터베이스에 위치를 추가하려면
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/glue/에서 AWS Glue 콘솔을 엽니다.

  2. 탐색 창에서 Databases(데이터베이스)를 선택합니다.

  3. 데이터베이스 목록에서 편집하려는 데이터베이스를 선택합니다.

  4. 데이터베이스에 대한 세부 정보 페이지에서 Edit(편집)을 선택합니다.

  5. Update a database(데이터베이스 업데이트) 페이지에서 Location(위치)에 Amazon S3 위치를 입력합니다.

  6. Update Database(데이터베이스 업데이트)를 선택합니다.

권장 솔루션 B - Amazon S3에 유효한 기존 위치가 있는 다른 AWS Glue 데이터베이스를 사용합니다. 예를 들어 dbWithLocation 데이터베이스가 있는 경우 spark.sql("use dbWithLocation") 명령을 사용하여 해당 데이터베이스로 전환합니다.

권장 솔루션 C - Spark SQL을 사용하여 테이블을 생성할 경우 다음 예제와 같이 location의 값을 지정합니다.

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET/'").

권장 솔루션 D - 테이블을 생성할 때 위치를 지정했지만 문제가 계속 발생하는 경우, 제공한 Amazon S3 경로에 후행 슬래시가 있는지 확인합니다. 예를 들어 다음 명령을 실행하면 잘못된 인수 예외가 발생합니다.

spark.sql("create table testTable (firstName STRING) location 's3://DOC-EXAMPLE-BUCKET'")

이 문제를 해결하려면 위치에 후행 슬래시를 추가합니다(예:'s3:// DOC-EXAMPLE-BUCKET/').

작업 그룹 위치에 생성된 데이터베이스

spark.sql('create database db')과 같은 명령을 사용하여 데이터베이스를 생성하고 데이터베이스의 위치를 지정하지 않는 경우 Athena에서 작업 그룹 위치에 하위 디렉터리를 생성하고 해당 위치를 새로 만든 데이터베이스에 사용합니다.

AWS Glue 기본 데이터베이스에서 Hive 관리형 테이블 관련 문제

AWS Glue에서 기본 데이터베이스의 Location 속성이 비어 있지 않고 Amazon S3의 유효한 위치를 지정하며 Athena for Spark를 사용하여 AWS Glue 기본 데이터베이스에서 Hive 관리형 테이블을 생성하는 경우, AWS Glue 데이터베이스에서 지정한 위치 대신 Athena Spark 작업 그룹에 지정된 Amazon S3 위치로 데이터가 기록됩니다.

이 문제는 Apache Hive에서 기본 데이터베이스를 처리하는 방식 때문에 발생합니다. Apache Hive는 Hive 웨어하우스 루트 위치에 테이블 데이터를 생성하는데, 이 위치가 실제 기본 데이터베이스 위치와 다를 수 있습니다.

Athena for Spark를 사용하여 AWS Glue의 기본 데이터베이스 아래에 Hive 관리형 테이블을 생성하는 경우 AWS Glue 테이블 메타데이터에서 서로 다른 두 위치를 가리킬 수 있습니다. 이로 인해 INSERT 또는 DROP TABLE 작업을 시도할 때 예상치 못한 동작이 발생할 수 있습니다.

문제를 재현하는 단계는 다음과 같습니다.

  1. Athena for Spark에서는 다음 방법 중 하나를 사용하여 Hive 관리형 테이블을 생성하거나 저장합니다.

    • CREATE TABLE $tableName과 같은 SQL 문

    • df.write.mode("overwrite").saveAsTable($tableName)과 같은 PySpark 명령은 Dataframe API에서 path 옵션을 지정하지 않습니다.

    이때 AWS Glue 콘솔에 Amazon S3의 잘못된 테이블 위치가 표시될 수 있습니다.

  2. Athena for Spark에서는 DROP TABLE $table_name 문을 사용하여 사용자가 생성한 테이블을 삭제합니다.

  3. DROP TABLE 문을 실행한 후에도 Amazon S3의 기본 파일이 여전히 존재합니다.

이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.

솔루션 A - Hive 관리형 테이블을 생성하는 경우 다른 AWS Glue 데이터베이스를 사용합니다.

솔루션 B - AWS Glue에서 기본 데이터베이스의 빈 위치를 지정합니다. 그런 다음 기본 데이터베이스에 관리형 테이블을 생성합니다.

Athena for Spark 및 Athena SQL 사이에서 CSV 및 JSON 파일 형식 비호환성

오픈 소스 Spark의 알려진 문제로 인해 Athena for Spark에서 CSV 또는 JSON 데이터로 테이블을 생성하는 경우 Athena SQL에서 테이블을 읽지 못하거나 그 반대의 경우가 발생할 수 있습니다.

예를 들어 다음 방법 중 하나를 사용하여 Athena for Spark에서 테이블을 생성할 수 있습니다.

  • 다음과 같은 USING csv 구문을 사용합니다.

    spark.sql('''CREATE EXTERNAL TABLE $tableName ( $colName1 $colType1, $colName2 $colType2, $colName3 $colType3) USING csv PARTITIONED BY ($colName1) LOCATION $s3_location''')
  • 다음과 같은 DataFrame API 구문을 사용합니다.

    df.write.format('csv').saveAsTable($table_name)

오픈 소스 Spark의 알려진 문제로 인해 결과 테이블에 대한 Athena SQL의 쿼리에 실패할 수 있습니다.

제안 솔루션 - Athena for Spark에서 Apache Hive 구문을 사용하여 테이블을 생성하세요. 자세한 내용은 Apache Spark 설명서의 CREATE HIVEFORMAT TABLE을 참조하세요.