S3 Select와 함께 Spark를 사용하여 쿼리 성능 향상 - Amazon EMR

S3 Select와 함께 Spark를 사용하여 쿼리 성능 향상

Amazon EMR 릴리스 5.17.0 이상에서는 Amazon EMR 기반 Spark에서 S3 Select를 사용할 수 있습니다. S3 Select를 사용하면 애플리케이션이 객체에서 데이터 하위 집합만 검색할 수 있습니다. Amazon EMR의 경우 처리를 위해 대형 데이터 세트를 필터링하는 계산 작업이 클러스터에서 Amazon S3로 '푸시다운'되어 일부 애플리케이션의 성능이 향상되고 Amazon EMR과 Amazon S3 사이에 전송되는 데이터의 양이 줄어듭니다.

S3 Select는 s3selectCSVs3selectJSON 값을 사용하여 데이터 형식을 지정하는 CSV 및 JSON 파일에서 지원됩니다. 자세한 정보와 지침은 코드에서 S3 Select 지정을 참조하세요.

S3 Select가 애플리케이션에 적합한가요?

S3 Select 사용 여부에 관계없이 애플리케이션을 벤치마킹하여 애플리케이션에 적합한지 여부를 확인하는 것이 좋습니다.

다음 지침을 사용하여 애플리케이션과 함께 S3 Select를 사용할 수 있는지 확인하십시오.

  • 쿼리가 원본 데이터 세트 중 반 이상을 필터링합니다.

  • Amazon S3 및 Amazon EMR 클러스터 간 네트워크 연결의 전송 속도와 가용 대역폭이 양호합니다. Amazon S3는 HTTP 응답을 압축하지 않으므로 압축된 입력 파일의 경우 응답 크기가 증가할 수 있습니다.

고려 사항 및 제한

  • 고객 제공 암호화 키를 사용하는 Amazon S3 서버 측 암호화(SSE-C) 및 클라이언트 측 암호화는 지원되지 않습니다.

  • AllowQuotedRecordDelimiters 속성이 지원되지 않습니다. 이 속성이 지정되면 쿼리가 실패합니다.

  • UTF-8 형식의 CSV 및 JSON 파일만 지원됩니다. 여러 줄의 CSV는 지원되지 않습니다.

  • 비압축 또는 gzip 파일만 지원됩니다.

  • nanValue, positiveInf, negativeInf 및 손상된 레코드와 관련된 옵션(예: failfast 및 dropmalformed 모드)은 지원되지 않습니다.

  • 10진수 안에 쉼표(,)를 사용하는 것은 지원되지 않습니다. 예를 들어 10,000은 지원되지 않고 10000은 지원됩니다.

  • 마지막 줄의 설명 문자는 지원되지 않습니다.

  • 파일 끝의 빈 줄은 처리되지 않습니다.

  • 다음과 같은 필터는 Amazon S3로 푸시다운되지 않습니다.

    • COUNT()SUM() 등의 집계 함수

    • 속성에 대해 CAST()를 사용하는 필터링 예: CAST(stringColumn as INT) = 1.

    • 객체이거나 복잡한 속성을 가진 필터 예: intArray[1] = 1, objectColumn.objectNumber = 1.

    • 값이 리터럴 값이 아닌 필터 예: intColumn1 = intColumn2

    • 문서화된 제한 사항으로 S3 Select 지원 데이터 형식만 지원됩니다.

코드에서 S3 Select 지정

다음 예제는 Scala, SQL, R 및 PySpark를 사용하여 CSV에 대해 S3 Select를 지정하는 방법을 보여줍니다. JSON에 대해 S3 Select를 동일한 방식으로 사용할 수 있습니다. 옵션 목록, 기본값 및 제한 사항을 보려면 옵션 단원을 참조하십시오.

PySpark
spark .read .format("s3selectCSV") // "s3selectJson" for Json .schema(...) // optional, but recommended .options(...) // optional .load("s3://path/to/my/datafiles")
R
read.df("s3://path/to/my/datafiles", "s3selectCSV", schema, header = "true", delimiter = "\t")
Scala
spark .read .format("s3selectCSV") // "s3selectJson" for Json .schema(...) // optional, but recommended .options(...) // optional. Examples: // .options(Map("quote" -> "\'", "header" -> "true")) or // .option("quote", "\'").option("header", "true") .load("s3://path/to/my/datafiles")
SQL
CREATE TEMPORARY VIEW MyView (number INT, name STRING) USING s3selectCSV OPTIONS (path "s3://path/to/my/datafiles", header "true", delimiter "\t")

옵션

s3selectCSVs3selectJSON을 사용하는 경우 다음 옵션을 사용할 수 있습니다. 지정되지 않은 경우 기본값이 사용됩니다.

S3selectCSV와 옵션

옵션 기본값 사용량

compression

"none"

압축 사용 여부를 나타냅니다. "none" 외에도 "gzip"만 지원됩니다.

delimiter

","

필드 구분 기호를 지정합니다.

quote

'\"'

따옴표 문자를 지정합니다. 빈 문자열 지정은 지원되지 않으며 잘못된 XML 오류가 발생합니다.

escape

'\\'

이스케이프 문자를 지정합니다.

header

"false"

"false" 는 헤더가 없음을 나타냅니다. "true"는 헤더가 첫 번째 줄에 있음을 나타냅니다. 첫 번째 줄의 헤더만 지원되며 헤더 앞의 빈 줄은 지원되지 않습니다.

comment

"#"

설명 문자를 지정합니다. 설명 표시기는 비활성화할 수 없습니다. 즉, \u0000의 값은 지원되지 않습니다.

nullValue

""

selectJSON과 옵션

옵션 기본값 사용량

compression

"none"

압축 사용 여부를 나타냅니다. "none" 외에도 "gzip"만 지원됩니다.

multiline

"false"

"false"는 JSON이 S3 Select LINES 형식인 것으로 지정합니다. 즉, 입력 데이터의 각 줄에 단일 JSON 객체가 들어 있음을 의미합니다. "true"는 JSON이 S3 Select DOCUMENT 형식인 것으로 지정합니다. 이는 JSON 객체가 입력 데이터의 여러 줄에 걸쳐 있을 수 있음을 의미합니다.