

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# S3DistCp(s3-dist-cp)
<a name="UsingEMR_s3distcp"></a>

Apache DistCp는 대량의 데이터를 복사하는 데 사용할 수 있는 오픈 소스 도구입니다. *S3DistCp*는 DistCp와 비슷하지만 AWS, 특히 Amazon S3에서 함께 작동하도록 최적화되었습니다. Amazon EMR 버전 4.0 및 이후에서 S3DistCp 명령은 `s3-dist-cp`이며, 클러스터 단계로 혹은 명령줄에 추가됩니다. S3DistCp를 사용하여 Amazon S3의 대량 데이터를 HDFS로 효율적으로 복사할 수 있습니다. HDFS에서는 Amazon EMR 클러스터의 후속 단계를 통해 데이터를 처리할 수 있습니다. 또한 S3DistCp를 사용하여 Amazon S3 버킷 간에 또는 HDFS에서 Amazon S3로 데이터를 복사할 수도 있습니다. S3DistCp는 버킷과 AWS 계정 간에 많은 수의 객체를 병렬로 복사하는 데 더 확장 가능하고 효율적입니다.

실제 시나리오에서 S3DistCP의 유연성을 보여주는 특정 명령은 AWS 빅 데이터 블로그의 [ S3DistCp 사용에 대한 7가지 팁을](https://aws.amazon.com/blogs/big-data/seven-tips-for-using-s3distcp-on-amazon-emr-to-move-data-efficiently-between-hdfs-and-amazon-s3/) 참조하세요.

DistCp처럼 S3DistCp도 MapReduce를 사용하여 분산 방식으로 복사합니다. 여러 서버 간에 복사, 오류 처리, 복구 및 보고 작업을 공유합니다. Apache DistCp 오픈 소스 프로젝트에 대한 자세한 내용은 Apache Hadoop 설명서에서 [DistCp guide](http://hadoop.apache.org/docs/stable/hadoop-distcp/DistCp.html)를 참조하세요.

S3DistCp가 지정된 파일의 일부 또는 전체를 복사할 수 없는 경우 클러스터 단계가 실패하고 0 이외의 오류 코드를 반환합니다. 이러한 상황이 발생할 경우 S3DistCp는 부분적으로 복사된 파일을 지우지 않습니다.

**중요**  
S3DistCp는 밑줄 문자를 포함하는 Amazon S3 버킷 이름을 지원하지 않습니다.  
S3DistCp는 Parquet 파일의 연결을 지원하지 않습니다. 대신 PySpark를 사용하세요. 자세한 내용은 [Amazon EMR에서 parquet 파일 연결](https://aws.amazon.com/premiumsupport/knowledge-center/emr-concatenate-parquet-files/)을 참조하세요.  
S3DistCP를 사용하여 단일 파일(디렉터리 대신)을 S3에서 HDFS로 복사할 때 복사 오류를 방지하려면 Amazon EMR 버전 5.33.0 이상 또는 Amazon EMR 버전 6.3.0 이상을 사용합니다.

## S3DistCp 옵션
<a name="UsingEMR_s3distcp.options"></a>

S3DistCp는 DistCp와 비슷하지만 데이터를 복사하고 압축하는 방법을 변경하는 다양한 옵션 세트를 지원합니다.

S3DistCp를 직접 호출하면 다음 테이블에서 설명하는 옵션을 지정할 수 있습니다. 이 옵션은 인수 목록을 사용하여 단계에 추가됩니다. 다음 표에는 S3DistCp 인수 예가 나와 있습니다.


| 옵션  | 설명  | 필수  | 
| --- | --- | --- | 
| --src=LOCATION  |  복사할 데이터의 위치입니다. 이 위치는 HDFS 또는 Amazon S3 위치일 수 있습니다. 예시: `--src=s3://amzn-s3-demo-bucket/logs/j-3GYXXXXXX9IOJ/node`   S3DistCp는 밑줄 문자를 포함하는 Amazon S3 버킷 이름을 지원하지 않습니다.   | 예  | 
| --dest=LOCATION  |  데이터의 대상입니다. 이 위치는 HDFS 또는 Amazon S3 위치일 수 있습니다. 예시: `--dest=hdfs:///output`   S3DistCp는 밑줄 문자를 포함하는 Amazon S3 버킷 이름을 지원하지 않습니다.   | 예  | 
| --srcPattern=PATTERN  |  `--src`에서 데이터의 하위 세트로 복사 작업을 필터링하는 [정규식](http://en.wikipedia.org/wiki/Regular_expression)입니다. `--srcPattern`과 `--groupBy`를 둘 다 지정하지 않으면 `--src`의 모든 데이터가 `--dest`로 복사됩니다. 정규식 인수에 별표(\$1) 같은 특수 문자가 포함되어 있는 경우 정규식 또는 전체 `--args` 문자열을 작은따옴표(')에 포함해야 합니다. 예시: `--srcPattern=.*daemons.*-hadoop-.*`   | 아니요  | 
| --groupBy=PATTERN  |  S3DistCp에서 식과 일치하는 파일을 연결하는 [정규식](http://en.wikipedia.org/wiki/Regular_expression)입니다. 예를 들면 이 옵션을 사용하여 한 시간 동안 작성된 모든 로그 파일을 단일 파일로 결합할 수 있습니다. 연결된 파일 이름은 그룹화 정규식과 일치하는 값입니다. 괄호는 파일을 그룹화하는 방식을 나타내며, 괄호 안에 지정된 문과 일치하는 모든 항목이 단일 출력 파일로 결합됩니다. 괄호에 지정된 문이 정규식에 포함되지 않는 경우 S3DistCp 단계에 대해 클러스터가 실패하며 오류가 발생합니다. 정규식 인수에 별표(\$1) 같은 특수 문자가 포함되어 있는 경우 정규식 또는 전체 `--args` 문자열을 작은따옴표(')에 포함해야 합니다. `--groupBy`를 지정하면 지정한 패턴과 일치하는 파일만 복사됩니다. `--groupBy`와 `--srcPattern`을 동시에 지정할 필요는 없습니다. 예시: `--groupBy=.*subnetid.*([0-9]+-[0-9]+-[0-9]+-[0-9]+).*`  | 아니요  | 
| --targetSize=SIZE  |  `--groupBy` 옵션에 따라 생성할 파일의 크기로, 단위는 메비바이트(MiB)입니다. 이 값은 정수여야 합니다. `--targetSize`를 설정하는 경우 S3DistCp에서는 이 크기에 맞추려고 합니다. 복사한 파일의 실제 크기는 이 값보다 크거나 작을 수도 있습니다. 작업이 데이터 파일의 크기에 따라 집계되므로 대상 파일 크기가 소스 데이터 파일 크기와 일치할 수 있습니다. `--groupBy`에 의해 연결된 파일이 `--targetSize`의 값보다 크면 부분 파일로 나눠지고 이름 끝에 숫자 값이 순차적으로 지정됩니다. 예를 들어, `myfile.gz`에 연결된 파일은 `myfile0.gz`, `myfile1.gz` 등 여러 부분으로 나눠집니다. 예시: `--targetSize=2`   | 아니요  | 
| --appendToLastFile |  이미 있는 파일을 Amazon S3에서 HDFS로 복사하는 경우 S3DistCp의 동작을 지정합니다. 이 옵션은 새 파일 데이터를 기존 파일에 추가합니다. `--appendToLastFile`을 `--groupBy`와 함께 사용할 경우 동일 그룹과 일치하는 파일에 새 데이터가 추가됩니다. 이 옵션은 `--targetSize`와 함께 사용하는 경우 `--groupBy.` 동작과 관련이 있습니다.  | 아니요  | 
| --outputCodec=CODEC  |  복사한 파일에 사용할 압축 코덱을 지정합니다. 이때 `gzip`, `gz`, `lzo`, `snappy` 또는 `none` 값을 사용할 수 있습니다. 예를 들어, 이 옵션을 사용하여 Gzip으로 압축된 입력 파일을 LZO로 압축된 출력 파일로 변환하거나 복사 작업의 일부로서 파일의 압축을 풀 수 있습니다. 출력 코덱을 선택하는 경우 파일 이름에 해당 확장명(예: `gz` 및 `gzip`의 경우, 확장명은 `.gz`)이 추가됩니다. `--outputCodec`의 값을 지정하지 않으면 파일이 압축 변화 없이 복사됩니다. 예시: `--outputCodec=lzo`   | 아니요  | 
| --s3ServerSideEncryption  |  대상 데이터가 SSL을 사용하여 전송되고 AWS 서비스 측 키를 사용하여 Amazon S3에서 자동으로 암호화되는지 확인합니다. S3DistCp를 사용하여 데이터를 검색할 때 객체가 자동으로 암호화 해제됩니다. 암호화되지 않은 객체를 암호화가 요구되는 Amazon S3 버킷으로 복사하려는 경우 작업이 실패합니다. 자세한 내용은 [데이터 암호화 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)을 참조하세요. 예시: `--s3ServerSideEncryption`   | 아니요  | 
| --deleteOnSuccess  |  이 옵션을 지정한 경우 복사 작업이 성공적으로 수행되면 S3DistCp가 복사한 파일이 소스 위치에서 삭제됩니다. 이 옵션은 예약 작업으로서 로그 파일 같은 출력 파일을 한 위치에서 다른 위치로 복사하려 하며 동일한 파일을 두 번 복사하기를 원치 않는 경우에 유용합니다. 예시: `--deleteOnSuccess`   | 아니요  | 
| --disableMultipartUpload  |  멀티파트 업로드 사용을 비활성화합니다. 예시: `--disableMultipartUpload`   | 아니요  | 
| --multipartUploadChunkSize=SIZE  |  Amazon S3 멀티파트 업로드의 각 파트 크기(MiB). S3DistCp는 `multipartUploadChunkSize`보다 큰 데이터를 복사할 때 멀티파트 업로드를 사용합니다. 작업 성능을 향상시키기 위해 각 부품 크기를 늘릴 수 있습니다. 기본 크기는 128MiB입니다. 예시: `--multipartUploadChunkSize=1000`   | 아니요  | 
| --numberFiles  |  출력 파일 앞에 순차 번호를 붙입니다. `--startingIndex`에 다른 값을 지정하는 경우가 아니면 번호는 0부터 시작합니다. 예시: `--numberFiles`   | 아니요  | 
| --startingIndex=INDEX  |  `--numberFiles`와 함께 사용되어 순서에서 첫 번째 번호를 지정합니다. 예시: `--startingIndex=1`   | 아니요  | 
| --outputManifest=FILENAME  |  S3DistCp에서 복사한 모든 파일의 목록을 포함하는 텍스트 파일(Gzip으로 압축됨)을 생성합니다. 예시: `--outputManifest=manifest-1.gz`   | 아니요  | 
| --previousManifest=PATH  |  `--outputManifest` 플래그를 사용하여 이전 S3DistCp 호출 중에 생성된 매니페스트 파일을 읽습니다. `--previousManifest` 플래그를 설정한 경우 S3DistCp가 매니페스트에 나열된 파일을 복사 작업에서 제외시킵니다. `--outputManifest`를 `--previousManifest`와 함께 지정하는 경우 복사되지 않았더라도 이전 매니페스트에 나열된 파일이 새 매니페스트 파일에도 나타납니다. 예시: `--previousManifest=/usr/bin/manifest-1.gz`   | 아니요  | 
| --requirePreviousManifest |  이전 S3DistCp 호출 중에 생성된 이전 매니페스트가 필요합니다. false로 설정된 경우 이전 매니페스트가 지정되지 않았을 때 오류가 발생하지 않습니다. 기본값은 true입니다.  | 아니요  | 
| --copyFromManifest  |  S3DistCp에서 파일 목록을 복사에서 제외하는 것이 아니라 복사할 파일 목록으로서 지정한 매니페스트 파일을 사용하도록 `--previousManifest`의 동작을 반대로 설정합니다. 예시: `--copyFromManifest --previousManifest=/usr/bin/manifest-1.gz`   | 아니요  | 
| --s3Endpoint=ENDPOINT |  파일 업로드 시 사용할 Amazon S3 엔드포인트를 지정합니다. 이 옵션은 소스 및 대상 모두의 엔드포인트를 설정합니다. 설정하지 않은 경우 기본 엔드포인트는 `s3.amazonaws.com`입니다. Amazon S3 엔드포인트 목록은 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)를 참조하세요. 예시: `--s3Endpoint=s3.eu-west-1.amazonaws.com`   | 아니요  | 
| --storageClass=CLASS |  대상이 Amazon S3일 때 사용할 스토리지 클래스입니다. 유효한 값은 STANDARD 및 REDUCED\$1REDUNDANCY입니다. 이 옵션을 지정하지 않은 경우 S3DistCp에서 스토리지 클래스를 보존합니다. 예시: `--storageClass=STANDARD`  | 아니요  | 
| --srcPrefixesFile=PATH |  Amazon S3(s3://), HDFS(hdfs:///) 또는 로컬 파일 시스템(file:/)에 있는 `src` 접두사 목록(줄당 접두사 한 개)을 포함하는 텍스트 파일입니다. `srcPrefixesFile`을 제공하는 경우 S3DistCp에서 src 경로를 나열하지 않습니다. 대신에 결합된 결과로서 소스 목록을 생성하여 이 파일에 지정된 모든 접두사를 나열합니다. 이러한 접두사를 사용하는 src 경로와는 달리, 상대 경로를 사용하여 대상 경로를 생성합니다. `srcPattern`도 지정한 경우 이 패턴이 소스 접두사의 결합된 목록 결과에 적용되어 입력을 추가로 필터링합니다. `copyFromManifest`를 사용하는 경우 매니페스트의 객체가 복사되고 `srcPrefixesFile`이 무시됩니다. 예시: `--srcPrefixesFile=PATH`  | 아니요  | 

위의 옵션 외에도, S3DistCp는 [도구 인터페이스](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/util/Tool.html)를 구현하므로 일반 옵션이 지원됩니다.

## S3DistCp를 클러스터에 단계로 추가
<a name="UsingEMR_s3distcp.step"></a>

클러스터에서 단계로 추가하여 S3DistCp를 호출할 수 있습니다. 콘솔, CLI 또는 API를 사용하여 시작 시 클러스터에 또는 실행 중인 클러스터에 단계를 추가할 수 있습니다. 다음 예제에서는 S3DistCp를 사용하여 실행 중인 클러스터에 추가하는 방법을 보여 줍니다. 클러스터에 단계를 추가하는 방법에 대한 자세한 내용은 *Amazon EMR 관리 안내서*에서 [클러스터에 작업 제출](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)을 참조하세요.

**를 사용하여 실행 중인 클러스터에 S3DistCp 단계를 추가하려면 AWS CLI**

에서 Amazon EMR 명령을 사용하는 방법에 대한 자세한 AWS CLI내용은 [AWS CLI 명령](https://docs.aws.amazon.com/cli/latest/reference/emr) 참조를 참조하세요.
+ S3DistCp를 호출하는 클러스터에 단계를 추가하려면 S3DistCp에서 복사 작업을 수행하는 방식을 지정하는 파라미터를 인수로 전달합니다.

  다음 예제에서는 Amazon S3에서 `hdfs:///output`으로 대몬(daemon) 로그를 복사합니다. 다음 명령을 실행합니다.
  + `--cluster-id`는 클러스터를 지정합니다.
  + `Jar`은 S3DistCp JAR 파일의 위치입니다. command-runner.jar을 사용하여 클러스터에서 명령을 실행하는 방법의 예제는 [사용자 지정 JAR 단계를 제출하여 스크립트 또는 명령 실행](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html#emr-commandrunner-examples)을 참조하세요.
  + `Args`는 S3DistCp로 전달할 옵션 이름-값 페어의 쉼표로 구분된 목록입니다. 사용 가능한 옵션의 전체 목록은 [S3DistCp 옵션](#UsingEMR_s3distcp.options) 섹션을 참조하세요.

  S3DistCp 복사 단계를 실행 중인 클러스터에 추가하려면 Amazon S3 또는 로컬 파일 시스템에 저장된 JSON 파일(이 예제의 경우 `myStep.json`)에 다음을 추가합니다. *j-3GYXXXXXX9IOK*를 클러스터 ID로 바꾸고 *amzn-s3-demo-bucket*을 Amazon S3 버킷 이름으로 바꿉니다.

  ```
  [
      {
          "Name":"S3DistCp step",
          "Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com","--src=s3://amzn-s3-demo-bucket/logs/j-3GYXXXXXX9IOJ/node/","--dest=hdfs:///output","--srcPattern=.*[a-zA-Z,]+"],
          "ActionOnFailure":"CONTINUE",
          "Type":"CUSTOM_JAR",
          "Jar":"command-runner.jar"        
      }
  ]
  ```

  ```
  aws emr add-steps --cluster-id j-3GYXXXXXX9IOK --steps file://./myStep.json
  ```

**Example Amazon S3에서 HDFS로 로그 파일 복사**  
이 예제에서는 실행 중인 클러스터에 단계를 추가하여 Amazon S3 버킷에 저장된 로그 파일을 HDFS로 복사하는 방법을 보여줍니다. 이 예제에서 `--srcPattern` 옵션은 복사된 데이터를 대몬 로그로 제한하는 데 사용됩니다.  
`--srcPattern` 옵션을 사용하여 Amazon S3에서 HDFS로 로그 파일을 복사하려면 Amazon S3 또는 로컬 파일 시스템에 저장된 JSON 파일(이 예제의 경우 `myStep.json`)에 다음을 추가합니다. *j-3GYXXXXXX9IOK*를 클러스터 ID로 바꾸고 *amzn-s3-demo-bucket*을 Amazon S3 버킷 이름으로 바꿉니다.  

```
[
    {
        "Name":"S3DistCp step",
        "Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com","--src=s3://amzn-s3-demo-bucket/logs/j-3GYXXXXXX9IOJ/node/","--dest=hdfs:///output","--srcPattern=.*daemons.*-hadoop-.*"],
        "ActionOnFailure":"CONTINUE",
        "Type":"CUSTOM_JAR",
        "Jar":"command-runner.jar"        
    }
]
```