컬럼형 스토리지는 홈 센서 분석을 어떻게 가속할까요?

에바 왕기술 작가 그리고 이자 ZimaSpace의 상주 장인입니다. 평생을 기술에 열정을 가진 사람으로서 홈랩과 오픈소스 소프트웨어에 열정을 가지고 있으며,복잡한 기술 개념을 쉽게 이해할 수 있는 실습 가이드로 번역하는 데 전문성을 가지고 있습니다.에바는 셀프 호스팅이 어렵지 않고 재미있어야 한다고 믿습니다. 그녀의 튜토리얼을 통해 커뮤니티가 하드웨어 설정의 신비를 풀도록돕고 있습니다. 첫 NAS 구축부터 Docker 컨테이너 마스터링까지.

컬럼형 스토리지는 동일한 필드의 값을 함께 보관하여 분석 쿼리가 관련 없는 데이터를 읽지 않도록 함으로써 홈 센서 분석을 가속합니다.

스마트홈 이력 테이블에는 수백만 건의 관측 데이터에 걸쳐 타임스탬프, 디바이스 ID, 방, 온도, 습도, 전력, 움직임 상태, 배터리 잔량, 품질 플래그, 메타데이터 등이 포함될 수 있습니다. 대부분의 이력 관련 질문은 이러한 필드 중 일부만 사용하면서 많은 행을 집계합니다. 이는 완전한 최신 레코드 하나를 반복해서 가져오는 애플리케이션과는 거의 정반대입니다. 컬럼형 레이아웃은 실제로 읽어야 하는 데이터와 유사한 값으로 구성된 배치가 CPU에 전달되는 방식을 모두 바꾸어 이러한 스캔 및 집계 경로를 최적화합니다.

컬럼 레이아웃은 분석 쿼리에 실제로 필요한 필드를 분리합니다

행 지향 레코드는 하나의 관측값에 해당하는 모든 필드를 함께 보관하므로 애플리케이션이 해당 관측값 전체를 필요로 할 때 편리합니다. 반면 컬럼 지향 표현은 필드별로 값을 그룹화하므로, 6개월간의 온도 쿼리는 펌웨어 문자열, 배터리 데이터, 관련 없는 디바이스 상태를 동일한 스캔 과정에서 함께 가져오지 않고 타임스탬프, 방, 온도에 집중할 수 있습니다.

Apache Parquet은 대용량 데이터의 효율적인 저장과 검색을 위해 설계된 컬럼 지향 데이터 형식입니다. 이러한 물리적 분리는 동일한 논리 테이블을 전체 행으로 스캔하는 것보다 좁은 분석 쿼리가 더 적은 데이터를 이동시킬 수 있는 첫 번째 이유입니다.

레코드가 넓어지고 쿼리가 계속 선택적인 범위에 머물수록 이점은 커집니다. 홈 에너지 보고서는 수집 스키마에 대시보드와 디바이스 관리에 필요한 추가 필드가 많이 포함되어 있더라도 타임스탬프, 와트, 디바이스 ID만 사용할 수 있습니다.

프로젝션 및 필터 푸시다운은 불필요한 데이터가 스캔에 들어오는 것을 막습니다

컬럼 레이아웃은 사용하지 않는 필드를 건너뛸 수 있는 기반을 제공하지만, 스토리지 절감이 실제 I/O 절감으로 이어지려면 쿼리 엔진이 이러한 정보를 파일 리더까지 푸시다운해야 합니다. 모든 컬럼을 먼저 로드한 뒤 나중에 버린다면 물리적 형식이 제공하는 이점을 충분히 활용하지 못한 것입니다.

DuckDB는 Parquet을 읽을 때 프로젝션 및 필터 푸시다운을 적용할 수 있으므로 필요한 컬럼만 읽고 필터를 활용해 파일의 일부를 건너뛸 수 있습니다. 따라서 특정 방의 평균 습도를 구하는 쿼리는 전체 실행 전에 필드와 관련 행 범위를 모두 좁힐 수 있으며, 메타데이터가 이를 허용하는 경우 더욱 효과적입니다.

로컬 분석 서비스에서는 디스크 읽기, 압축 해제 작업, 메모리 트래픽, 연산자 간에 전달되는 중간 데이터의 양이 줄어듭니다. 요청한 필드가 저장된 스키마의 작은 일부인 긴 스캔에서 그 효과가 가장 큽니다.

모든 파이프라인에서 푸시다운이 자동으로 적용되는 것은 아닙니다. 데이터를 불투명한 변환으로 감싸거나 스토리지 계층에 조건식을 노출할 수 없는 리더를 사용하면 파일 형식 자체가 요구하는 것보다 더 많은 구체화 작업이 발생할 수 있습니다.

유사한 값을 함께 저장하면 인코더와 압축기가 더 나은 지역성을 확보합니다

센서 컬럼에는 반복되거나 천천히 변하는 값 패턴이 자주 나타납니다. 방 이름은 반복되고, 불리언 상태는 오랫동안 변하지 않으며, 타임스탬프는 단조롭게 증가하고, 온도는 좁은 숫자 범위에 분포합니다. 각 유형의 값을 함께 그룹화하면 모든 관측값의 모든 필드를 뒤섞는 것보다 인코더가 더 규칙적인 스트림을 처리할 수 있습니다.

Parquet은 인코딩된 데이터 페이지에 컬럼 페이지 압축을 지원하므로 각 컬럼 청크가 값을 인코딩한 후 압축 코덱을 사용할 수 있습니다. 압축률이 높아지면 홈 서버가 보관하고 이력 분석 중 읽어야 하는 바이트 수가 줄어듭니다.

압축률은 “컬럼형”이라는 말만으로 보장되는 것이 아니라 워크로드에 따라 달라집니다. 카디널리티가 높은 암호화 페이로드나 이미 압축된 바이너리 값은 이점이 거의 없을 수 있지만, 반복되는 레이블과 구조화된 숫자 시계열은 일반적으로 더 많은 중복성을 활용할 수 있습니다.

행 그룹 메타데이터를 사용하면 일치할 수 없는 범위를 리더가 건너뛸 수 있습니다

이력 쿼리에는 특정 날짜 범위, 특정 디바이스 유형, 임계값을 초과하는 측정값과 같은 선택적 조건이 자주 포함됩니다. 파일 수준 또는 행 그룹 메타데이터를 통해 어떤 영역도 조건을 만족할 수 없음이 확인된다면 해당 영역을 읽고 디코딩하는 것은 낭비입니다.

DuckDB는 필터 푸시다운 중 Parquet의 최솟값/최댓값 메타데이터를 존맵 기반 파일 건너뛰기에 사용할 수 있습니다. 또한 Parquet은 컬럼 청크에 특정 값이 존재할 가능성을 판단하는 데 도움이 되는 선택적 블룸 필터를 정의합니다. 이러한 구조는 로드한 뒤 일치하는 행의 계산을 더 저렴하게 만드는 것이 아니라, 명백히 관련 없는 범위를 피함으로써 쿼리를 가속합니다.

데이터 정렬 방식은 이러한 가지치기의 효과에 영향을 줍니다. 시간, 방, 디바이스를 기준으로 대략적으로 그룹화된 파일은 무작위로 뒤섞인 데이터보다 더 좁은 메타데이터 범위를 만들 수 있으므로, 합리적인 쓰기 레이아웃은 컬럼형 스토리지의 이점을 더욱 키울 수 있습니다.

메타데이터를 이용한 건너뛰기는 구조에 따라 확률적이거나 보수적으로 동작하며, 오탐으로 인해 추가 읽기가 발생할 수도 있습니다. 중요한 보장은 가지치기 과정에서 유효한 일치 항목을 포함할 수 있는 범위를 버려서는 안 된다는 점입니다.

컬럼형 배치는 벡터화된 CPU 실행에 적합합니다

선택한 컬럼이 메모리에 들어오면 분석 연산자는 여러 값에 동일한 계산을 반복 적용합니다. 여기에는 비교, 합계, 평균, 그룹화 키, 변환 등이 포함됩니다. 연속적으로 배치된 값은 CPU 캐시에 더 친화적이며 여러 값을 한 번에 처리하는 명령어에도 적합합니다.

Apache Arrow는 지역성을 개선하고 SIMD를 지원하는 프로세서에서 벡터화된 연산을 가능하게 하는 컬럼형 메모리 레이아웃을 설명합니다. 따라서 로컬 쿼리 엔진은 서로 다른 필드가 섞인 완전한 레코드를 행 단위로 반복해서 풀어내는 대신 온도나 전력 측정값을 배치 단위로 처리할 수 있습니다.

이 이점은 디스크 압축뿐 아니라 분석 실행 경로에도 적용됩니다. 빠른 SSD라도 CPU가 즉시 무시할 필드를 공급하는 데 불필요한 대역폭을 사용할 수 있지만, 컬럼형 파이프라인은 연산이 시작되기 전에 이러한 데이터 이동을 줄입니다.

컬럼형 스토리지는 자주 변경되는 최신 상태보다 이력 스캔에 더 적합합니다

광범위한 스캔에 효율적인 동일한 레이아웃이 빈번한 특정 위치 업데이트, 소규모 트랜잭션, 완전한 디바이스 상태 하나 가져오기에 항상 최적인 것은 아닙니다. 따라서 홈 오토메이션 제어와 장기 분석은 동일한 센서를 설명하더라도 서로 다른 스토리지 경로를 사용하는 편이 유리할 수 있습니다.

Arrow는 강력한 분석 지역성을 얻는 대신 변경 작업의 비용이 더 커지는 것을 명시적으로 감수합니다. 이는 더 넓은 경계를 보여 줍니다. 컬럼형 시스템은 많은 값을 함께 스캔할 때 뛰어난 반면, 작은 레코드를 지속적으로 다시 쓰는 작업에는 다른 구조가 더 적합할 수 있습니다.

실용적인 홈 스택에서는 현재 디바이스 상태를 행 지향 또는 상태 지향 데이터베이스에 보관하고, 이력 관측값을 주기적으로 분석용 컬럼형 파일에 기록할 수 있습니다. ZimaSpace가 제어와 로컬 분석을 분리하는 방식도 동일한 아키텍처 개념을 반영합니다. 실시간 이벤트에 대응해야 하는 경로가 수개월간의 과거 분석에 사용되는 물리적 데이터 레이아웃을 공유할 필요는 없습니다.

따라서 중요한 질문은 컬럼형 스토리지가 보편적으로 더 빠른지 여부가 아닙니다. 핵심은 주된 워크로드가 과거의 많은 행에서 일부 필드만 스캔하는지 여부입니다. 바로 이러한 액세스 패턴이 컬럼 분리를 통해 I/O를 줄이고 배치 처리를 더 효율적으로 만들기 때문입니다.

기술 및 AI 허브

더 읽어보기

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.