빅데이터 처리를 위한 분산 파일 시스템 HDF

posted Feb 20, 2018, 11:21 PM by laputa99999@gmail.com
IoT와 같은 외부 데이터셋을 BIM과 연계할 때 빅데이터 분산 저장/관리 아키텍처를 고려하지 않을 수 없다. 이 글은 연구적인 목적에서 대표적인 분산 파일 시스템인 HDF(Hierarchical Data Format) 개념, 구조, 사용 방법을 간략히 요약한 것이다. 

개요
HDF는 다양한 크기와 복잡성을 가진 데이터 집합을 관리하기 위해 개발된 오픈소스 기술이다. 현재 HDF5 버전이 활용되고 있으며, 빅 데이터, 다양한 시스템, 유연성, 효율적인 입출력(I/O) 등을 지원한다. 

HDF5는 XML과 유사한 자기 기술(self-describing) 메타 정보가 포함되어 있다. HDF5는 바이너리 데이터를 포함할 수 있고, 파일의 특정 부분만 직접 접근이 가능하다.

HDF5는 계층적 데이터 객체를 자연스러운 방식으로 지원한다. 이 파일 안에는 관계형 데이터베이스 테이블도 포함가능하다. HDF5는 n차원 데이터셋을 지원한다. 

데이터 모델은 HDF5 Abstract Data Model(ADM)으로 추상화되어, 컨테이너로 관리, 구조화된다. 컨테이너는 이미지, 테이블, 문서, PDF, Excel과 같은 이기종 데이터(heterogeneous data)를 관리할 수 있다. 
데이터 모델
HDF5 Data Model은 크게 두 가지 종류의 객체로 구분된다. 
  • 그룹(group): 데이터 셋 인스턴스 구조를 그룹핑함. 메타 데이터 지원.
  • 데이터셋(dataset): 다차원 배열 등 데이터 관리. 메타 데이터 지원.
그룹과 데이터셋이 작업하는 방식은 유닉스 파일 시스템과 유사한 방식으로 접근 가능하다.

데이터셋은 행(raw) 데이터를 구조화해 관리한다. 데이터는 메타데이터를 다음과 같이 포함하고 있다. 
데이터 타입은 정수형, 실수형과 같이 데이터셋의 각 데이터 요소 크기와 유형을 정의한 것이다. 사전 정의된 데이터타입은 H5T_ARCH_BASE 형태로 기호화되어 표준 정의되어 있다. 예를 들면 다음과 같다. 
  • H5T_IEEE_F32BE: 32비트 빅 인디안 실수형 float 유형
  • H5T_STD_I8LE: STD는 semi-standard 데이터유형으로 I8LE는 8비트 little endian integer의 약자이다. 
  • H5T_C_S1: C는 언어에서 사용하는 방식, S1은 한 문자열을 의미한다.
데이터 유형은 다음과 같다.
  • Integer – twos complement integers
  • Float – floating point numbers
  • Character – array of 1-byte character encoding
  • Variable-length sequence types
  • Reference – a reference to another object or dataset region within the HDF5 file
  • Enumeration – a list of discrete values with symbolic names
  • Opaque – uninterpreted (by HDF5)
  • Compound (similar to C structs) – a datatype of a sequence of datatypes
  • User-defined (eg, 13-bit integer or fixed/variable length strings)
복합 데이터 유형은 C언어의 구조체와 같은 개념으로 정수형(int16), 문자(char), 정수형(int32), 실수형 배열(2x3x2) 구조체 유형을 데이터 유형으로 정의할 수 있다.

데이터공간(data space)는 다차원 공간 정보를 저장/관리하고, 어플리케이션 데이터 버퍼를 기술하는 역할을 가진다. 

특성과 속성
HDF5 객체 특징 중 하나는 특성(property)이다. 여러가지 디폴트 특성이 있는 데, 데이터셋의 저장 레이아웃을 정의하는 contiguous(default), chunked, chunked & compressed 등이 이런 특성 중 하나이다. 


속성(attributes)는 HDF5 객체와 연관될 수 있는 옵션이다. 속성은 이름과 값 쌍으로 구성된다.  

HDF5 소프트웨어
HDF5 소프트웨어 도구는 C, C++로 개발되었다. 커맨드 라인 유틸리티, 스크립트, 예제 파일 등이 포함되어 있다. 
HDF5 라이브러리
HDF5는 다양한 라이브러리와 API를 지원한다. 
  • H5A Attribute Interface
  • H5D Dataset Interface
  • H5F File Interface
  • H5G Group Interface
  • H5L Link Interface
  • H5O Object Interface
  • H5P Property List Interface
  • H5S DataSpace Interface
  • H5T DataType Interface
아울러, 다양한 이기종 데이터 입출력을 지원하는 API도 다음과 같이 준비되어 있다. 
  • HDF5 Lite (H5LT) – simplifies steps in creating datasets and attributes
  • HDF5 Image (H5IM) – defines a standard for storing images in HDF5
  • HDF5 Table (H5TB) – condenses the steps required to create tables
  • HDF5 Dimension Scales (H5DS) – provides a standard for dimension scale storage
  • HDF5 Packet Table (H5PT) – provides a standard for storing packet data
HDF5 레이어
레이어 구조는 다음과 같다. 

도구
h5dump는 HDF5 파일 구조와 내용을 디스플레이한다. -H는 헤더 정보, -d는 데이터셋, -p는 특성, -n은 데이터 구조를 출력한다. 

h5cc, h5c++, h5fc는 어플리케이션 컴파일 스크립트이다. h5cc는 c소스에 활용된 HDF API의 라이브러리나 헤더를 별도 지정하지 않아도 컴파일해주는 유틸리티이다. 
HDFView는 HDF파일을 뷰잉하는 브라우저이다. 

작업 방법
보통, HDF5 파일 작업방법은 객체를 열고, 접근하고, 닫는 구조이다. 이를 위해, 다음과 같은 함수를 지원한다. 

File Interface: H5Fopen (C) 
Dataset Interface: H5Dopen (C) 
Dataspace interface: H5Sclose (C) 

H5Fopen 결과로 hid_t 객체핸들을 리턴한다. 함수를 사용하기 위해, 다음 파일을 포함해야 한다. 

Python: Add “import h5py” / “import numpy”
C: Add “#include hdf5.h”

다음 코드는 이를 활용한 예이다. 

import h5py
file = h5py.File (‘file.h5’, ‘w’)
file.close ()

C언어는 다음과 같다. 

#include “hdf5.h”
int main() {
 hid_t file_id;
 herr_t status;
 file_id = H5Fcreate ("file.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
 status = H5Fclose (file_id);
}

이 결과 다음과 같은 파일이 생성된다 

데이터셋을 생성하기 위해서, datatype, dataspace, properties를 정의해야 한다. 

dataset = file.create_dataset("dset",(4, 6), h5py.h5t.STD_I32BE)

파일을 읽고 쓰는 것은 다음과 같다. 

data = np.zeros((4,6))
 for i in range(4):
   for j in range(6):
     data[i][j]= i*6+j+1
   dataset[...] = data 
 data_read = dataset[...]

그룹 생성은 다음과 같다. 

import h5py
file = h5py.File('dset.h5', 'r+')
group = file.create_group ('MyGroup')
file.close()

그룹은 다음과 같이 계층적으로 추가할 수 있다. 

속성은 다음과 같이 추가할 수 있다. 

dataset.attrs["Units"] = “Meters per second” 
attr_data = np.zeros((2,))
attr_data[0] = 100
attr_data[1] = 200
dataset.attrs.create("Speed", attr_data, (2,), “i”) 

Subsetting 기능으로 데이터 셋 입출력시 파라메터를 설정할 수 있다. 압축은 이 튜토리얼을 참고한다. 

레퍼런스

Comments