Amazon EMR에서 Parquet 파일을 연결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 7월 9일

S3DistCp(s3-dist-cp)를 사용하여 Apache Parquet 형식의 파일을 --groupBy 및 --targetSize 옵션과 연결합니다. s3-dist-cp 작업은 오류 없이 완료되지만 생성된 Parquet 파일이 손상되었습니다. 애플리케이션에서 Parquet 파일을 읽으려고 하면 다음과 같은 오류 메시지가 표시됩니다.

‘Expected n values in column chunk at /path/to/concatenated/parquet/file offset m but got x values instead over y pages ending at file offset z’

Amazon EMR에서 Parquet 파일을 연결하려면 어떻게 해야 합니까?

간략한 설명

S3DistCp는 Parquet 파일의 연결을 지원하지 않습니다. 대신 PySpark를 사용하십시오.

해결 방법

PySpark에서 대상 파일 크기를 지정할 수는 없지만 파티션 수는 지정할 수 있습니다. Spark는 각 파티션을 별도의 출력 파일에 저장합니다. 필요한 파티션 수를 추정하려면 데이터 세트의 크기를 대상 개별 파일 크기로 나눕니다.

1.    Apache Spark가 설치된 Amazon EMR 클러스터를 생성합니다.

2.    필요한 실행기 수를 지정합니다. 이는 클러스터 용량과 데이터 세트 크기에 따라 다릅니다. 자세한 내용은 Amazon EMR에서 Apache Spark 애플리케이션의 메모리를 성공적으로 관리하는 모범 사례를 참조하십시오.

$  pyspark --num-executors number_of_executors

3.    소스 Parquet 파일을 Spark DataFrame으로 로드합니다. 이는 Amazon Simple Storage Service(Amazon S3) 경로 또는 HDFS 경로일 수 있습니다. 예:

df=sqlContext.read.parquet("s3://awsdoc-example-bucket/parquet-data/")

HDFS:

df=sqlContext.read.parquet("hdfs:///tmp/parquet-data/")

4.    DataFrame을 다시 분할합니다. 다음 예제에서 n은 파티션의 수입니다.

df_output=df.coalesce(n)

5.    DataFrame을 대상에 저장합니다. 이는 Amazon S3 경로 또는 HDFS 경로일 수 있습니다. 예:

df_output.write.parquet("URI:s3://awsdoc-example-bucket1/destination/")

HDFS:

df=sqlContext.read.parquet("hdfs:///tmp/destination/")

6.    현재 대상 디렉터리에 있는 파일 수를 확인합니다.

hadoop fs -ls "URI:s3://awsdoc-example-bucket1/destination/ | wc -l"

총 파일 수는 4단계의 n 값에 1을 더한 값이어야 합니다. Parquet 출력 커미터는 _SUCCESS라는 추가 파일을 작성합니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?