hadoop distcp -update $source $target
하둡 클러스터 2대를 운영하고 있는 상황에서 매일 A클러스터에서 B클러스터로 데이터를 백업을 한다. 현재 하둡은 source target 모두 2.7.1 버전이다.
이때 distcp 명령어를 사용하고 이는 mapreduce로 수행이 되기 때문에 성능이 좋다.
(distcp는 하둡 클러스터간 파일을 복사할 때 유용하다.)
정상적으로 수행되면 아래와 같은 로그를 볼 수 있는데..
INFO tools.DistCp: DistCp job-id: job_1587237267517_10878
INFO mapreduce.Job: Running job: job_1587237267517_10878
INFO mapreduce.Job: Job job_1587237267517_10878 running in uber mode : false
INFO mapreduce.Job: map 0% reduce 0%
INFO mapreduce.Job: map 55% reduce 0%
INFO mapreduce.Job: map 82% reduce 0%
INFO mapreduce.Job: map 91% reduce 0%
INFO mapreduce.Job: map 95% reduce 0%
INFO mapreduce.Job: map 100% reduce 0%
INFO mapreduce.Job: Job job_1587237267517_10878 completed successfully
INFO mapreduce.Job: Counters: 33
갑자기 실패가 났길래 타겟쪽에 용량이 부족한가? 라는 의심이 들었고 로그를 봤다.
HDFS-DISTCP ERROR - Caused by: java.io.IOException: Couldn't run retriable-command: Copying $source to $target
HDFS-DISTCP ERROR - at org.apache.hadoop.tools.util.RetriableCommand.execute(RetriableCommand.java:101)
HDFS-DISTCP ERROR - at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:281)
Caused by: java.io.IOException: Check-sum mismatch between $source and $target. Source and target differ in block-size. Use -pb to preserve block-sizes during copy. Alternatively, skip checksum-checks altogether, using -skipCrc. (NOTE: By skipping checksums, one runs the risk of masking data-corruption during file-transfer.)
Check-sum이 mismatch했고 소스와 타겟간에 block-size가 다르다고 한다.
해결책은 그냥 무시하는 옵션을 주면 된다. -skipcrccheck
default block size가 256MB인데 보니까 source쪽이 128MB로 생성되었더라.
그런데 file size는 128이 넘는다..
무슨현상인지 이해는 잘 안가지만 어쨌든 단순히 백업용도이고 파일 복사가 되면 타겟쪽에서는 다시 256MB로 blocksize가 맞춰지는 것으로 확인했고 이대로 넘어가려고 한다.
정리하면 큰 문제가 없으면
hadoop distcp -update -skipcrccheck $source $target 으로 하자!