본문 바로가기
프로그래밍/hadoop

HDFS 데이터를 REMOTE HDFS로 COPY 할 때

by W.C. 2018. 11. 15.
728x90


hadoop distcp <src> <dist>

위와 같은 명령을 쓰면 일반적으로 복사가 된다. 하지만 잘 복사하다가 가끔 문제가 생긴다.

Error: java.io.IOException: File copy failed: hdfs://devnodem:8020/apps/hive/warehouse/logdata.db/onenavi_logtext_kt/dt=2017-07-21/000035_0 --> hdfs://10.10.82.223:8020/apps/hive/warehouse/logdata.db/onenavi_logtext_kt/dt=2017-07-21/000035_0
    at org.apache.hadoop.tools.mapred.CopyMapper.copyFileWithRetry(CopyMapper.java:287)
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:255)
    at org.apache.hadoop.tools.mapred.CopyMapper.map(CopyMapper.java:52)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164)

위 문제는 checksum 체크 시 발생한다.

아무리 환경이 똑같다고 해도 checksum은 해당 서버의 환경에 따라 생성되기 때문에 당연히 일치 하지 않는 문제가 발생한다.

그럴 경우에는

hadoop distcp -skipcrccheck -update src dest

이런 식으로 checksum을 skip 해주면 된다.

copy 이후 partition 테이블의 경우 partition을 인식하지 못하여(단순 copy이기 때문)에 데이터를 읽을 수 없다.

그럴땐 hive cli에 접속하여

msck repair table <dst table>

해주면 된다.