터칭 데이터

Hive - 메타스토어 사용하기 본문

하둡과 Spark

Hive - 메타스토어 사용하기

터칭 데이터 2024. 1. 18. 22:34

 

 

Contents

 

1. Spark SQL 소개

 

2. Aggregation, JOIN, UDF

 

3. Spark SQL 실습

 

4. Hive 메타스토어 사용하기

 

5. 유닛 테스트

 

 

 

 

 

 

 

 

 

 

 

Hive 메타 스토어 사용하기


Hive 메타스토어를 사용하는 방법을 알아보자

 

 

 

 

 

Spark 데이터베이스와 테이블 (1)

 

카탈로그: 테이블과 뷰에 관한 메타 데이터 관리

● 기본으로 메모리 기반 카탈로그 제공 - 세션이 끝나면 사라짐
● Hive와 호환되는 카탈로그 제공 - Persistent

 

테이블 관리 방식

● 테이블들은 데이터베이스라 부르는 폴더와 같은 구조로 관리 (2단계)

 

 

 

 

 

 

 

 

 

 

 

 

Spark 데이터베이스와 테이블 (2)

 

메모리 기반 테이블/뷰:

● 임시 테이블로 앞서 사용해봤음

 

스토리지 기반 테이블

● 기본적으로 HDFS와 Parquet 포맷을 사용
● Hive와 호환되는 메타스토어 사용
● 두 종류의 테이블이 존재 (Hive와 동일한 개념)
    ▪ Managed Table
        • Spark이 실제 데이터와 메타 데이터 모두 관리
    ▪ Unmanaged (External) Table
        • Spark이 메타 데이터만 관리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spark SQL - 스토리지 기반 카탈로그 사용 방법

 

Hive와 호환되는 메타스토어 사용

 

SparkSession 생성시 enableHiveSupport() 호출

● 기본으로 “default”라는 이름의 데이터베이스 생성

 

 

from pyspark.sql import SparkSession

spark = SparkSession \
 .builder \
 .appName("Python Spark Hive") \
 .enableHiveSupport() \
 .getOrCreate()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spark SQL - Managed Table 사용 방법

Managed 테이블이 성능이나 여러 측면에서 더 좋기 때문에 사용이 더 권장되며 어쩔 수 없을 때는 Unmanaged (External) Table을 사용합니다.

 

두 가지 테이블 생성방법

● dataframe.saveAsTable("테이블이름")
● SQL 문법 사용 (CREATE TABLE, CTAS)

 

spark.sql.warehouse.dir가 가리키는 위치에 데이터가 저장됨

● PARQUET이 기본 데이터 포맷

 

선호하는 테이블 타입

 

Spark 테이블로 처리하는 것의 장점 (파일로 저장하는 것과 비교시)

● JDBC/ODBC등으로 Spark을 연결해서 접근 가능 (태블로, 파워BI)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spark SQL - External Table 사용 방법

 

이미 HDFS에 존재하는 데이터에 스키마를 정의해서 사용

● LOCATION이란 프로퍼티 사용


메타데이터만 카탈로그에 기록됨

● 데이터는 이미 존재.
● External Table은 삭제되어도 데이터는 그대로임

 

 

CREATE TABLE table_name (
 column1 type1,
 column2 type2,
 column3 type3,
 …
)
USING PARQUET
LOCATION 'hdfs_path';

 

 

 

 

 

 

 

 

 

Spark 데이터베이스/테이블 실습

 

DataFrame을 Managed Table로 저장하기

 

“default”말고 새로운 데이터베이스 사용해보기

 

Spark SQL로 Managed Table 사용해보기 (CTAS)

 

 

 

 

 

 

 

 

 

실습

 

 

 

!pip install pyspark==3.3.1 py4j==0.10.9.5

 

 

 

!wget https://s3-geospatial.s3.us-west-2.amazonaws.com/orders.csv

 

 

 

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark Hive") \
    .enableHiveSupport() \
    .getOrCreate()

 

Hive 메타 스토어 사용을 위해 enableHiveSupport() 사용

 

 

 

!ls -tl

 

sample_data는 colab이 기본적으로 제공하는 디렉토리입니다.

 

 

 

 

 

 

# Read in data and create a DataFrame
df = spark.read.csv("orders.csv", inferSchema=True, header=True, sep ='\t')

 

df.show(5)

 

 

 

 

spark.sql("CREATE DATABASE IF NOT EXISTS TEST_DB")
spark.sql("USE TEST_DB")

 

 

spark.sql("SHOW DATABASES").show()

 

 

 

 

 

!ls -tl

 

지금 우리는 LocalStandalone Spark을 사용 중이기 때문에 HDFS가 따로 없고 로컬 디스크를 HDFS처럼 사용합니다.

 

metastore_db이 바로 Spark 메타 스토어가 되고 Hive 메타 스토어와 호환이 됩니다.

 

spark-warehouse가 바로 HDFS의 폴더에 해당합니다. Spark에서 Managed 테이블을 만들면 그 테이블의 데이터들이 spark-warehouse에 저장됩니다.

 

 

 

 

 

 

 

df.write.saveAsTable("TEST_DB.orders", mode="overwrite")

 

TEST_DB 데이터 베이스의 orders라는 테이블로 df DataFrame을 저장합니다. 위에서 USE TEST_DB 쿼리를 사용했으므로 굳이 TEST_DB.을 사용할 필요는 없습니다.

 

!ls -tl spark-warehouse/test_db.db/orders/

 

파일이 생성 되었고 parquet 포맷을 사용 중입니다.

 

 

 

 

 

spark.sql("SELECT * FROM TEST_DB.orders").show(5)

 

spark.table("TEST_DB.orders").show(5)

 

 

spark.sql이나 spark.table이나 2개는 결과는 똑같습니다.

 

 

 

 

 

 

 

 

!ls -tl metastore_db/

 

metastore_db 안의 내용은 이해하기 힘들겠지만 이런 내용이 있다 정도로만 봐주세요.

 

 

 

 

spark.catalog.listTables()

 

이제는 인 메모리가 아닌 HDFS에 영구적으로 저장되는 메타스토어이므로 MANAGED타입에 isTemporary 여부가 False입니다.

 

 

 

 

 

 

 

spark.sql("""
    DROP TABLE IF EXISTS TEST_DB.orders_count;
""")

 

혹시 테이블이 존재하지 않는 경우 에러가 발생하지 않게 DROP 테이블시 IF EXISTS를 사용하는 문법입니다.

 

 

spark.sql("""
    CREATE TABLE TEST_DB.orders_count AS 
    SELECT order_id, COUNT(1) as count 
    FROM TEST_DB.orders
    GROUP BY 1""")

 

 

 

 

 

 

 

spark.catalog.listTables()

 

 

!ls -tl spark-warehouse/test_db.db/

 

 

 

 

 

 

spark.sql("SELECT * FROM test_db.orders_count LIMIT 10").show()

 

 

 

 

 

 

'하둡과 Spark' 카테고리의 다른 글

요약  (0) 2024.01.19
유닛테스트  (0) 2024.01.18
Spark SQL 실습 1 (JOIN)  (0) 2024.01.18
UDF 실습  (0) 2024.01.18
UDF(User Defined Function)  (0) 2024.01.18