Distcp가 클러스터 간에 파일을 복사하지 못합니다. 원본과 대상이 블록 크기가 다릅니다. -pb를 사용하여 복사하는 동안 블록 크기를 유지합니다.

원인: java.io.IOException: hdfs://10.48.0.101/ucd-prod-vdp-usdp/user/hive/warehouse/ods.db/ods_dgs_dcs_tth_if_di/dt=20230716/000001_0과 hdfs:// 간의 체크섬 불일치 ucd-test-vdp-usdp/ucd-test-vdp-usdp/user/hive/warehouse/ods_prod.db/.distcp.tmp.attempt_1689578105872_1498_m_000017_2.1690257654635. 소스와 대상은 블록 크기가 다릅니다.
복사하는 동안 블록 크기를 보존하려면 -pb를 사용하십시오. 블록 크기 또는 파일 시스템이 다른 경우 -Ddfs.checksum.combine.mode=COMPOSITE_CRC를 통해 파일 수준 체크섬 유효성 검사를 선택할 수 있습니다. 또는 -skipcrccheck를 사용하여 체크섬 검사를 모두 건너뛸 수 있습니다.

여기에 이미지 설명 삽입

distcp 명령은 대용량 데이터 클러스터 간에 일반적으로 사용되는 데이터 복사 명령으로, 서로 다른 클러스터 간의 블록 크기 불일치로 인해 명령 실행이 실패하는 경우가 있습니다. 오류는 다음과 같습니다

원본과 대상의 블록 크기가 다름 복사 시 블록 크기를 유지하려면 -pb를 사용하십시오
1
원인 분석
Distcp는 기본적으로 파일을 복사할 때 원본 블록 크기를 기록하지 않으므로 원본 파일의 block.size가 128M.-pb 매개변수가 아닙니다.
1. HDFS는 쓰기 시 블록 크기를 설정하며 기본값은 128M이며 일부 구성 요소 또는 비즈니스 프로그램에서 작성된 파일은 8M과 같이 128M이 아닐 수 있습니다.


<name>dfs.blocksize</name>
<value>134217728</value>

图1 某些组件或者业务程序写入的文件大小

2.distcp 从源集群读文件后写入新集群,默认是使用的MapReduce任务中的dfs.blocksize,默认128M。
3.在distcp写完文件后,会基于块的物理大小做校验,因为该文件在新旧集群中block.size不一致,因此拆分大小不一致,导致校验失败。
如以上文件,在旧集群是17.9/8MB = 3个block, 在新集群 17.9/128M = 1个block. 因此实际在磁盘的物理大小因分割而导致校验失败。

解决办法
distcp时,在地址前增加-pb参数。该参数作用为distcp时候保留block大小,确保新集群写入文件blocksize和老集群一致。
distcp时保留block大小

추천

출처blog.csdn.net/qq_43688472/article/details/131924031