Azure Databricks 작업에서 Databricks SQL 사용

Azure Databricks 작업에서 SQL 작업 유형을 사용하여 쿼리, 레거시 대시보드 및 경고와 같은 Databricks SQL 개체를 포함하는 워크플로를 만들고, 예약하고, 작동하고, 모니터링할 수 있습니다. 예를 들어 워크플로는 데이터를 수집하고, 데이터를 준비하고, Databricks SQL 쿼리를 사용하여 분석을 수행한 다음, 레거시 대시보드에 결과를 표시할 수 있습니다.

이 문서에서는 GitHub 기여 대한 메트릭을 표시하는 레거시 대시보드를 만드는 예제 워크플로를 제공합니다. 이 예에서는 다음을 수행합니다.

  • Python 스크립트 및 GitHub REST API를 사용하여 GitHub 데이터를 수집합니다.
  • Delta Live Tables 파이프라인을 사용하여 GitHub 데이터를 변환합니다.
  • 준비된 데이터를 분석하는 Databricks SQL 쿼리를 트리거합니다.
  • 레거시 대시보드에 분석을 표시합니다.

GitHub 분석 대시보드

시작하기 전에

이 연습을 진행하려면 먼저 다음 작업을 수행해야 합니다.

1단계: 비밀에 GitHub 토큰 저장

Databricks는 작업에서 GitHub 개인용 액세스 토큰과 같은 자격 증명을 하드 코딩하는 대신 비밀 범위를 사용하여 비밀을 안전하게 저장하고 관리하는 것이 좋습니다. 다음 Databricks CLI 명령은 비밀 범위를 만들고 해당 범위의 비밀에 GitHub 토큰을 저장하는 예제입니다.

databricks secrets create-scope <scope-name>
databricks secrets put-secret <scope-name> <token-key> --string-value <token>
  • 토큰을 저장할 Azure Databricks 비밀 범위의 이름으로 바꿉 <scope-name 니다.
  • <token-key>를 토큰에 할당할 키의 이름으로 바꿉니다.
  • <token>을 GitHub 개인용 액세스 토큰의 값으로 바꿉니다.

2단계: GitHub 데이터를 가져오는 스크립트 만들기

다음 Python 스크립트는 GitHub REST API를 사용하여 GitHub 리포지토리에서 커밋 및 기여에 대한 데이터를 가져옵니다. 입력 인수는 GitHub 리포지토리를 지정합니다. 레코드는 다른 입력 인수를 통해 지정되는 DBFS의 위치에 저장됩니다.

이 예제에서는 DBFS를 사용하여 Python 스크립트를 저장하지만 Databricks Git 폴더 또는 작업 영역 파일을 사용하여 스크립트를 저장하고 관리할 수도 있습니다.

  • 로컬 디스크의 위치에 이 스크립트를 저장합니다.

    import json
    import requests
    import sys
    
    api_url = "https://api.github.com"
    
    def get_commits(owner, repo, token, path):
      page = 1
      request_url =  f"{api_url}/repos/{owner}/{repo}/commits"
      more = True
    
      get_response(request_url, f"{path}/commits", token)
    
    def get_contributors(owner, repo, token, path):
      page = 1
      request_url =  f"{api_url}/repos/{owner}/{repo}/contributors"
      more = True
    
      get_response(request_url, f"{path}/contributors", token)
    
    def get_response(request_url, path, token):
      page = 1
      more = True
    
      while more:
        response = requests.get(request_url, params={'page': page}, headers={'Authorization': "token " + token})
        if response.text != "[]":
          write(path + "/records-" + str(page) + ".json", response.text)
          page += 1
        else:
          more = False
    
    def write(filename, contents):
      dbutils.fs.put(filename, contents)
    
    def main():
      args = sys.argv[1:]
      if len(args) < 6:
        print("Usage: github-api.py owner repo request output-dir secret-scope secret-key")
        sys.exit(1)
    
      owner = sys.argv[1]
      repo = sys.argv[2]
      request = sys.argv[3]
      output_path = sys.argv[4]
      secret_scope = sys.argv[5]
      secret_key = sys.argv[6]
    
      token = dbutils.secrets.get(scope=secret_scope, key=secret_key)
    
      if (request == "commits"):
        get_commits(owner, repo, token, output_path)
      elif (request == "contributors"):
        get_contributors(owner, repo, token, output_path)
    
    if __name__ == "__main__":
        main()
    
  • 다음과 같이 DBFS에 스크립트를 업로드합니다.

    1. Azure Databricks 방문 페이지로 이동하고 사이드바에서 카탈로그를 클릭합니다카탈로그 아이콘.
    2. DBFS 찾아보기를 클릭합니다.
    3. DBFS 파일 브라우저에서 업로드를 클릭합니다. DBFS에 데이터 업로드 대화 상자가 나타납니다.
    4. DBFS에 경로를 입력하여 스크립트를 저장하거나, 업로드할 파일 끌어서 놓기 또는 여기를 클릭하여 파일 탐색을 클릭하고 Python 스크립트를 선택합니다.
    5. 완료를 클릭합니다.

3단계: GitHub 데이터를 처리하는 Delta Live Tables 파이프라인 만들기

이 섹션에서는 원시 GitHub 데이터를 Databricks SQL 쿼리로 분석할 수 있는 테이블로 변환하는 Delta Live Tables 파이프라인을 만듭니다. 파이프라인을 만들려면 다음 단계를 수행합니다.

  1. 사이드바에서 새로 만들기를 클릭하고 새 아이콘메뉴에서 전자 필기장을 선택합니다. Notebook 만들기 대화 상자가 나타납니다.

  2. 기본 언어에서 이름을 입력하고 Python을 선택합니다. 기본값으로 설정된 클러스터를 그대로 둘 수 있습니다. Delta Live Tables 런타임은 파이프라인을 실행하기 전에 클러스터를 만듭니다.

  3. 만들기를 클릭합니다.

  4. Python 코드 예제를 복사하여 새 Notebook에 붙여넣습니다. Notebook의 단일 셀 또는 여러 셀에 예제 코드를 추가할 수 있습니다.

    import dlt
    from pyspark.sql.functions import *
    
    def parse(df):
       return (df
         .withColumn("author_date", to_timestamp(col("commit.author.date")))
         .withColumn("author_email", col("commit.author.email"))
         .withColumn("author_name", col("commit.author.name"))
         .withColumn("comment_count", col("commit.comment_count"))
         .withColumn("committer_date", to_timestamp(col("commit.committer.date")))
         .withColumn("committer_email", col("commit.committer.email"))
         .withColumn("committer_name", col("commit.committer.name"))
         .withColumn("message", col("commit.message"))
         .withColumn("sha", col("commit.tree.sha"))
         .withColumn("tree_url", col("commit.tree.url"))
         .withColumn("url", col("commit.url"))
         .withColumn("verification_payload", col("commit.verification.payload"))
         .withColumn("verification_reason", col("commit.verification.reason"))
         .withColumn("verification_signature", col("commit.verification.signature"))
         .withColumn("verification_verified", col("commit.verification.signature").cast("string"))
         .drop("commit")
       )
    
    @dlt.table(
       comment="Raw GitHub commits"
    )
    def github_commits_raw():
      df = spark.read.json(spark.conf.get("commits-path"))
      return parse(df.select("commit"))
    
    @dlt.table(
      comment="Info on the author of a commit"
    )
    def commits_by_author():
      return (
        dlt.read("github_commits_raw")
          .withColumnRenamed("author_date", "date")
          .withColumnRenamed("author_email", "email")
          .withColumnRenamed("author_name", "name")
          .select("sha", "date", "email", "name")
      )
    
    @dlt.table(
      comment="GitHub repository contributors"
    )
    def github_contributors_raw():
      return(
        spark.readStream.format("cloudFiles")
          .option("cloudFiles.format", "json")
          .load(spark.conf.get("contribs-path"))
      )
    
  5. 사이드바에서 워크플로를 클릭하고 워크플로 아이콘델타 라이브 테이블 탭을 클릭한 다음 파이프라인 만들기를 클릭합니다.

  6. 파이프라인 이름을 지정합니다(예: Transform GitHub data).

  7. 전자 필기 장 라이브러리 필드에 전자 필기장의 경로를 입력하거나 클릭하여 파일 선택 아이콘 전자 필기장을 선택합니다.

  8. 구성 추가를 클릭합니다. Key 텍스트 상자에 commits-path를 입력합니다. Value 텍스트 상자에 GitHub 레코드가 기록될 DBFS 경로를 입력합니다. 이 경로는 사용자가 선택할 수 있으며 워크플로 만들기에서 첫 번째 Python 작업을 구성할 때 사용할 경로와 동일합니다.

  9. 구성 추가를 다시 클릭합니다. Key 텍스트 상자에 contribs-path를 입력합니다. Value 텍스트 상자에 GitHub 레코드가 기록될 DBFS 경로를 입력합니다. 이 경로는 사용자가 선택할 수 있으며 워크플로 만들기에서 두 번째 Python 작업을 구성할 때 사용할 경로와 동일합니다.

  10. 대상 필드에 대상 데이터베이스(예: github_tables)를 입력합니다. 대상 데이터베이스를 설정하면 출력 데이터가 메타스토어에 게시되며, 파이프라인에서 생성된 데이터를 분석하는 다운스트림 쿼리에 필요합니다.

  11. 저장을 클릭합니다.

4단계: GitHub 데이터를 수집하고 변환하는 워크플로 만들기

Databricks SQL을 사용하여 GitHub 데이터를 분석하고 시각화하려면 먼저 데이터를 수집하고 준비해야 합니다. 이러한 작업을 완료하는 워크플로를 만들려면 다음 단계를 수행합니다.

Azure Databricks 작업 만들기 및 첫 번째 작업 추가

  1. Azure Databricks 방문 페이지로 이동하여 다음 중 하나를 수행합니다.

    • 사이드바에서 워크플로를 클릭하고 워크플로 아이콘을 클릭합니다.작업 만들기 단추
    • 사이드바에서 새로 만들기를 클릭하고 새 아이콘메뉴에서 작업을 선택합니다.
  2. 작업 탭에 나타나는 작업 대화 상자에서 작업 이름 추가…를 작업 이름(예: GitHub analysis workflow)으로 바꿉니다.

  3. 작업 이름에 작업 이름(예: get_commits)을 입력합니다.

  4. 형식에서 Python 스크립트를 선택합니다.

  5. 원본에서 DBFS/S3을 선택합니다.

  6. 경로에서 DBFS의 스크립트 경로를 입력합니다.

  7. 매개 변수에서 Python 스크립트에 대한 다음 인수를 입력합니다.

    ["<owner>","<repo>","commits","<DBFS-output-dir>","<scope-name>","<github-token-key>"]

    • <owner>를 리포지토리 소유자의 이름으로 바꿉니다. 예를 들어 github.com/databrickslabs/overwatch 리포지토리에서 레코드를 가져오려면 databrickslabs를 입력합니다.
    • <repo>를 리포지토리 이름(예: overwatch)으로 바꿉니다.
    • <DBFS-output-dir>을 DBFS의 경로로 바꿔 GitHub에서 가져온 레코드를 저장합니다.
    • <scope-name>을 GitHub 토큰을 저장하기 위해 만든 비밀 범위의 이름으로 바꿉니다.
    • <github-token-key>를 GitHub 토큰에 할당한 키의 이름으로 바꿉니다.
  8. 작업 저장을 클릭합니다.

다른 작업 추가

  1. 방금 만든 작업 아래를 클릭합니다 작업 추가 단추 .

  2. 작업 이름에 작업 이름(예: get_contributors)을 입력합니다.

  3. 형식에서 Python 스크립트 작업 형식을 선택합니다.

  4. 원본에서 DBFS/S3을 선택합니다.

  5. 경로에서 DBFS의 스크립트 경로를 입력합니다.

  6. 매개 변수에서 Python 스크립트에 대한 다음 인수를 입력합니다.

    ["<owner>","<repo>","contributors","<DBFS-output-dir>","<scope-name>","<github-token-key>"]

    • <owner>를 리포지토리 소유자의 이름으로 바꿉니다. 예를 들어 github.com/databrickslabs/overwatch 리포지토리에서 레코드를 가져오려면 databrickslabs를 입력합니다.
    • <repo>를 리포지토리 이름(예: overwatch)으로 바꿉니다.
    • <DBFS-output-dir>을 DBFS의 경로로 바꿔 GitHub에서 가져온 레코드를 저장합니다.
    • <scope-name>을 GitHub 토큰을 저장하기 위해 만든 비밀 범위의 이름으로 바꿉니다.
    • <github-token-key>를 GitHub 토큰에 할당한 키의 이름으로 바꿉니다.
  7. 작업 저장을 클릭합니다.

데이터를 변환하는 작업 추가

  1. 방금 만든 작업 아래를 클릭합니다 작업 추가 단추 .
  2. 작업 이름에 작업 이름(예: transform_github_data)을 입력합니다.
  3. 형식에서 Delta Live Tables 파이프라인을 선택하고 작업의 이름을 입력합니다.
  4. 파이프라인에서, 3단계: GitHub 데이터를 처리하는 Delta Live Tables 파이프라인 만들기에서 만든 파이프라인을 선택합니다.
  5. 만들기를 클릭합니다.

5단계: 데이터 변환 워크플로 실행

워크플로를 실행하려면 클릭합니다 지금 실행 단추 . 실행 세부 정보를 보려면 작업 실행 보기에서 실행의 시작 시간 열에 있는 링크를 클릭합니다. 각 작업을 클릭하여 작업 실행 세부 정보를 살펴봅니다.

6단계: (선택 사항) 워크플로 실행이 완료된 후 출력 데이터를 보려면 다음 단계를 수행합니다.

  1. 실행 세부 정보 보기에서 Delta Live Tables 작업을 클릭합니다.
  2. 작업 실행 세부 정보 패널의 파이프라인 아래에서 파이프라인 이름을 클릭합니다. 파이프라인 세부 정보 페이지가 표시됩니다.
  3. 파이프라인 DAG에서 commits_by_author 테이블을 선택합니다.
  4. commits_by_author 패널에서 메타스토어 옆에 있는 테이블 이름을 클릭합니다. 카탈로그 탐색기 페이지가 열립니다.

카탈로그 탐색기에서 테이블에 대한 테이블 스키마, 샘플 데이터 및 기타 세부 정보를 볼 수 있습니다. 동일한 단계에 따라 github_contributors_raw 테이블의 데이터를 봅니다.

7단계: GitHub 데이터 제거

실제 애플리케이션에서는 데이터를 지속적으로 수집하고 처리할 수 있습니다. 이 예제에서는 전체 데이터 세트를 다운로드하여 처리하므로, 워크플로를 다시 실행할 때 오류를 방지하기 위해 이미 다운로드한 GitHub 데이터를 제거해야 합니다. 다운로드한 데이터를 제거하려면 다음 단계를 수행합니다.

  1. 새 Notebook을 만들고 첫 번째 셀에 다음 명령을 입력합니다.

    dbutils.fs.rm("<commits-path", True)
    dbutils.fs.rm("<contributors-path", True)
    

    <commits-path><contributors-path>를 Python 작업을 만들 때 구성한 DBFS 경로로 바꿉니다.

  2. 셀 실행을 클릭하고 실행 메뉴 선택합니다.

워크플로에서 이 Notebook을 작업으로 추가할 수도 있습니다.

8단계: Databricks SQL 쿼리 만들기

워크플로를 실행하고 필요한 테이블을 만든 후에는 준비된 데이터를 분석하는 쿼리를 만듭니다. 예제 쿼리 및 시각화를 만들려면 다음 단계를 수행합니다.

월별 상위 기여자 10명 표시

  1. 사이드바에서 Databricks 로고 Databricks 로고 아래의 아이콘을 클릭하고 SQL을 선택합니다.

  2. 쿼리 만들기를 클릭하여 Databricks SQL 쿼리 편집기를 엽니다.

  3. 카탈로그가 hive_metastore로 설정되어 있는지 확인합니다. hive_metastore 옆에 있는 기본값을 클릭하고 데이터베이스를 Delta Live Tables 파이프라인에서 설정한 대상 값으로 설정합니다.

  4. 새 쿼리 페이지에서 다음 쿼리를 입력합니다.

    SELECT
      date_part('YEAR', date) AS year,
      date_part('MONTH', date) AS month,
      name,
      count(1)
    FROM
      commits_by_author
    WHERE
      name IN (
        SELECT
          name
        FROM
          commits_by_author
        GROUP BY
          name
        ORDER BY
          count(name) DESC
        LIMIT 10
      )
      AND
        date_part('YEAR', date) >= 2022
    GROUP BY
      name, year, month
    ORDER BY
      year, month, name
    
  5. 새 쿼리 탭을 클릭하고 쿼리 이름을 바꿉니다(예: Commits by month top 10 contributors).

  6. 기본적으로 결과는 테이블로 표시됩니다. 예를 들어 가로 막대형 차트를 사용하여 데이터를 시각화하는 방법을 변경하려면 [결과] 패널에서 [편집]을 클릭하고 작업 세로 줄임표 클릭합니다.

  7. 시각화 유형에서 막대를 선택합니다.

  8. X 열에서 을 선택합니다.

  9. Y 열에서 count(1)를 선택합니다.

  10. 그룹화 기준에서 이름을 선택합니다.

  11. 저장을 클릭합니다.

상위 기여자 20명 표시

  1. + > 새 쿼리 만들기를 클릭하고 카탈로그가 hive_metastore로 설정되었는지 확인합니다. hive_metastore 옆에 있는 기본값을 클릭하고 데이터베이스를 Delta Live Tables 파이프라인에서 설정한 대상 값으로 설정합니다.

  2. 다음 쿼리를 입력합니다.

    SELECT
      login,
      cast(contributions AS INTEGER)
    FROM
      github_contributors_raw
    ORDER BY
      contributions DESC
    LIMIT 20
    
  3. 새 쿼리 탭을 클릭하고 쿼리 이름을 바꿉니다(예: Top 20 contributors).

  4. 기본 테이블에서 시각화를 변경하려면 [결과] 패널에서 [편집]을 클릭하고 작업 세로 줄임표 클릭합니다.

  5. 시각화 유형에서 막대를 선택합니다.

  6. X 열에서 로그인을 선택합니다.

  7. Y 열에서 기여를 선택합니다.

  8. 저장을 클릭합니다.

작성자별 총 커밋 표시

  1. + > 새 쿼리 만들기를 클릭하고 카탈로그가 hive_metastore로 설정되었는지 확인합니다. hive_metastore 옆에 있는 기본값을 클릭하고 데이터베이스를 Delta Live Tables 파이프라인에서 설정한 대상 값으로 설정합니다.

  2. 다음 쿼리를 입력합니다.

    SELECT
      name,
      count(1) commits
    FROM
      commits_by_author
    GROUP BY
      name
    ORDER BY
      commits DESC
    LIMIT 10
    
  3. 새 쿼리 탭을 클릭하고 쿼리 이름을 바꿉니다(예: Total commits by author).

  4. 기본 테이블에서 시각화를 변경하려면 [결과] 패널에서 [편집]을 클릭하고 작업 세로 줄임표 클릭합니다.

  5. 시각화 유형에서 막대를 선택합니다.

  6. X 열에서 이름을 선택합니다.

  7. Y 열에서 커밋을 선택합니다.

  8. 저장을 클릭합니다.

9단계: 대시보드 만들기

  1. 사이드바에서 대시보드를 클릭합니다 대시보드 아이콘.
  2. 대시보드 만들기를 클릭합니다.
  3. 대시보드의 이름(예: GitHub analysis)을 입력합니다.
  4. 8단계: Databricks SQL 쿼리 만들기에서 만든 각 쿼리 및 시각화에 대해 추가 > 시각화를 클릭하고 각 시각화를 선택합니다.

10단계: 워크플로에 SQL 작업 추가

Azure Databricks 작업 만들기 및 첫 번째 작업 추가에서 만든 워크플로에 새 쿼리 작업을 추가하려면 8단계: Databricks SQL 쿼리 만들기에서 만든 각 쿼리에 대해 다음을 수행합니다.

  1. 사이드바에서 워크플로를 클릭합니다워크플로 아이콘.
  2. 이름 열에서 작업 이름을 클릭합니다.
  3. 작업 탭을 클릭합니다.
  4. 마지막 작업 아래를 클릭합니다 작업 추가 단추 .
  5. 작업의 이름을 입력하고, 형식에서 SQL을 선택하고, SQL 작업에서 쿼리를 선택합니다.
  6. SQL 쿼리에서 쿼리를 선택합니다.
  7. SQL 웨어하우스에서 작업을 실행할 서버리스 SQL 웨어하우스 또는 프로 SQL 웨어하우스를 선택합니다.
  8. 만들기를 클릭합니다.

11단계: 대시보드 작업 추가

  1. 마지막 작업 아래를 클릭합니다 작업 추가 단추 .
  2. 작업의 이름을 입력하고, 형식에서 SQL을 선택하고, SQL 작업에서 레거시 대시보드를 선택합니다.
  3. 9단계: 대시보드 만들기에서 만든 대시보드를 선택합니다.
  4. SQL 웨어하우스에서 작업을 실행할 서버리스 SQL 웨어하우스 또는 프로 SQL 웨어하우스를 선택합니다.
  5. 만들기를 클릭합니다.

12단계: 전체 워크플로 실행

워크플로를 실행하려면 을 클릭합니다 지금 실행 단추. 실행 세부 정보를 보려면 작업 실행 보기에서 실행의 시작 시간 열에 있는 링크를 클릭합니다.

13단계: 결과 보기

실행이 완료된 후 결과를 보려면 최종 대시보드 작업을 클릭하고, 오른쪽 패널의 SQL 대시보드 아래에서 대시보드 이름을 클릭합니다.