복붙노트

[HADOOP] hadoop (EMR)을 사용하여 S3에 _ $ 폴더 $ 키를 생성하지 마십시오.

HADOOP

hadoop (EMR)을 사용하여 S3에 _ $ 폴더 $ 키를 생성하지 마십시오.

AWS 데이터 파이프 라인에서 EMR 활동을 사용하고 있습니다. 이 EMR 활동은 EMR 클러스터에서 하이브 스크립트를 실행 중입니다. Dynamo DB를 입력으로 사용하고 S3에 데이터를 저장합니다.

이것은 EMR 활동에서 사용되는 EMR 단계입니다.

s3://elasticmapreduce/libs/script-runner/script-runner.jar,s3://elasticmapreduce/libs/hive/hive-script,--run-hive-script,--hive-versions,latest,--args,-f,s3://my-s3-bucket/hive/my_hive_script.q,-d,DYNAMODB_INPUT_TABLE1=MyTable,-d,S3_OUTPUT_BUCKET=#{output.directoryPath}

어디에

out.direcoryPath는 다음과 같습니다.

s3://my-s3-bucket/output/#{format(@scheduledStartTime,"YYYY-MM-dd")}

그래서 이것은 S3에 하나의 폴더와 하나의 파일을 만듭니다. (엄밀히 말하면 2017-03-18 / 와 2017-03-18_ $ folder $라는 두 개의 키를 만듭니다)

2017-03-18
2017-03-18_$folder$

이러한 빈 $ _ $ 폴더 $ 파일의 생성을 피하는 방법.

편집하다: https://issues.apache.org/jira/browse/HADOOP-10400에 나와있는 솔루션을 찾았지만 AWS 데이터 파이프 라인에서 구현하는 방법을 모르겠습니다.

해결법

  1. ==============================

    1.EMR은 이것을 피하는 방법을 제공하지 않는 것 같습니다.

    EMR은 이것을 피하는 방법을 제공하지 않는 것 같습니다.

    Hadoop 소스 코드에 포함되어 있으므로 수정할 수 있지만 EMR에서는 수정되지 않은 것 같습니다.

    영리하게 느껴진다면 _ $ folder $ 접미사와 일치하는 S3 이벤트 알림을 만들 수 있으며 생성 된 개체를 삭제하기 위해 람다 함수를 실행 시키면됩니다.

  2. ==============================

    2.실제로 빈 폴더를 만드는 방법은 없습니다. S3는 객체 저장소이므로 모든 것이 거기에있는 객체입니다. Hadoop이이를 파일 시스템으로 사용하는 경우, 파일 시스템 트리로 나타나도록 객체를 구성해야하므로 객체를 디렉토리로 표시하는 특수 객체를 생성합니다. 데이터 파일을 저장하기 만하면 해당 데이터 파일을 경로로 구성하여 탐색 용 폴더와 유사한 개념을 만들 수 있습니다.

    실제로 빈 폴더를 만드는 방법은 없습니다. S3는 객체 저장소이므로 모든 것이 거기에있는 객체입니다. Hadoop이이를 파일 시스템으로 사용하는 경우, 파일 시스템 트리로 나타나도록 객체를 구성해야하므로 객체를 디렉토리로 표시하는 특수 객체를 생성합니다. 데이터 파일을 저장하기 만하면 해당 데이터 파일을 경로로 구성하여 탐색 용 폴더와 유사한 개념을 만들 수 있습니다.

    폴더를 만들지 않고 원하는 경로에 파일을 저장하면됩니다. S3에서 파일을 작성하기 전에 폴더를 만들 필요가 없습니다.

    또한 도움이 될 수 있습니다 : https://qubole.zendesk.com/hc/en-us/articles/213496246-How-To-Remove-Dir-marker-folders-in-S3-NativeFS-

  3. ==============================

    3.이 문제를 해결하려면 EMR 부트 스트랩 작업에서 아래 스크립트를 사용하십시오. AWS에서 제공 한 패치

    이 문제를 해결하려면 EMR 부트 스트랩 작업에서 아래 스크립트를 사용하십시오. AWS에서 제공 한 패치

    #!/bin/bash
    
    # NOTE: This script replaces the s3-dist-cp RPM on EMR versions 4.6.0+ with s3-dist-cp-2.2.0.
    # This is intended to remove the _$folder$ markers when creating the destination prefixes in S3.
    
    set -ex
    
    RPM=bootstrap-actions/s3-dist-cp-2.2.0/s3-dist-cp-2.2.0-1.amzn1.noarch.rpm
    
    LOCAL_DIR=/var/aws/emr/packages/bigtop/s3-dist-cp/noarch
    
    # Get the region from metadata
    REGION=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone/ 2>/dev/null | head -c -1)
    
    # Choose correct bucket for region
    if [ $REGION = "us-east-1" ]
    then
        BUCKET=awssupportdatasvcs.com
    else
        BUCKET=$REGION.awssupportdatasvcs.com
    fi
    
    # Download new RPM
    sudo rm $LOCAL_DIR/s3-dist-cp*.rpm
    aws s3 cp s3://$BUCKET/$RPM /tmp/
    sudo cp /tmp/s3-dist-cp-2.2.0-1.amzn1.noarch.rpm $LOCAL_DIR/
    
    echo Rebuilding Repo
    sudo yum install -y createrepo
    sudo createrepo --update -o /var/aws/emr/packages/bigtop /var/aws/emr/packages/bigtop
    sudo yum clean all
    
  4. from https://stackoverflow.com/questions/42876195/avoid-creation-of-folder-keys-in-s3-with-hadoop-emr by cc-by-sa and MIT license