1. 개요
Hive ACID 테이블은 업데이트를 수락하고, DML 작업을 삭제하는 트랜잭션을 지원합니다. ACID는 데이터베이스 트랜잭션의 네 가지 특성을 나타냅니다.
- 원자성(작업이 완전히 성공하거나 실패하고 부분 데이터를 남기지 않음)
- 일관성(일단 애플리케이션이 작업을 수행하면 모든 후속 작업에서 해당 작업의 결과를 볼 수 있음)
- 격리(한 사용자의 불완전한 작업이 다른 사용자에게 예기치 않은 부작용을 일으키지 않음)
- 내구성(한 번 작업이 완료되면 기계 또는 시스템 오류가 발생하더라도 보존됨)
버전 0.14부터 Hive는 트랜잭션을 사용하고, 트랜잭션 테이블을 생성하고, 테이블에서 삽입, 업데이트 및 삭제와 같은 쿼리를 실행할 수 있도록 하는 모든 ACID
속성을 지원합니다.
Hive ACID 테이블의 기초가 되는 파일은 ORC ACID 버전입니다. ACID 기능을 지원하기 위해 Hive는 테이블 데이터를 기본 파일 세트에 저장하고 모든 삽입, 업데이트 및 삭제 작업 데이터를 델타 파일에 저장합니다. 읽을 때 리더는 기본 파일과 델타 파일을 모두 병합하여 최신 데이터를 표시합니다. 작업이 테이블을 수정함에 따라 많은 델타 파일이 생성되고 적절한 성능을 유지하려면 압축해야 합니다.
압축에는 마이너와 메이저의 두 가지 유형이 있습니다.
- 마이너 압축은 기존 델타 파일 세트를 가져와 버킷당 단일 델타 파일에 다시 씁니다.
- 메이저 압축은 하나 이상의 델타 파일과 버킷의 기본 파일을 가져와 버킷당 새 기본 파일에 다시 씁니다. 메이저 압축은 더 비싸지 만 더 효과적입니다.
조직은 자동 압축을 구성하지만 자동화 실패 시 수동 압축도 수행해야 합니다. 실패 후 오랜 시간 압축을 하지 않으면 작은 델타 파일이 많이 생깁니다. 이러한 많은 수의 작은 델타 파일에서 압축을 실행하면 리소스를 많이 사용하는 작업이 될 수 있으며 오류가 발생할 수도 있습니다.
Hive ACID 테이블의 몇 가지 문제는 다음과 같습니다.
- 작은 델타 파일로 인한 NameNode 용량 문제.
- 압축 중 테이블 잠금.
- Hive ACID 테이블에서 메이저 압축을 실행하는 것은 리소스를 많이 사용.
- 작은 파일로 인해 데이터를 DR로 복제하는 데 더 오랜 시간이 걸립니다.
2. Hive ACID를 BigQuery로 마이그레이션할 때의 이점
Hive ACID 테이블을 BigQuety로 마이그레이션하면 다음과 같은 이점이 있습니다.
- 테이터가 관리형 BigQuery 테이블에 로드되면 BigQuery는 내부 저장소에 저장된 데이터를 관리 및 최적화하고 압축을 처리합니다. 따라서 Hive ACID 테이블에서와 같이 작은 파일 문제가 발생하지 않습니다.
- BigQuery storage read API는 gRPC 기반이고 고도로 병렬화되므로 잠금 문제는 여기에서 해결됩니다.
ORC 파일은 완전히 자체 기술되므로, Hive Hive Transitore DDL에 의존하지 않습니다. BigQuery에는 ORC 파일에서 스키마를 추론할 수 있는 내장 스키마 추론
기능이 있으며 스키마 추론을 수행하기 위해 Apache Spark와 같은 도구를 사용할
필요 없이 스키마 진화를 지원합니다.
3. Hive ACID 테이블 구조 및 샘플 데이터
다음은 샘플 Hive ACID 테이블 “employee_trans” 스키마입니다.
hive> show create table employee_trans;
OK
CREATE TABLE `employee_trans`(
`id` int,
`name` string,
`age` int,
`gender` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans'
TBLPROPERTIES (
'bucketing_version'='2',
'transactional'='true',
'transactional_properties'='default',
'transient_lastDdlTime'='1657906607')
이 샘플 ACID 테이블 “employee_trans”에는 3개의 레코드가 있습니다.
hive> select * from employee_trans;
OK
1 James 30 M
3 Jeff 45 M
2 Ann 40 F
Time taken: 0.1 seconds, Fetched: 3 row(s)
모든 삽입, 업데이트 및 삭제 작업에 대해 작은 델타 파일이 생성됩니다. 이것은 Hive ACID 사용 테이블의 기본 디렉토리 구조입니다.
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delete_delta_0000005_0000005_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delete_delta_0000006_0000006_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delta_0000001_0000001_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delta_0000002_0000002_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delta_0000003_0000003_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delta_0000004_0000004_0000
hdfs://hive-cluster-m/user/hive/warehouse/aciddb.db/employee_trans/delta_0000005_0000005_0000
ACID 테이블의 이러한 OCR 파일은 여러 열로 확장됩니다.
struct<
operation: int,
originalTransaction: bigInt,
bucket: int,
rowId: bigInt,
currentTransaction: bigInt,
row: struct<...>
>
4. Hive ACID 테이블을 BigQuery로 마이그레이션하는 단계
1) 기본 Hive 테이블 HDFS 데이터 마이그레이션
GCS의 employee_trans hdfs 디렉토리 및 스테이지에 있는 파일을 복사합니다.
HDFS2GCS 솔루션 또는 Distcp 를 사용할 수 있습니다 . HDFS2GCS 솔루션은 오픈 소스 기술을 사용하여 데이터를 전송하고 상태 보고, 오류 처리, 내결함성, 증분/델타 로딩, 속도 조절, 시작/중지, 유효성 검사, byte2byte 비교 등과 같은 여러 이점을 제공합니다. HDFS2GCS 솔루션. 이 도구에 대한 자세한 내용은 공개 github URL HDFS2GCS 를 참조하십시오.
원본 위치에는 복사하고 싶지 않은 추가 파일이 포함될 수 있습니다. 여기에서 정규식을 기반으로 하는 필터를 사용하여 확장자가 .ORC인 파일만 복사하는 것과 같은 작업을 수행할 수 있습니다.

2) BigQuery에 ACID 테이블을 있는 그대로 로드
기본 Hive acid 테이블 파일이 GCS에 복사되면 BQ 로드 도구를 사용하여 BigQuery 기본 테이블에 데이터를 로드합니다. 이 기본 테이블에는 모든 변경 이벤트가 있습니다.

3) 데이터 검증
기본 테이블에서 “select *”를 실행하여 모든 변경 사항이 캡처되었는지 확인합니다.
참고 : “select * …”의 사용은 데모 목적으로 사용되며 명시된 모범 사례가 아닙니다.

4) 대상 BigQuery 테이블에 로드
다음 쿼리는 중간 삭제 및 업데이트 작업을 삭제하여 기본 테이블에서 모든 레코드의 최신 버전만 선택합니다.
덮어쓰기 옵션과 함께 주문형 예약 쿼리를 사용하여 이 쿼리의 결과를 대상 테이블에 로드하거나 또는 이 쿼리를 기본 테이블의 보기로 생성하여 기본 테이블에서 직접 최신 레코드를 가져올 수도 있습니다.
WITH
latest_records_desc AS (
SELECT
Row.*,
operation,
ROW_NUMBER() OVER (PARTITION BY originalTransaction ORDER BY originalTransaction ASC, bucket ASC, rowId ASC, currentTransaction DESC) AS rownum
FROM
`hiveacid-sandbox.hivetobq.basetable` )
SELECT id,name,age,gender
FROM
latest_records_desc
WHERE
rownum=1
AND operation != 2

데이터가 대상 BigQuey 테이블에 로드되면 아래 단계를 사용하여 유효성 검사를 수행할 수 있습니다.
(1) 데이터 유효성 검사 도구를 사용하여 Hive ACID 테이블과 대상 BigQuery 테이블의 유효성을 검증합니다. DVT는 스키마 및 유효성 검사 작업을 수행할 수 있는 자동화되고 반복 가능한 솔루션을 제공합니다. 이 도구는 다음 유효성 검사를 지원합니다.
- 열 유효성 검사(count, sum, avg, min, max, group by)
- 행 유효성 검사(BQ, Hive 및 Teradata만 해당)
- 스키마 유효성 검사
- 사용자 정의 쿼리 유효성 검사
- 임시 SQL 탐색
(2) ACID 테이블에서 실행 중인 분석 HiveQL이 있는 경우 BigQuery SQL 변환 서비스 를 사용하여 변환하고 대상 BigQuery 테이블을 가리킵니다.
5. Hive DDL 마이그레이션(선택사항)
ORC는 독립적이므로 로드할 때 BigQuery의 스키마 추론 기능을 활용하세요. Metastore에서 Hive DDL을 추출하는데 종속성이 없습니다. 그러나 마이그레이션 전에 데이터 세트와 테이블을 미리 생성하는 조직 차원의 정책이 있는 경우 이 단계가 유용할 것이며 좋은 출발점이 될 것입니다.
1) Hive ACID DDL 덤프를 추출하고 BigQuery 변환 서비스를 사용하여 변환하여 동등한 BigQuery DDL을 생성합니다.
구글 클라우드 스토리지의 소스 메타데이터 버킷에서 빅쿼리 관련 SQL로 내보낸 HQL(Hive Query Language) 스크립트를 대상 GCS 버킷으로 대량 변환하는 일괄 SQL 변환 서비스가 있습니다.
또한 여러 SQL 언어에 대한 실시간 SQL 변환 도구인 BigQuery 대화형 SQL 변환기를 사용하여 HQL 언어와 같은 쿼리를 BigQuery standard SQL 쿼리로 변환할 수 있습니다. 이 도구를 사용하면 SQL 워크로드를 BigQuery로 마이그레이션하는 데 드는 시간과 노력을 줄일 수 있습니다.
2) 변환된 DDL을 사용하여 관리형 BigQuery 테이블을 만듭니다.
다음은 BigQuery 콘솔의 변환 서비스 스크린샷입니다. HiveQL을 변환하려면 “변환”을 제출하고 쿼리를 실행하려면 “실행”을 제출하십시오. 일괄 변환된 대량 SQL 쿼리에서 테이블을 생성하려면 Airflow BigQuery 연산자(BigQueryInsertJobOperator)를 사용하여 여러 쿼리를 실행할 수 있습니다.

DDL이 변환된 후 ORC 파일을 GCS에 복사하고 BigQuery에서 ELT를 수행합니다. BigQuery로 마이그레이션할 때 Hive ACID 테이블의 문제점이 해결됩니다. ACID 테이블을 BigQuery로 마이그레이션하면 실시간 분석을 위해 BigQuery ML 및 GeoViz 기능을 활용할 수 있습니다.
출처
- https://cloud.google.com/blog/products/data-analytics/apache-hive-to-bigquery
- https://cwiki.apache.org/confluence/display/hive/hive+transactions
- https://orc.apache.org/docs/acid.html
- https://github.com/GoogleCloudPlatform/hdfs-to-gcs
- https://cloud.google.com/architecture/hadoop/hadoop-gcp-migration-data
- https://github.com/GoogleCloudPlatform/professional-services-data-validator
- https://cloud.google.com/bigquery/docs/batch-sql-translator