AWS Glue에서 Parquet 형식 사용 - AWS Glue

AWS Glue에서 Parquet 형식 사용

AWS Glue는 소스에서 데이터를 검색하고 다양한 데이터 형식으로 저장 및 전송되는 대상에 데이터를 씁니다. 데이터가 Parquet 데이터 형식으로 저장 또는 전송되는 경우 이 문서에서는 AWS Glue에서 데이터를 사용하는 데 사용할 수 있는 기능을 소개합니다.

AWS Glue는 Parquet 형식 사용을 지원합니다. 이 형식은 성능 중심의 열 기반 데이터 형식입니다. 표준 기관의 형식에 대한 소개는 Apache Parquet 설명서 개요를 참조하세요.

AWS Glue를 사용하여 Amazon S3와 스트리밍 소스에서 Parquet 파일을 읽을 수 있을 뿐만 아니라 Amazon S3에 Parquet 파일을 쓸 수 있습니다. S3에서 Parquet 파일이 포함된 bzipgzip 아카이브를 읽고 쓸 수 있습니다. 이 페이지에서 설명하는 구성 대신 Amazon S3 연결에서 압축 동작을 구성할 수 있습니다.

다음 표에서는 Parquet 형식 옵션을 지원하는 일반적인 AWS Glue 기능을 보여줍니다.

읽기(Read) 쓰기 스트리밍 읽기 작은 파일 그룹화 작업 북마크
지원 지원 지원 지원되지 않음 지원*

* AWS Glue 버전 1.0 이상에서 지원

예: S3에서 Parquet 파일 또는 폴더 읽기

사전 조건: 읽고자 하는 Parquet 파일 또는 폴더에 대한 S3 경로(s3path)가 필요합니다.

구성: 함수 옵션에서 format="parquet"를 지정합니다. connection_options에서 paths 키를 사용하여 s3path를 지정합니다.

connection_options에서 리더와 S3가 상호 작용하는 방식을 구성할 수 있습니다. 자세한 내용은 AWS Glue에서 ETL 관련 연결 유형 및 옵션 참조: Amazon S3 연결

리더에서 format_options의 Parquet 파일을 해석하는 방법을 구성할 수 있습니다. 자세한 내용은 Parquet 구성 참조를 참조하십시오.

다음 AWS Glue ETL 스크립트는 S3에서 Parquet 파일 또는 폴더를 읽는 프로세스를 보여줍니다.

Python

이 예에서는 create_dynamic_frame.from_options 메서드를 사용합니다.

# Example: Read Parquet from S3 from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type = "s3", connection_options = {"paths": ["s3://s3path/"]}, format = "parquet" )

또한 스크립트(pyspark.sql.DataFrame)에서 DataFrame을 사용합니다.

dataFrame = spark.read.parquet("s3://s3path/")
Scala

이 예에서는 getSourceWithFormat 메서드를 사용합니다.

// Example: Read Parquet from S3 import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val dynamicFrame = glueContext.getSourceWithFormat( connectionType="s3", format="parquet", options=JsonOptions("""{"paths": ["s3://s3path"]}""") ).getDynamicFrame() } }

또한 스크립트(org.apache.spark.sql.DataFrame)에서 DataFrame을 사용합니다.

spark.read.parquet("s3://s3path/")

예: S3에 Parquet 파일 및 폴더 쓰기

사전 조건: 초기화된 DataFrame(dataFrame) 또는 DynamicFrame(dynamicFrame)이 필요합니다. 예상되는 S3 출력 경로(s3path)도 필요합니다.

구성: 함수 옵션에서 format="parquet"를 지정합니다. connection_options에서 paths 키를 사용하여 s3path를 지정합니다.

connection_options에서 라이터가 S3와 상호 작용하는 방식을 추가로 변경할 수 있습니다. 자세한 내용은 AWS Glue에서 ETL 관련 연결 유형 및 옵션 참조: Amazon S3 연결 작업에서 format_options에 있는 파일의 내용을 쓰는 방법을 구성할 수 있습니다. 자세한 내용은 Parquet 구성 참조를 참조하십시오.

다음 AWS Glue ETL 스크립트는 S3로 Parquet 파일 및 폴더를 쓰는 프로세스를 보여줍니다.

useGlueParquetWriter 구성 키를 통해 사용자 지정 Parquet 라이터에 DynamicFrame에 대한 성능 최적화가 제공됩니다. 이 라이터가 워크로드에 적합한지 확인하려면 Glue Parquet 라이터를 참조하세요.

Python

이 예에서는 write_dynamic_frame.from_options 메서드를 사용합니다.

# Example: Write Parquet to S3 # Consider whether useGlueParquetWriter is right for your workflow. from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) glueContext.write_dynamic_frame.from_options( frame=dynamicFrame, connection_type="s3", format="parquet", connection_options={ "path": "s3://s3path", }, format_options={ # "useGlueParquetWriter": True, }, )

또한 스크립트(pyspark.sql.DataFrame)에서 DataFrame을 사용합니다.

df.write.parquet("s3://s3path/")
Scala

이 예에서는 getSinkWithFormat 메서드를 사용합니다.

// Example: Write Parquet to S3 // Consider whether useGlueParquetWriter is right for your workflow. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) glueContext.getSinkWithFormat( connectionType="s3", options=JsonOptions("""{"path": "s3://s3path"}"""), format="parquet" ).writeDynamicFrame(dynamicFrame) } }

또한 스크립트(org.apache.spark.sql.DataFrame)에서 DataFrame을 사용합니다.

df.write.parquet("s3://s3path/")

Parquet 구성 참조

AWS Glue 라이브러리가 format="parquet"을 지정한 어디에서나 다음 format_options를 사용할 수 있습니다.

  • useGlueParquetWriter - DynamicFrame 워크플로에 대한 성능 최적화가 포함된 사용자 지정 Parquet 라이터의 사용을 지정합니다. 자세한 내용은 Glue Parquet 라이터를 참조하세요.

    • 유형: 부울, 기본값:false

  • compression - 사용되는 압축 코덱을 지정합니다. 값은 org.apache.parquet.hadoop.metadata.CompressionCodecName과 완벽하게 호환됩니다.

    • 유형: 열거 텍스트, 기본값: "snappy"

    • 값: "uncompressed", "snappy", "gzip""lzo"

  • blockSize - 메모리에 버퍼링되는 행 그룹의 크기(바이트 단위)를 지정합니다. 성능 튜닝에 사용합니다. 크기는 정확히 메가바이트 수로 나눠야 합니다.

    • 유형: 숫자, 기본값:134217728

    • 기본값은 128MB입니다.

  • pageSize - 페이지의 크기를 바이트 단위로 지정합니다. 성능 튜닝에 사용합니다. 페이지는 단일 레코드에 액세스하기 위해 완전하게 읽어야 하는 가장 작은 단위입니다.

    • 유형: 숫자, 기본값:1048576

    • 기본값은 1MB입니다.

참고

또한 SparkSQL 기초 코드에 의해 수락된 옵션은 connection_options 맵 파라미터를 거쳐 SparkSQL 기초 코드로 넘겨질 수 있습니다. 예를 들어 AWS Glue Spark 리더에 대해 mergeSchema와 같은 Spark 구성을 설정하여 모든 파일의 스키마를 병합할 수 있습니다.

AWS Glue Parquet 라이터를 사용한 쓰기 성능 최적화

참고

AWS Glue Parquet 라이터는 예전에 glueparquet 형식 유형을 통해 액세스되었습니다. 이 액세스 패턴은 더 이상 지원되지 않습니다. 대신 useGlueParquetWriter이 활성화된 parquet 유형을 사용합니다.

AWS Glue Parquet 라이터는 더 빠른 Parquet 파일 쓰기가 가능하도록 성능이 향상되었습니다. 기존 라이터는 쓰기 전에 스키마를 컴퓨팅합니다. Parquet 형식은 빠르게 검색할 수 있는 방식으로 스키마를 저장하지 않으므로 시간이 걸릴 수 있습니다. AWS Glue Parquet 라이터를 사용하는 경우 사전 컴퓨팅된 스키마가 필요하지 않습니다. 데이터가 들어오면 라이터는 스키마를 동적으로 컴퓨팅 및 수정합니다.

useGlueParquetWriter를 지정하는 경우 다음 제한에 유의하세요.

  • 라이터는 열 추가 또는 제거와 같은 스키마 개선만 지원하고 ResolveChoice와 같은 열 유형 변경은 지원하지 않습니다.

  • 라이터는 빈 DataFrame을 저장할 수 없습니다(예: 스키마 전용 파일 작성).

변형에 이러한 제한이 필요하지 않은 경우 AWS Glue Parquet 라이터를 켜면 성능이 향상됩니다.