Data Engineering/Hive
[Hive] 기본 개념 정리
keyhong-DE
2023. 7. 1. 12:51
Hive
페이스북에서 개발한 Hadoop 기반의 데이터 웨어하우징 프레임워크
- 자바 프로그래밍은 부족하지만 강력한 SQL 기술을 가진 분석가를 위해 개발
- 복잡한 머신러닝 알고리즘을 구현하기에는 적합하지 않음
- MySQL에 사용하는 것처럼 HDFS 클러스터 전체에 걸쳐 저장된 데이터에 표준 SQL 쿼리를 실행
- SQL을 MapReduce나 TEZ 명령어로 번역하여 동작. 이 둘은 YARN 클러스터 관리자 위에서 실행
- Hive는 SQL 쿼리를 매퍼와 맵리듀스로 분해. 클러스터 전체에 걸쳐 어떻게 실행할지 알아냄
- 사용자 관점에서는 데이터 웨어하우스를 사용하는 것처럼 SQL 데이터베이스에 쿼리하는 것과 동일
- 이미 SQL에 익숙하고 데이터베이스나 데이터 웨어하우스에 경험이 있다면 아주 강력한 도구
Why Hive?
HiveQL은 SQL 문법과 친숙하다. SQL의 변형이고 MySQL 구문과 굉장히 비슷하다.
- Java에서 MapReduce를 작성하는 것보다 훨씬 쉽다.
- 상호적인 성격(interactive)을 띄고 있어, 대화형 명령 프롬프트를 사용한다.
확장과 축소가 가능
- 단일 호스트에 제한되는 전통적 DBMS와 달리 컴퓨터 클러스터 전체에 분배된 HDFS 데이터 사용한다.
- 대용량 데이터 세트에 쿼리를 실행하거나 Data Warehouse 유형의 애플리케이션에 유용한 도구이다.
OLAP(OnLine Analytics Processing)를 위한 것
- 단일 DBMS 인스턴스 보다 훨씬 큰 데이터를 빠르게 처리 가능하다.
- 즉각적인 대답은 아니지만, 상식적인 시간 내 결과 획득하다.
높은 확장성
- 사용자 정의 함수에 플러그인해 고유의 매퍼 생성 가능
- Thrift 서버를 활용해 외부에서도 사용자가 Hive와 소통 가능
- Hive에 JDBC나 ODBC 드라이버를 사용해 접근가능하며 다른 DBMS와 똑같아 보이도록 함
Why not Hive?
OLTP(OnLine Transaction Processing)를 위한 것이 아니다.
- 고 처리량 저 대기 시간을 원한다면 좋은 선택이 아니다. SQL 명령어를 MapReduce로 번역 해야 하기 때문에 시간이 소모된다.
- 비정규화 데이터를 사용한다.
- Hadoop에서의 데이터는 단순한 텍스트(string 타입) 파일이다.
- 연결된 별도의 테이블이나 키 등을 갖고 있지 않는다.
DB가 아니다. 내부적으로는 MapReduce이기 때문에 데이터가 실제로 처리되지 않는다.
- update, insert, delete 등의 트랜잭션이 기록되지 않는다. 내부적으로는 실제 데이터베이스가 없기 때문이다.
- 단지 매퍼와 리듀서를 통과하는 거대한 텍스트 파일만 존재
- HiveQL은 SQL의 변형이다.
- 일반적인 DB의 구체화뷰(Materialized View)와는 다르다.
- Hive에서의 view는 논리 구조이며 데이터를 실제로 저장하지는 않는다.
- 어떤 쿼리의 결과를 View에 저장하고, 그 View를 다음 쿼리의 테이블로 이용하는 등 연계해서 사용 가능하다. 하지만 너무 복잡한 쿼리를 해야 한다면 Pig나 Spark가 좀 더 적합하다.
- HiveQL은 데이터를 구조화하고 파티션을 나누어 저장하는 여러가지 옵션이 있어 데이터를 다양한 곳에서 사용 가능하다.
Conclusion
- MySQL에서 할 수 있는 것은 HiveQL에서도 할 수 있다.
- 쿼리를 실행한다고 실제로 저장되지는 않는다.
Hive Shell
Hive Shell은 HiveQL 명령어로 Hive와 상호작용하는 하이브의 기본 도구
- HiveQL은 SQL과 유사한 하이브의 질의 언어
- HiveQL은 MySQL에 큰 영향을 받아 MySQL에 익숙한 사용자라면 하이브가 친숙
Hive의 주요 네 가지 구성요소
HiveCLI
Hive CLI는 Input Command 를 받아들이고 파싱한다.
- adhoc 쿼리 (상황에 맞춰 동적으로 생성하여 사용하는 쿼리)를 수행하는 일반적인 방법
- Metastore에 대한 연결을 포함하여 Hive Client 또는 드라이버 애플리케이션이 로컬 시스템에 배포될 때 사용
- Beeline은 경량 CLI
- HiveServer2 라는 여러 Client를 위한 대규모 다중 세션 드라이버 응용 프로그램에 사용
- Beeline은 시각화 도구 등 외부 Client에서 사용할 수 있는 JDBC 인터페이스를 제공
Hive Driver Application
HiveQL parsing, 쿼리 실행 계획, 쿼리 작업을 Hadoop 에 제출, 쿼리 실행 진행률 모니터링 작업을 수행
Hive Object
Hive 는 HDFS의 Hive Object에 대한 Table 형식 추상화를 구현하여, 디렉토리와 파일 자체 모델의 Table로 표시
- 관계형 DB에서와 마찬가지로 Table에서는 DDL을 사용하여 생성된 지정 데이터 유형으로 미리 정의된 열이 존재
- HDFS의 데이터는 다른 DBMS와 마찬가지로 DML을 통해 액세스 가능
- Hive Object는 Database와 Table로 구성
- Hive Database : 조직, 권한 부여 및 네임스페이스 관리에 사용
- Hive Table : Hive Database에 존재
- RDBMS 와 Hive의 가장 큰 차이 : HDFS는 변경할 수 없는 파일 시스템으로 append, insert만 가능, update는 지원되지 않음 (Hadoop3부터는 update 지원)
Hive Metastore
Hive 메타데이터 중앙 저장소
- 기본 Database는 내장된 Derby DB를 사용
- MySQL 또는 PostgreSQL 과 같은 다른 DBMS를 로컬 DB 또는 원격 DB 설정 가능
- 대부분 경우 개발자와 다른 사람들이 Object 정의를 공유할 수 있도록 하는 공유 DB (Except) Input/Output Format 및 SerDes
- Hive는 InputFormat 및 SerDe를 사용하여 Input 파일을 읽고 처리를 위해 레코드를 추출하는 방법을 결정
Partitioning & Bucketing
Partitioning과 Bucketing은 쿼리 성능을 향상시키는 Hive 쿼리 최적화 기술
- 테이블에 더 많은 구조를 제공하고 더 나은 샘플링을 생성
Partitioning
데이터는 특정 조건을 충족하는 하위 디렉토리인 파티션으로 나눔
- 일반적으로 Table의 Where절에서 사용되는 하나 이상의 조건을 기반으로 데이터를 하위 디렉토리로 나눔
- 각 파티션에 대한 하위 디렉토리를 생성
Bucketing
Partition 또는 Table에서 각 버킷에 대한 별도의 데이터 파일을 생성
- ID 필드와 같이 대부분 고유한 값이 있는 경우 바람직
- 각 버킷에 전체 데이터 세트의 알려진 임의 비율이 포함되므로 무작위 샘플링에 유용