자습서: Azure Data Lake Storage Gen2, Azure Databricks 및 SparkTutorial: Azure Data Lake Storage Gen2, Azure Databricks & Spark

이 자습서에서는 Azure Databricks 클러스터를 Azure Data Lake Storage Gen2가 활성화된 Azure 스토리지 계정에 저장된 데이터에 연결하는 방법을 보여줍니다.This tutorial shows you how to connect your Azure Databricks cluster to data stored in an Azure storage account that has Azure Data Lake Storage Gen2 enabled. 이 연결을 통해 기본적으로 사용자의 클러스터에서 데이터에 대한 쿼리 및 분석을 실행할 수 있습니다.This connection enables you to natively run queries and analytics from your cluster on your data.

이 자습서에서는 다음을 수행합니다.In this tutorial, you will:

  • Databricks 클러스터 만들기Create a Databricks cluster
  • 스토리지 계정으로 비구조적 데이터 수집Ingest unstructured data into a storage account
  • Blob 스토리지의 데이터에 대한 분석 실행Run analytics on your data in Blob storage

Azure 구독이 아직 없는 경우 시작하기 전에 무료 계정을 만듭니다.If you don’t have an Azure subscription, create a free account before you begin.

사전 요구 사항Prerequisites

비행 데이터 다운로드Download the flight data

이 자습서에서는 Bureau of Transportation Statistics의 비행 데이터를 사용하여 ETL 작업을 수행하는 방법을 보여줍니다.This tutorial uses flight data from the Bureau of Transportation Statistics to demonstrate how to perform an ETL operation. 자습서를 완료하려면 이 데이터를 다운로드해야 합니다.You must download this data to complete the tutorial.

  1. Research and Innovative Technology Administration, Bureau of Transportation Statistics로 이동합니다.Go to Research and Innovative Technology Administration, Bureau of Transportation Statistics.

  2. 미리 압축된 파일 확인란을 선택하여 모든 데이터 필드를 선택합니다.Select the Prezipped File check box to select all data fields.

  3. 다운로드 단추를 선택하고 결과를 컴퓨터에 저장합니다.Select the Download button and save the results to your computer.

  4. 압축된 파일을 풀고, 파일 이름 및 파일 경로를 적어 둡니다.Unzip the contents of the zipped file and make a note of the file name and the path of the file. 이후 단계에서 이 정보가 필요합니다.You need this information in a later step.

Azure Databricks 서비스 만들기Create an Azure Databricks service

이 섹션에서는 Azure Portal을 사용하여 Azure Databricks 서비스를 만듭니다.In this section, you create an Azure Databricks service by using the Azure portal.

  1. Azure Portal에서 리소스 만들기 > 분석 > Azure Databricks를 차례로 선택합니다.In the Azure portal, select Create a resource > Analytics > Azure Databricks.

    Azure Portal의 DatabricksDatabricks on Azure portal

  2. Azure Databricks 서비스 아래에서 다음 값을 입력하여 Databricks 서비스를 만듭니다.Under Azure Databricks Service, provide the following values to create a Databricks service:

    속성Property DescriptionDescription
    작업 영역 이름Workspace name Databricks 작업 영역에 대한 이름을 제공합니다.Provide a name for your Databricks workspace.
    구독Subscription 드롭다운에서 Azure 구독을 선택합니다.From the drop-down, select your Azure subscription.
    리소스 그룹Resource group 새 리소스 그룹을 만들지, 아니면 기존 그룹을 사용할지 여부를 지정합니다.Specify whether you want to create a new resource group or use an existing one. 리소스 그룹은 Azure 솔루션에 관련된 리소스를 보유하는 컨테이너입니다.A resource group is a container that holds related resources for an Azure solution. 자세한 내용은 Azure Resource Manager 개요를 참조하세요.For more information, see Azure Resource Group overview.
    위치Location 미국 서부 2를 선택합니다.Select West US 2. 사용 가능한 다른 영역은 지역별 사용 가능한 Azure 서비스를 참조하세요.For other available regions, see Azure services available by region.
    가격 책정 계층Pricing Tier 표준을 선택합니다.Select Standard.

    Azure Databricks 작업 영역 만들기Create an Azure Databricks workspace

  3. 계정 생성에는 몇 분 정도가 소요됩니다.The account creation takes a few minutes. 작업 상태를 모니터링하려면 맨 위에 있는 진행률 표시줄을 확인합니다.To monitor the operation status, view the progress bar at the top.

  4. 대시보드에 고정을 선택한 다음, 만들기를 선택합니다.Select Pin to dashboard and then select Create.

Azure Databricks에 Spark 클러스터 만들기Create a Spark cluster in Azure Databricks

  1. Azure Portal에서 본인이 만든 Databricks 서비스로 이동한 다음, 작업 영역 시작을 선택합니다.In the Azure portal, go to the Databricks service that you created, and select Launch Workspace.

  2. Azure Databricks 포털로 리디렉션됩니다.You're redirected to the Azure Databricks portal. 포털에서 클러스터를 선택합니다.From the portal, select Cluster.

    Azure의 DatabricksDatabricks on Azure

  3. 새 클러스터 페이지에서 값을 제공하여 클러스터를 만듭니다.In the New cluster page, provide the values to create a cluster.

    Azure에서 Databricks Spark 클러스터 만들기Create Databricks Spark cluster on Azure

    다음 필드에 대한 값을 입력하고, 다른 필드에는 기본값을 그대로 적용합니다.Fill in values for the following fields, and accept the default values for the other fields:

    • 클러스터의 이름을 입력합니다.Enter a name for the cluster.

    • Terminate after 120 minutes of inactivity(비활성 120분 후 종료) 확인란을 선택했는지 확인합니다.Make sure you select the Terminate after 120 minutes of inactivity checkbox. 클러스터를 사용하지 않는 경우 클러스터를 종료하는 기간(분)을 제공합니다.Provide a duration (in minutes) to terminate the cluster, if the cluster is not being used.

  4. 클러스터 만들기를 선택합니다.Select Create cluster. 클러스터가 실행되면 Notebook을 클러스터에 연결하고 Spark 작업을 실행할 수 있습니다.After the cluster is running, you can attach notebooks to the cluster and run Spark jobs.

데이터 수집Ingest data

스토리지 계정에 원본 데이터 복사Copy source data into the storage account

AzCopy를 사용하여 .csv 파일의 데이터를 Data Lake Storage Gen2 계정으로 복사합니다.Use AzCopy to copy data from your .csv file into your Data Lake Storage Gen2 account.

  1. 명령 프롬프트 창을 열고, 다음 명령을 입력하여 스토리지 계정에 로그인합니다.Open a command prompt window, and enter the following command to log into your storage account.

    azcopy login
    

    명령 프롬프트 창에 나타나는 지침에 따라 사용자 계정을 인증합니다.Follow the instructions that appear in the command prompt window to authenticate your user account.

  2. .csv 계정의 데이터를 복사하려면 다음 명령을 입력합니다.To copy data from the .csv account, enter the following command.

    azcopy cp "<csv-folder-path>" https://<storage-account-name>.dfs.core.windows.net/<container-name>/folder1/On_Time.csv
    
    • <csv-folder-path> 자리 표시자 값을 .csv 파일의 경로로 바꿉니다.Replace the <csv-folder-path> placeholder value with the path to the .csv file.

    • <storage-account-name> 자리 표시자 값을 스토리지 계정 이름으로 바꿉니다.Replace the <storage-account-name> placeholder value with the name of your storage account.

    • <container-name> 자리 표시자를 스토리지 계정의 컨테이너 이름으로 바꿉니다.Replace the <container-name> placeholder with the name of a container in your storage account.

컨테이너 생성 및 탑재Create a container and mount it

이 섹션에서는 스토리지 계정에 컨테이너와 폴더를 만듭니다.In this section, you'll create a container and a folder in your storage account.

  1. Azure Portal에서 본인이 만든 Azure Databricks 서비스로 이동한 다음, 작업 영역 시작을 선택합니다.In the Azure portal, go to the Azure Databricks service that you created, and select Launch Workspace.

  2. 왼쪽 창에서 작업 영역을 선택합니다.On the left, select Workspace. 작업 영역 드롭다운에서 만들기 > Notebook을 차례로 선택합니다.From the Workspace drop-down, select Create > Notebook.

    Databricks에서 Notebook 만들기Create a notebook in Databricks

  3. 노트북 만들기 대화 상자에서 노트북 이름을 입력합니다.In the Create Notebook dialog box, enter a name for the notebook. 언어로 Python을 선택한 다음, 앞에서 만든 Spark 클러스터를 선택합니다.Select Python as the language, and then select the Spark cluster that you created earlier.

  4. 만들기를 선택합니다.Select Create.

  5. 다음 코드 블록을 복사하여 첫 번째 셀에 붙여넣습니다. 하지만 이 코드를 아직 실행하지 마십시오.Copy and paste the following code block into the first cell, but don't run this code yet.

    configs = {"fs.azure.account.auth.type": "OAuth",
           "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
           "fs.azure.account.oauth2.client.id": "<appId>",
           "fs.azure.account.oauth2.client.secret": "<password>",
           "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<tenant>/oauth2/token",
           "fs.azure.createRemoteFileSystemDuringInitialization": "true"}
    
    dbutils.fs.mount(
    source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/folder1",
    mount_point = "/mnt/flightdata",
    extra_configs = configs)
    
  6. 이 코드 블록에서 appId, password, tenantstorage-account-name 자리 표시자 값을 이 자습서의 필수 조건을 수행하는 동안 수집한 값으로 바꿉니다.In this code block, replace the appId, password, tenant, and storage-account-name placeholder values in this code block with the values that you collected while completing the prerequisites of this tutorial. container-name 자리 표시자 값을 컨테이너 이름으로 바꿉니다.Replace the container-name placeholder value with the name of the container.

  7. 이 블록에서 코드를 실행하려면 SHIFT + ENTER 키를 누릅니다.Press the SHIFT + ENTER keys to run the code in this block.

나중에 명령을 추가할 것이므로 이 Notebook을 계속 열어 둡니다.Keep this notebook open as you will add commands to it later.

Databricks Notebook을 사용하여 CSV를 Parquet로 변환Use Databricks Notebook to convert CSV to Parquet

이전에 만든 Notebook에서 새 셀을 추가하고, 해당 셀에 다음 코드를 붙여넣습니다.In the notebook that you previously created, add a new cell, and paste the following code into that cell.

# Use the previously established DBFS mount point to read the data.
# create a data frame to read data.

flightDF = spark.read.format('csv').options(
    header='true', inferschema='true').load("/mnt/flightdata/*.csv")

# read the airline csv file and write the output to parquet format for easy query.
flightDF.write.mode("append").parquet("/mnt/flightdata/parquet/flights")
print("Done")

데이터 살펴보기Explore data

새 셀에서 AzCopy를 통해 업로드된 CSV 파일 목록을 가져오는 다음 스크립트를 붙여넣습니다.In a new cell, paste the following code to get a list of CSV files uploaded via AzCopy.

import os.path
import IPython
from pyspark.sql import SQLContext
display(dbutils.fs.ls("/mnt/flightdata"))

새 파일을 만들고 parquet/flights 폴더에 파일을 나열하려면 다음 스크립트를 실행합니다.To create a new file and list files in the parquet/flights folder, run this script:

dbutils.fs.put("/mnt/flightdata/1.txt", "Hello, World!", True)
dbutils.fs.ls("/mnt/flightdata/parquet/flights")

이러한 코드 샘플을 통해 Data Lake Storage Gen2가 사용되는 스토리지 계정에 저장된 데이터를 사용하여 HDFS의 계층적 특성을 살펴보았습니다.With these code samples, you have explored the hierarchical nature of HDFS using data stored in a storage account with Data Lake Storage Gen2 enabled.

데이터 쿼리Query the data

다음으로, 스토리지 계정에 업로드한 데이터를 쿼리할 수 있습니다.Next, you can begin to query the data you uploaded into your storage account. 다음 코드 블록을 각각 Cmd 1에 입력하고, Cmd+Enter를 눌러 Python 스크립트를 실행합니다.Enter each of the following code blocks into Cmd 1 and press Cmd + Enter to run the Python script.

데이터 원본에 대한 데이터 프레임을 만들려면 다음 스크립트를 실행합니다.To create data frames for your data sources, run the following script:

  • <csv-folder-path> 자리 표시자 값을 .csv 파일의 경로로 바꿉니다.Replace the <csv-folder-path> placeholder value with the path to the .csv file.
# Copy this into a Cmd cell in your notebook.
acDF = spark.read.format('csv').options(
    header='true', inferschema='true').load("/mnt/flightdata/On_Time.csv")
acDF.write.parquet('/mnt/flightdata/parquet/airlinecodes')

# read the existing parquet file for the flights database that was created earlier
flightDF = spark.read.format('parquet').options(
    header='true', inferschema='true').load("/mnt/flightdata/parquet/flights")

# print the schema of the dataframes
acDF.printSchema()
flightDF.printSchema()

# print the flight database size
print("Number of flights in the database: ", flightDF.count())

# show the first 20 rows (20 is the default)
# to show the first n rows, run: df.show(n)
acDF.show(100, False)
flightDF.show(20, False)

# Display to run visualizations
# preferably run this in a separate cmd cell
display(flightDF)

데이터에 대한 몇 가지 기본 분석 쿼리를 실행하는 이 스크립트를 입력합니다.Enter this script to run some basic analysis queries against the data.

# Run each of these queries, preferably in a separate cmd cell for separate analysis
# create a temporary sql view for querying flight information
FlightTable = spark.read.parquet('/mnt/flightdata/parquet/flights')
FlightTable.createOrReplaceTempView('FlightTable')

# create a temporary sql view for querying airline code information
AirlineCodes = spark.read.parquet('/mnt/flightdata/parquet/airlinecodes')
AirlineCodes.createOrReplaceTempView('AirlineCodes')

# using spark sql, query the parquet file to return total flights in January and February 2016
out1 = spark.sql("SELECT * FROM FlightTable WHERE Month=1 and Year= 2016")
NumJan2016Flights = out1.count()
out2 = spark.sql("SELECT * FROM FlightTable WHERE Month=2 and Year= 2016")
NumFeb2016Flights = out2.count()
print("Jan 2016: ", NumJan2016Flights, " Feb 2016: ", NumFeb2016Flights)
Total = NumJan2016Flights+NumFeb2016Flights
print("Total flights combined: ", Total)

# List out all the airports in Texas
out = spark.sql(
    "SELECT distinct(OriginCityName) FROM FlightTable where OriginStateName = 'Texas'")
print('Airports in Texas: ', out.show(100))

# find all airlines that fly from Texas
out1 = spark.sql(
    "SELECT distinct(Reporting_Airline) FROM FlightTable WHERE OriginStateName='Texas'")
print('Airlines that fly to/from Texas: ', out1.show(100, False))

리소스 정리Clean up resources

더 이상 필요하지 않으면 리소스 그룹 및 모든 관련 리소스를 삭제합니다.When they're no longer needed, delete the resource group and all related resources. 이렇게 하려면 스토리지 계정에 대한 리소스 그룹을 선택하고 삭제를 선택합니다.To do so, select the resource group for the storage account and select Delete.

다음 단계Next steps