다중 Apache Hadoop 분산 파일 시스템(HDFS) 클러스터와 같은 고유한 스토리지 시스템 간에 또는 HDFS와 Cloud Storage 간에 데이터를 복사하거나 이동할 때는 데이터 무결성을 보장하기 위해 몇 가지 유형의 유효성 검사를 수행하는 것이 좋습니다. 이 유효성 검사는 전송 중에 데이터가 변경되지 않았음을 확인하는 데 필수적입니다.
이미 전송 중인 데이터의 지점 간 무결성을 보장하는 다양한 메커니즘이 있지만(예: Cloud Storage와의 모든 통신에 사용되는 TLS) 명시적인 엔드 투 엔드 데이터 무결성 유효성 검사를 수행하면 일반 전송 시 메커니즘에서 감지되지 않을 수 있는 경우를 방지할 수 있습니다. 노이즈가 많은 네트워크 링크, 경로에 있는 서버 컴퓨터와 라우터의 메모리 오류, 소프트웨어 버그(예: 고객이 사용하는 라이브러리에서) 등으로 인한 잠재적 데이터 손상을 감지하는 데 유용할 수 있습니다.
Cloud Storage의 경우 이 검사가 cp
및 rsync
와 같은 Google Cloud CLI 명령어로 클라이언트 측에서 자동으로 수행됩니다. 이러한 명령어는 로컬 파일의 체크섬을 계산한 후 각 작업이 끝날 때 Cloud Storage에서 계산된 체크섬과 비교해 유효성을 검사합니다. 체크섬이 일치하지 않으면 gcloud CLI가 잘못된 사본을 삭제하고 경고 메시지를 출력합니다. 이러한 불일치는 거의 발생하지 않으나 발생하더라도 작업을 재시도할 수 있습니다.
또한 HDFS 및 Cloud Storage와 같은 이기종 Hadoop 호환 파일 시스템의 Apache Hadoop에서 클라이언트 측 엔드 투 엔드 유효성 검사를 자동으로 수행하는 방법도 있습니다. 이 문서에서는 새로운 기능을 사용하여 파일 체크섬을 효율적으로 정확하게 비교하는 방법을 설명합니다.
HDFS에서 파일 체크섬 수행 방법
HDFS는 Castagnoli 다항식을 기반으로 하는 32비트 순환 중복 검사(CRC)인 CRC32C를 사용하여 서로 다른 컨텍스트에서 데이터 무결성을 유지합니다.
- 미사용 시 Hadoop DataNode는 데이터가 저장된 CRC와 지속적으로 비교 확인하여 bit-rot를 감지하고 복구합니다.
- 전송 중에는 DataNode가 해당하는 일괄 데이터와 함께 알려진 CRC를 전송하고, HDFS 클라이언트 라이브러리는 청크당 CRC를 공동으로 계산하여 DataNode에서 수신된 CRC와 비교합니다.
- HDFS 관리 목적으로 DataNode의 개별 블록 파일에 대한 하위 수준 수동 무결성 검사에는 블록 수준 체크섬이 사용됩니다.
- 임의의 애플리케이션 레이어 사용 사례에서
FileSystem
인터페이스는getFileChecksum
을 정의하고, HDFS 구현에서는 세분화되어 저장된 CRC를 사용하여 파일 수준 체크섬을 정의합니다.
대부분의 일상적인 용도에서 CRC는 애플리케이션 레이어와 관련하여 투명하게 사용됩니다. 사용되는 유일한 CRC는 블록 데이터와 함께 이미 사전 계산되어 메타데이터 파일에 저장된 청크당 CRC32C입니다. 청크 크기는 dfs.bytes-per-checksum
으로 정의되며 기본값은 512바이트입니다.
Hadoop 기본 파일 체크섬 유형의 단점
기본적으로 Hadoop을 사용할 때 모든 API 노출 체크섬은 블록 수준에서 하위 수준 DataTransferProtocol
을 통해 또는 파일 수준에서 최상위 수준 FileSystem
인터페이스를 통해 청크 CRC32C를 연결한 MD5 형태를 취합니다. 파일 수준 체크섬은 모든 블록 체크섬을 연결한 MD5로 정의되며 이들은 각각 청크 CRC를 연결한 MD5이며, MD5MD5CRC32FileChecksum
이라고 합니다. 이 형태는 3개의 레이어로 구성된 주문형 Merkle 트리라 할 수 있습니다.
이러한 파일 수준 체크섬 정의는 HDFS의 구현 및 데이터 레이아웃 세부정보, 즉 청크 크기(기본값 512바이트)와 블록 크기(기본값 128MB)에 민감합니다. 따라서 다음 상황에서는 이 기본 파일 체크섬이 적합하지 않습니다.
- HDFS에 같은 파일의 서로 다른 사본이 두 개 있지만 파일당 블록 크기가 서로 다르게 구성되어 있습니다.
- 서로 다른 HDFS 인스턴스 두 개에 블록 크기 또는 청크 크기가 서로 다르게 구성되어 있습니다.
- HDFS 및 Cloud Storage와 같은 비HDFS Hadoop 호환 파일 시스템(HCFS)이 조합되어 있습니다.
다음 다이어그램은 파일 시스템 구성에 따라 같은 파일이 다른 체크섬을 가지는 경우를 보여줍니다.
Hadoop fs -checksum
명령어를 사용하면 HDFS에 있는 파일의 기본 체크섬을 표시할 수 있습니다.
hadoop fs -checksum hdfs:///user/bob/data.bin
블록 크기가 64MB인 HDFS 클러스터(dfs.block.size=67108864
)에서 이 명령어는 다음과 같은 결과를 표시합니다.
hdfs:///user/bob/data.bin MD5-of-131072MD5-of-512CRC32C 000002000000000000020000e9378baa1b8599e50cca212ccec2f8b7
블록 크기가 128MB(dfs.block.size=134217728
)인 다른 클러스터의 같은 파일에서는 다른 출력이 표시됩니다.
hdfs:///user/bob/data.bin MD5-of-0MD5-of-512CRC32C 000002000000000000000000d3a7bae0b5200ed6707803a3911959f9
이 예에서 같은 파일의 두 체크섬이 서로 다르다는 점을 확인할 수 있습니다.
Hadoop의 새로운 복합 CRC 파일 체크섬 작동 방법
이러한 단점을 해결하기 위해 HDFS-13056에서 다루는 새로운 체크섬 유형이 Apache Hadoop 3.1.1에서 출시되었습니다. dfs.checksum.combine.mode=COMPOSITE_CRC
에서 구성된 새 유형은 새로운 복합 블록 CRC와 복합 파일 CRC를 저장된 청크 CRC에서 수학적으로 구성된 CRC로 정의합니다. 구성요소 CRC의 MD5를 사용하는 대신 이 유형을 사용하면 전체 블록 또는 파일을 나타내고 청크 CRC의 하위 수준 세분성과 무관한 단일 CRC가 계산됩니다.
CRC 구성에는 많은 이점이 있습니다. 효율적이고, 생성된 체크섬에 청크/블록에 따른 제약이 전혀 없으며, 스트라이핑된 파일과 복제된 파일 간, 서로 다른 HDFS 인스턴스 간, HDFS와 기타 외부 스토리지 시스템 간의 비교가 가능합니다. 이 PDF를 다운로드하여 CRC 알고리즘에 대한 자세한 내용을 자세히 알아보세요.
다음 다이어그램에서는 파일이 이기종 파일 시스템 구성 간에 전송된 후의 파일 체크섬 일관성 상태를 보여줍니다.
이 기능은 최소 침습적이므로 기존 블록 메타데이터와 호환되도록 추가될 수 있으며 일반적인 청크 확인 경로를 변경할 필요가 없습니다. 즉, 기존의 대규모 HDFS 배포에도 이 기능을 적용해 데이터를 소급하여 동기화할 수도 있음을 의미합니다. 전체 설계 PDF 문서를 다운로드하여 자세한 내용을 확인하세요.
새로운 복합 CRC 체크섬 유형 사용
Hadoop에서 새로운 복합 CRC 체크섬 유형을 사용하려면 dfs.checksum.combine.mode
속성을 (기본값 MD5MD5CRC
대신) COMPOSITE_CRC
로 설정합니다. 파일을 한 위치에서 다른 위치로 복사할 때 청크 수준의 체크섬 유형(즉, 기본값이 CRC32C
인 dfs.checksum.type
속성)도 두 위치 모두에서 일치해야 합니다.
-Ddfs.checksum.combine.mode=COMPOSITE_CRC
인수를 Hadoop fs -checksum
명령어에 전달하여 HDFS에 있는 파일의 새 체크섬 유형을 표시할 수 있습니다.
hadoop fs -Ddfs.checksum.combine.mode=COMPOSITE_CRC -checksum hdfs:///user/bob/data.bin
HDFS 클러스터의 블록 크기 구성에 관계없이 다음과 같은 출력이 표시됩니다.
hdfs:///user/bob/data.bin COMPOSITE-CRC32C c517d290
또한 Cloud Storage에서는 Cloud Storage 커넥터 속성 fs.gs.checksum.type
을 CRC32C
로 명시적으로 설정해야 합니다. 그렇지 않으면 이 속성이 기본값 NONE
으로 설정되어 파일 체크섬이 기본적으로 사용 중지됩니다. Cloud Storage 커넥터의 이러한 기본 동작은 체크섬 유형이 불일치할 때 실패하지 않고 예외가 발생하는 distcp
와 관련된 문제를 방지하기 위한 예방 조치입니다. 명령어는 다음과 같습니다.
hadoop fs -Ddfs.checksum.combine.mode=COMPOSITE_CRC -Dfs.gs.checksum.type=CRC32C -checksum gs://[BUCKET]/user/bob/data.bin
이 명령어는 HDFS의 이전 예와 같은 출력을 표시합니다.
gs://[BUCKET]/user/bob/data.bin COMPOSITE-CRC32C c517d290
이전 명령어에서 반환된 복합 CRC 체크섬이 블록 크기에 상관없이 HDFS와 Cloud Storage 사이에서 모두 일치하는 것을 확인할 수 있습니다. 이제 복합 CRC 체크섬을 사용하면 모든 유형의 Hadoop 클러스터 구성 사이에서 파일을 전송할 때 데이터 무결성이 유지되도록 보장할 수 있습니다.
다음 예시와 같이 distcp
를 실행하면 유효성 검사가 자동으로 수행됩니다.
hadoop distcp -Ddfs.checksum.combine.mode=COMPOSITE_CRC -Dfs.gs.checksum.type=CRC32C hdfs:///user/bob/* gs://[BUCKET]/user/bob/
distcp
가 복사 중에 소스와 대상 사이에서 파일 체크섬 불일치를 감지하면 작업이 실패하고 경고가 반환됩니다.
기능 사용
새로운 복합 CRC 체크섬 기능은 Apache Hadoop 3.1.1(출시 노트 참조)에서 제공되며 버전 2.7, 2.8, 2.9를 대상으로 한 소급 적용이 예정되어 있습니다. 2018년 말부터 Cloud Dataproc 1.3의 하위 부 버전에 기본적으로 포함되어 있습니다.