Dia Egg - Shugo Chara

Data/Databricks

Databricks란? 노트북, 카탈로그, 대시보드

별ㅇI 2025. 6. 6. 00:33
반응형

Azure Databricks란?

microsoft azure 클라우드에서 제공하는 앤터프라이즈급 데이터, 분석, AI 통합 플랫폼입니다.

Apache Spark 기반의 고성능 분석 엔진을 중심으로 모든 데이터 워크로드를 하나의 환경에서 처리할 수 있도록 설계된 데이터 레이크하우스 플랫폼이다. 경쟁툴로는 Snowflake,AWS Glue, google dataproc 등이 있다.

Apache Spark란?

Spark란 Single-node 또는 Cluster 위에서 Data Engineering, Data Science, Machine Learning을 수행할 수 있도록 도와주는 빅데이터 처리 및 분석을 위한 In-memory 기반의 통합 컴퓨팅 엔진이며, 데이터를 병렬로 처리하는 라이브러리 집합입니다.

클라우드 서비스(Cloud Service)

  • IaaS (Infrastructure as a Service): 서버, 디스크 등 인프라를 가상화해서 제공 (예: AWS EC2, Azure VM, GCP Compute Engine)
  • PaaS (Platform as a Service): 개발·운영에 필요한 플랫폼(컴퓨팅 엔진, 데이터베이스 등)을 제공 (예: Azure Databricks, Google BigQuery)
  • SaaS (Software as a Service): 완성된 소프트웨어를 서비스로 제공 (예: Gmail, Salesforce)

용어 정의 및 특징

Single-node 서버 한 대에서 모든 연산 수행이 수행되는 환경. 소규모, 테스트, 개발용.
Cluster 여러 대의 서버가 분산·병렬로 데이터 처리하도록 하는 분산환경. 대용량, 고성능, 엔터프라이즈 환경 필수.
컴퓨팅 엔진 데이터 처리·분석의 핵심 연산을 담당하는 소프트웨어의 심장.
병렬 처리 데이터를 여러 조각으로 나눠 여러 컴퓨터/코어가 동시에 처리. 속도와 확장성의 핵심.
In-memory 데이터를 디스크(HDD/SSD)가 아니라, RAM에 올려 초고속 처리. 반복 연산, 실시간 분석에 유리. 메모리 용량 한계 주의.

Spark와 Hadoop의 차이

구분 Hadoop (MapReduce) Spark

데이터 처리 방식 디스크 기반(파일 읽기/쓰기 반복) 인메모리(In-Memory) 기반
주요 구성 요소 HDFS, MapReduce, YARN RDD, DAG, Spark SQL, MLlib 등
작업 실행 방식 순차적 실행 (Map → Reduce 단계별 디스크 저장) 비순차적 병렬 실행, 중간 결과 메모리 저장
실시간 처리 부적합 (배치 처리 전용) 실시간/스트리밍/반복 연산 가능
언어 지원 주로 Java Scala, Java, Python, R 등 다양

Azure Databricks 작업영역 만들기

azure에 1dt016-dbgroup이라는 리소스 그룹안에 databricks-1dt016이라는 이름으로 databricks 작업영역을 만들어줬습니다.

추가적으로는 관리되는 리소스 그룹 이름으로 databricks-1dt016-managed를 잡았습니다. 이 추가적인 리소스 그룹이 필요한 이유는 둘의 역할을 비교해보면 알수 있습니다.

구분 일반 리소스 그룹 (예: 1dt016-dbgroup) 관리형 리소스 그룹 (예: databricks-1dt016-managed)

생성 주체 사용자가 직접 생성 Databricks 서비스가 자동 생성
관리 권한 사용자가 모든 리소스 직접 관리/수정/삭제 가능 사용자는 직접 수정/삭제 불가(시스템이 관리, 잠금(lock)됨)
포함 리소스 워크스페이스, 사용자 데이터, 코드 등 Databricks 인프라(클러스터 VM, 스토리지, 네트워크 등)
목적 사용자 프로젝트/비즈니스 자산 관리 Databricks가 내부적으로 필요한 리소스 자동 관리/보호
삭제/수정 사용자가 직접 가능 Databricks 서비스 삭제 시 자동 삭제, 직접 삭제 불가
  • Databricks는 내부적으로 클러스터, 스토리지, 네트워크 등 다양한 Azure 리소스를 동적으로 생성/삭제합니다. 이 리소스들은 Databricks 서비스의 안정성과 보안을 위해 사용자가 임의로 삭제/수정하면 안 되기 때문에, Azure가 별도의 "관리형 리소스 그룹"에 격리해서 자동으로 관리합니다

databricks 작업영역을 만들면 아래 작업 영역 시작이라는 버튼을 통해 databricks로 이동할 수 있습니다.

클러스터 만들기

서버리스를 사용할 수도 있지만 이번에는 클러스터를 만들어줬습니다.

클러스터를 만들면 spark에 대한 세부 튜닝이 가능하고, 라이브러리 추가가 가능한 등의 커스터마이징이 가능합니다. 단일노드와 다중노드 옵

션이 있는데, 이번에는 테스트 및 교육용으로 사용하므로 단일노드로 만들어줬습니다.

노트북

databricks에는 노트북이라는 작업공간을 사용합니다. 마치 코랩처럼 다양한 언어로 코드를 셀 단위 실행합니다. 즉각적인 시각화가 가능하다는 점이 큰 장점인것 같습니다.

카탈로그

데이터를 가져올 때는 이렇게 카탈로그에 스키마와 데이터테이블을 만들어 사용할 수 있습니다. 카탈로그는 unity catalog를 사용하여 databricks workspace에서 unity 메타스토어에 할당하여 사용합니다. 이렇게 저장한 데이터는 노트북에서 아래와 같이 사용합니다.

SELECT * FROM databricks_1dt016s.v01.sales WHERE total_price = 'total_price';

대시보드 만들기

대시보드 기능을 통해 마치 power BI처럼 시각화를 쉽게 만들고 공유 할 수 있다. 둘의 차이가 있다면 Databricks의 대시보드는 좀 더 개발자 중심이라는 것이다.

 

SQL편집기를 통해서도 데이터를 추가 할 수 있다.

우측상단의 공유버튼으로 다른 작업자와 대시보드 결과물을 나눌수 있으며, 필터기능을 통해 새로 그래프를 작성하지 않아도 변수별로 변하는 그래프를 만들 수 있다.

 

테이블 생성 및 추가

테이블 생성

USE CATALOG databricks_1dt016s;
USE SCHEMA v01;

CREATE
OR REPLACE TABLE delta_students (
  id BIGINT GENERATED ALWAYS AS IDENTITY,
  name STRING,
  grade FLOAT,
  country STRING
);

데이터 삽입

INSERT INTO
  delta_students (name, grade, country)
VALUES
  ('Lucas', 4.0, "Italy"),
  ("Ana", 3.5, "Germany");

데이터 수정

UPDATE
  delta_students
SET
  country = "France"
WHERE
  name = 'Lucas';

UPDATE
  delta_students
SET
  grade = 2.5
WHERE
  id = 3;

Delta Lake가 제공하는 history&restore기능

히스토리 조회

DESCRIBE HISTORY delta_students;

히스토리 버전 별 조회

SELECT * FROM delta_students VERSION AS OF 1 ORDER BY id;

restore(롤백)기능

RESTORE TABLE delta_students VERSION AS OF 5;

언어 매직

%python
print("Hello Python!")
%sql
select "Hello SQL!"
%md

### 마크다운

이런식으로 언어 매직 명령어를 통해 노트북의 기본 언어 설정 외에도 다른 언어를 사용할 수 있습니다.

혹은 아래와 같은 명령어를 통해 다른 노트북을 실행시킬 수 있습니다. ]

실행될 노트북은 상대경로로 지정됩니다.

%run ./Includes/Classroom-Setup-01.2

 

실습환경구성

원본데이터의 회손을 막기위해 사용자 이름에서 파생된 변수를 사용하여 파일과 스키마를 구성하여 실습을 진행하였습니다. 기업에서도 이러한 방식을 사용한다고 합니다. 클러스터의 “세션 메모리”에 올라간 객체(예: DA, 변수, 임시 테이블 등)는 클러스터가 종료되거나 재시작되면 모두 사라지는 구조라고 합니다.

DA 객체란?

  • DA는 일반적으로 Databricks Academy(교육/실습)에서 제공하는 헬퍼(helper) 객체입니다.
  • DBAcademyHelper라는 클래스의 인스턴스(객체)로,
  • 실습 환경에서 자주 쓰는 변수, 함수, 경로, 설정 등을 한 곳에 모아둔 “도구 상자” 역할을 합니다.
  • 실습 참가자마다 각자의 환경(예: 사용자명, 데이터 경로, 스키마명 등)에 맞게 자동으로 세팅되도록 설계되어 있습니다.

실습데이터와 결과가 세션 메모리뿐 아니라 DBFS, Delta Lake, Unity Catalog, MLflow 등 영구 저장소에 남을 수 있습니다. 따라서 임시 데이터, 테이블, 파일, 실험 등 모든 실습 리소스를 자동으로 삭제/초기화하여 항상 “깨끗한 상태”에서 실습을 반복할 수 있게 해주는 DA.cleanup()을 사용해줍니다.

%python
DA.cleanup()

Kafka 데이터란

  • Kafka는Apache Software Foundation에서 개발한 오픈소스 분산 이벤트 스트리밍 플랫폼입니다 여러 시스템(예: 웹사이트, 앱, 서버 등)에서 발생하는 데이터를 “메시지” 형태로 빠르게 주고받기 위한 데이터 파이프라인(메시지 브로커)입니다.
  • 이 메시지(데이터)는 여러 형식으로 담을 수 있는데,
    • *가장 많이 쓰는 포맷이 “JSON”**입니다. Kafka에서 복잡한 데이터를 주고받을 때 구조화된 정보를 한 번에 담을 수 있기 때문입니다.
    • 예:
    • json{"user_id": 123, "event": "click", "timestamp": "2025-05-18T10:00:00Z"}

즉, Kafka 데이터는 다양한 시스템에서 실시간으로 만들어져Kafka라는 분산 메시지 시스템을 통해 저장·중계되고,실시간 분석·알림·적재·모니터링 등 여러 분야에서 핵심적으로 쓰입니다.

카프카 개념 정리(4) - 카프카는 데이터를 어떻게 저장하고 읽어오는가?

위 글을 통하면 구조를 좀 더 쉽게 이해 할 수 있다.

파일 쿼리

경로를 작은따옴표가 아닌 백틱(')으로 묶어야 합니다.

단일 파일 쿼리
SELECT * FROM json.`${DA.paths.kafka_events}/001.json`
파일 디렉토리 쿼리
SELECT * FROM json.`${DA.paths.kafka_events}`

영구 뷰의 경우 스키마에 등록되어 삭제하지 않는 이상 남아있습니다.

임시뷰는 클러스터 세션에만 유효합니다.

파일 참조 생성
CREATE OR REPLACE VIEW event_view
AS SELECT * FROM json.`${DA.paths.kafka_events}`
파일 임시 참조 생성
CREATE OR REPLACE TEMP VIEW events_temp_view
AS SELECT * FROM json.`${DA.paths.kafka_events}`

이 외에도, 쿼리 내 참조에 CFE를 적용하거나, text.을 통해 원시 문자열로 추출하거나, binaryFile.을 통해 파일의 원시 바이트 및 메타데이터를 추출할 수 있습니다.

직접 쿼리가 작동하지 않는 경우

아래처럼 쿼리가 잘 작동하지 않는 경우에는 따로 조건을 작성해주어야 한다.

%sql
CREATE TABLE IF NOT EXISTS sales_csv
  (order_id LONG, email STRING, transactions_timestamp LONG, total_item_quantity INTEGER, purchase_revenue_in_usd DOUBLE, unique_items INTEGER, items STRING)
USING CSV
OPTIONS (
  header = "true",
  delimiter = "|"
)
LOCATION "${DA.paths.sales_csv}"
%python (pyspark)
spark.sql(f"""
CREATE TABLE IF NOT EXISTS sales_csv
  (order_id LONG, email STRING, transactions_timestamp LONG, total_item_quantity INTEGER, purchase_revenue_in_usd DOUBLE, unique_items INTEGER, items STRING)
USING CSV
OPTIONS (
  header = "true",
  delimiter = "|"
)
LOCATION "{DA.paths.sales_csv}"
""")

외부 테이블은 '읽기 전용'으로 연결된 것

Spark는 이 테이블을 만들면서 파일을 복사하거나 수정하지 않습니다. 그냥 “이 경로에 있는 파일을 읽어서 이렇게 해석해”라고 알려주는 것입니다.

따라서, CSV 파일이 변경돼도 Spark가 그걸 자동으로 반영하지 않습니다. 수동으로 새로고침해야 합니다.

%python
(spark.read
      .option("header", "true")
      .option("delimiter", "|")
      .csv(DA.paths.sales_csv)
      .write.mode("append")
      .format("csv")
      .save(DA.paths.sales_csv, header="true"

위 처럼, 기존 CSV 파일에 데이터를 append 작업을 할 수 있습니다. 즉, 파일 자체는 업데이트됩니다.

하지만, Spark는 이전에 이 테이블을 쿼리했을 때 데이터를 캐시해두었기 때문에 SELECT COUNT(*) FROM sales_csv 같은 것에 반영이 되지 않을 수 있습니다. 따라서 REFRESH TABLE sales_csv; 로 캐시를 무효화 하고 원본 파일을 새로 읽어주어야 합니다. 위 코드를 실행하면 같은 데이터를 추가해준 것이기 때문에 count(**)가 2배가 되었음을 볼 수있습니다.

SQLite에 연결

SQLite는 서버 없이, 하나의 파일로 데이터베이스를 관리하는 가볍고 빠른 오픈소스 RDBMS입니다. 모바일, 데스크톱, 임베디드 등 소규모·단일 사용자 환경에 최적입니다.

  • JDBC는 특정 서버나 컴퓨터의 이름이 아니라, 데이터베이스 연결을 위한 소프트웨어적인 표준 인터페이스입니다.
  • JDBC 서버의 백엔드 구성은 이 노트북을 단일 노드 클러스터에서 실행한다고 가정합니다. 여러 워커가 있는 클러스터에서 실행하는 경우, 실행기에서 실행 중인 클라이언트는 드라이버에 연결할 수 없습니다
    • 드라이버와 워커(Executor)가 같은 서버에 존재합니다.
      • JDBC 서버(드라이버)가 실행 중인 서버에서 모든 작업이 이루어집니다.
      • 워커(Executor)도 같은 서버에 있으므로, 네트워크 통신 없이 직접 연결이 가능합니다.
      • 예: 로컬 개발 환경, 소규모 테스트.

    2. 다중 워커 클러스터 (멀티노드)
    • 드라이버와 워커가 서로 다른 서버에 분산되어 있습니다.
      • JDBC 서버(드라이버)는 드라이버 노드에서 실행됩니다.
      • 워커(Executor)는 다른 서버에서 실행되며,
      • 드라이버 노드의 JDBC 서버에 접근하려면 네트워크 통신이 필요합니다.
      • 문제:
        • 워커가 드라이버의 IP/포트에 접근할 수 없는 경우 (방화벽, 네트워크 정책 등)
        • 드라이버 노드의 JDBC 서버가 외부 접근을 허용하지 않는 경우
        • → "연결 불가" 오류 발생.

    3. 결론
    • 단일 노드 클러스터에서는 모든 것이 같은 서버에서 실행되므로 연결 문제가 없습니다.
    • 다중 워커 클러스터에서는 드라이버와 워커가 다른 서버에 있기 때문에,
    • 네트워크 설정이 제대로 되어 있지 않으면 JDBC 연결이 실패합니다.
  • 1. 단일 노드 클러스터 (싱글노드)
DROP TABLE IF EXISTS users_jdbc;

CREATE TABLE users_jdbc
USING JDBC
OPTIONS (
  url = "jdbc:sqlite:${DA.paths.ecommerce_db}",
  dbtable = "users"
)
반응형