

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

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