KEEP GOING

[oozie][sqoop] FileAlreadyExistException 오류 해결 본문

bigdata/hadoop

[oozie][sqoop] FileAlreadyExistException 오류 해결

jmHan 2023. 4. 18. 17:02
반응형

목차

     

     

    FileAlreadyExistException 오류 해결

     

    oozie w/f에서 sqoop 액션 실행 시 아래와 같은 에러가 발생했습니다. 

    [main] ERROR org.apache.sqoop.tool.ImportTool - Import failed: org.apache.hadoop.mapred.FileAlreadyExistException: Output directory hdfs://nameservice1/user/hive/warehouse/***db.****table already exists

     

    FileAlreadyExistException 오류 원인 

    FileAlreadyExistsException 오류는 sqoop import 사용 시 --target-dir 옵션으로 디렉터리를 지정했을 때,

    지정된 디렉토리가 hdfs에 이미 존재하는 경우에 발생합니다.

    이 오류는 sqoop이 기본적으로 기존 데이터를 덮어쓰지 않도록 설계되었기 때문에 발생합니다.

    --target-dir 옵션으로 target 디렉토리를 지정하면 sqoop은 디렉토리가 이미 존재하는지 확인한 다음 

    이미 존재한다면 FileAlreadyExistsException 오류를 일으켜 실수로 기존 데이터를 덮어쓰는 것을 방지합니다.

     

    해결 방법 

    hdfs의 warehouse에서 지정 디렉터리를 삭제하는 방법도 있지만 이는 영구적인 해결 방법이 될 수 없습니다.

    일시적으로 해결할 수는 있지만 배치성으로 w/f가 동작할 경우, 실행하기 전에 일일이 디렉터리를 삭제해줘야 합니다.

    따라서 아래와 같은 방법을 권장 드립니다.

     

    1. unique한 대상 디렉토리 명칭 지정 

    hadoop 파일 시스템에 아직 존재하지 않는 대상 디렉토리명으로 지정할 수 있습니다. 

    예를 들면, 디렉터리명을 dir_20230418_170000과 같이 타임스탬프를 포함하여 고유하게 만들 수 있습니다.

     


    2. --delete-target-dir 옵션 적용

    --delete-target-dir 옵션을 사용할 경우, 데이터를 가져오기 전에 대상 디렉토리를 자동으로 삭제할 수 있습니다.

    이 옵션은 대상 디렉터리의 기존 데이터를 덮어쓰려는 경우 유용합니다.

    sqoop import \
    --connect jdbc:mysql://localhost/mydatabase \
    --username myusername \
    --password mypassword \
    --table mytable \
    --target-dir /myhdfsdir \
    --delete-target-dir \
    --fields-terminated-by '\t'

     

    * --append 또는 --merge-key 옵션

    새로운 데이터를 target 디렉터리의 기존 데이터에 병합하려고 한다면 --target-dir 대신 --append 나 --merge 옵션을 적용하면 됩니다.

    반응형
    Comments