자습서: 데이터 웨어하우스로 빅 데이터 스트림Tutorial: Stream big data into a data warehouse

Azure Event Grid는 앱과 서비스의 알림(이벤트)에 응답하는 데 사용할 수 있는 인텔리전트 이벤트 라우팅 서비스입니다.Azure Event Grid is an intelligent event routing service that enables you to react to notifications (events) from apps and services. 예를 들어 Azure Blob Storage 또는 Azure Data Lake Store로 캡처된 Event Hubs 데이터를 처리하도록 Azure Function을 트리거하고, 다른 데이터 리포지토리에 데이터를 마이그레이션할 수 있습니다.For example, it can trigger an Azure Function to process Event Hubs data that has been captured to an Azure Blob storage or Azure Data Lake Storage, and migrate the data to other data repositories. Event Hubs 및 Event Grid 통합 샘플은 Event Grid와 함께 Event Hubs를 사용하여 캡처된 Event Hubs 데이터를 BLOB 스토리지에서 SQL Data Warehouse로 원활하게 마이그레이션하는 방법을 보여줍니다.This Event Hubs and Event Grid integration sample shows you how to use Event Hubs with Event Grid to seamlessly migrate captured Event Hubs data from blob storage to a SQL Data Warehouse.

애플리케이션 개요

이 다이어그램은 이 자습서에서 빌드하는 솔루션의 워크플로를 보여줍니다.This diagram depicts the workflow of the solution you build in this tutorial:

  1. Azure 이벤트 허브로 전송된 데이터는 Azure BLOB 스토리지에 캡처됩니다.Data sent to an Azure event hub is captured in an Azure blob storage.
  2. 데이터 캡처가 완료되면 이벤트가 생성되어 Azure Event Grid로 전송됩니다.When the data capture is complete, an event is generated and sent to an Azure event grid.
  3. Event Grid는 이 이벤트 데이터를 Azure 함수 앱에 전달합니다.The event grid forwards this event data to an Azure function app.
  4. 함수 앱은 이벤트 데이터의 BLOB URL을 사용하여 스토리지에서 BLOB을 검색합니다.The function app uses the blob URL in the event data to retrieve the blob from the storage.
  5. 함수 앱은 Azure SQL Data Warehouse로 BLOB 데이터를 마이그레이션합니다.The function app migrates the blob data to an Azure SQL data warehouse.

이 문서에서는 다음 단계를 수행합니다.In this article, you take the following steps:

  • Azure Resource Manager 템플릿을 사용하여 이벤트 허브, 스토리지 계정, 함수 앱, SQL 데이터 웨어하우스 등의 인프라를 배포합니다.Use an Azure Resource Manager template to deploy the infrastructure: an event hub, a storage account, a function app, a SQL data warehouse.
  • 데이터 웨어하우스에 테이블을 만듭니다.Create a table in the data warehouse.
  • 함수 앱에 코드를 추가합니다.Add code to the function app.
  • 이벤트를 구독합니다.Subscribe to the event.
  • 이벤트 허브로 데이터를 보내는 앱을 실행합니다.Run app that sends data to the event hub.
  • 데이터 웨어하우스에서 마이그레이션된 데이터를 봅니다.View migrated data in data warehouse.

필수 조건Prerequisites

참고

이 문서는 새 Azure PowerShell Az 모듈을 사용하도록 업데이트되었습니다.This article has been updated to use the new Azure PowerShell Az module. AzureRM 모듈은 적어도 2020년 12월까지 버그 수정을 수신할 예정이므로 계속 사용하셔도 됩니다.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. 새 Az 모듈 및 AzureRM 호환성에 대한 자세한 내용은 새 Azure PowerShell Az 모듈 소개를 참조하세요.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Az 모듈 설치 지침은 Azure PowerShell 설치를 참조하세요.For Az module installation instructions, see Install Azure PowerShell.

이 자습서를 완료하려면 다음 항목이 필요합니다.To complete this tutorial, you must have:

인프라 배포Deploy the infrastructure

이 단계에서는 Resource Manager 템플릿을 사용하여 필요한 인프라를 배포합니다.In this step, you deploy the required infrastructure with a Resource Manager template. 템플릿을 배포하면 다음 리소스가 생성됩니다.When you deploy the template, the following resources are created:

  • 캡처 기능을 사용하도록 설정된 이벤트 허브Event hub with the Capture feature enabled.
  • 캡처된 파일에 대한 스토리지 계정Storage account for the captured files.
  • 함수 앱 호스팅용 앱 서비스 플랜App service plan for hosting the function app
  • 이벤트 처리용 함수 앱Function app for processing the event
  • 데이터 웨어하우스 호스팅용 SQL ServerSQL Server for hosting the data warehouse
  • 마이그레이션된 데이터 저장용 SQL Data WarehouseSQL Data Warehouse for storing the migrated data

Azure Portal에서 Azure Cloud Shell 시작Launch Azure Cloud Shell in Azure portal

  1. Azure Portal에 로그인합니다.Sign in to the Azure portal.

  2. 맨 위에서 Cloud Shell 단추를 선택합니다.Select Cloud Shell button at the top.

    Azure portal

  3. 브라우저 맨 아래에 Cloud Shell이 열려 있는 것이 보입니다.You see the Cloud Shell opened at the bottom of the browser.

    Cloud Shell

  4. Cloud Shell에서 BashPowerShell 중에 선택하는 옵션이 표시되면 Bash를 선택합니다.In the Cloud Shell, if you see an option to select between Bash and PowerShell, select Bash.

  5. Cloud Shell을 처음으로 사용하는 경우 스토리지 만들기를 선택하여 스토리지 계정을 만듭니다.If you are using the Cloud Shell for the first time, create a storage account by selecting Create storage. Azure Cloud Shell은 Azure 스토리지 계정에서 일부 파일을 저장해야 합니다.Azure Cloud Shell requires an Azure storage account to store some files.

    Cloud Shell용 스토리지 만들기

  6. Cloud Shell이 초기화될 때까지 기다립니다.Wait until the Cloud Shell is initialized.

    Cloud Shell용 스토리지 만들기

Azure CLI 사용Use Azure CLI

  1. 다음 CLI 명령을 실행하여 Azure 리소스 그룹을 만듭니다.Create an Azure resource group by running the following CLI command:
    1. 다음 명령을 복사하여 Cloud Shell 창에 붙여넣습니다.Copy and paste the following command into the Cloud Shell window

      az group create -l eastus -n <Name for the resource group>
      
    2. 리소스 그룹의 이름을 지정합니다.Specify a name for the resource group

    3. ENTER키를 누릅니다.Press ENTER.

      다음은 예제입니다.Here is an example:

      user@Azure:~$ az group create -l eastus -n ehubegridgrp
      {
        "id": "/subscriptions/00000000-0000-0000-0000-0000000000000/resourceGroups/ehubegridgrp",
        "location": "eastus",
        "managedBy": null,
        "name": "ehubegridgrp",
        "properties": {
          "provisioningState": "Succeeded"
        },
        "tags": null
      }
      
  2. 다음 CLI 명령을 실행하여 이전 섹션에서 언급한 모든 리소스(이벤트 허브, 스토리지 계정, 함수 앱, SQL 데이터 웨어하우스)를 배포합니다.Deploy all the resources mentioned in the previous section (event hub, storage account, functions app, SQL data warehouse) by running the following CLI command:
    1. 명령을 복사하여 Cloud Shell 창에 붙여넣습니다.Copy and paste the command into the Cloud Shell window. 또는 원하는 편집기에 복사/붙여넣고, 값을 설정하고, Cloud Shell에 명령을 복사합니다.Alternatively, you may want to copy/paste into an editor of your choice, set values, and then copy the command to the Cloud Shell.

      az group deployment create \
          --resource-group rgDataMigrationSample \
          --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-grid/EventHubsDataMigration.json \
          --parameters eventHubNamespaceName=<event-hub-namespace> eventHubName=hubdatamigration sqlServerName=<sql-server-name> sqlServerUserName=<user-name> sqlServerPassword=<password> sqlServerDatabaseName=<database-name> storageName=<unique-storage-name> functionAppName=<app-name>
      
    2. 다음 엔터티의 값을 지정합니다.Specify values for the following entities:

      1. 앞에서 만든 리소스 그룹 이름Name of the resource group you created earlier.
      2. 이벤트 허브 네임스페이스 이름Name for the event hub namespace.
      3. 이벤트 허브 이름.Name for the event hub. 현재 값(hubdatamigration)을 그대로 유지해도 됩니다.You can leave the value as it is (hubdatamigration).
      4. SQL 서버 이름Name for the SQL server.
      5. SQL 사용자 이름 및 암호Name of the SQL user and password.
      6. SQL 데이터 웨어하우스 이름Name for the SQL data warehouse
      7. 스토리지 계정 이름Name of the storage account.
      8. 함수 앱 이름Name for the function app.
    3. Cloud Shell 창에서 ENTER를 눌러 명령을 실행합니다.Press ENTER in the Cloud Shell window to run the command. 여러 리소스를 만들기 때문에 이 프로세스에 다소 시간이 걸릴 수 있습니다.This process may take a while since you are creating a bunch of resources. 명령 결과에 오류가 없는지 확인합니다.In the result of the command, ensure that there have been no failures.

Azure PowerShell 사용Use Azure PowerShell

  1. Azure Cloud Shell에서 PowerShell 모드로 전환합니다.In Azure Cloud Shell, switch to PowerShell mode. Azure Cloud Shell의 왼쪽 위 모서리에서 아래쪽 화살표를 선택하고, PowerShell을 선택합니다.Select down arrow in the top-left corner of Azure Cloud Shell, and select PowerShell.

    PowerShell로 전환

  2. 다음 명령을 실행하여 Azure 리소스 그룹을 만듭니다.Create an Azure resource group by running the following command:

    1. 다음 명령을 복사하여 Cloud Shell 창에 붙여넣습니다.Copy and paste the following command into the Cloud Shell window.

      New-AzResourceGroup -Name rgDataMigration -Location westcentralus
      
    2. 리소스 그룹의 이름을 지정합니다.Specify a name for the resource group.

    3. ENTER 키를 누릅니다.Press ENTER.

  3. 다음 명령을 실행하여 이전 섹션에서 언급한 모든 리소스(이벤트 허브, 스토리지 계정, 함수 앱, SQL 데이터 웨어하우스)를 배포합니다.Deploy all the resources mentioned in the previous section (event hub, storage account, functions app, SQL data warehouse) by running the following command:

    1. 명령을 복사하여 Cloud Shell 창에 붙여넣습니다.Copy and paste the command into the Cloud Shell window. 또는 원하는 편집기에 복사/붙여넣고, 값을 설정하고, Cloud Shell에 명령을 복사합니다.Alternatively, you may want to copy/paste into an editor of your choice, set values, and then copy the command to the Cloud Shell.

      New-AzResourceGroupDeployment -ResourceGroupName rgDataMigration -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-grid/EventHubsDataMigration.json -eventHubNamespaceName <event-hub-namespace> -eventHubName hubdatamigration -sqlServerName <sql-server-name> -sqlServerUserName <user-name> -sqlServerDatabaseName <database-name> -storageName <unique-storage-name> -functionAppName <app-name>
      
    2. 다음 엔터티의 값을 지정합니다.Specify values for the following entities:

      1. 앞에서 만든 리소스 그룹 이름Name of the resource group you created earlier.
      2. 이벤트 허브 네임스페이스 이름Name for the event hub namespace.
      3. 이벤트 허브 이름.Name for the event hub. 현재 값(hubdatamigration)을 그대로 유지해도 됩니다.You can leave the value as it is (hubdatamigration).
      4. SQL 서버 이름Name for the SQL server.
      5. SQL 사용자 이름 및 암호Name of the SQL user and password.
      6. SQL 데이터 웨어하우스 이름Name for the SQL data warehouse
      7. 스토리지 계정 이름Name of the storage account.
      8. 함수 앱 이름Name for the function app.
    3. Cloud Shell 창에서 ENTER를 눌러 명령을 실행합니다.Press ENTER in the Cloud Shell window to run the command. 여러 리소스를 만들기 때문에 이 프로세스에 다소 시간이 걸릴 수 있습니다.This process may take a while since you are creating a bunch of resources. 명령 결과에 오류가 없는지 확인합니다.In the result of the command, ensure that there have been no failures.

Cloud Shell 닫기Close the Cloud Shell

포털에서 Cloud Shell 단추를 선택하거나 Cloud Shell 창의 오른쪽 위 모서리에서 X 단추를 선택하여 Cloud Shell을 닫습니다.Close the cloud shell by selecting the Cloud Shell button in the portal (or) X button in the top-right corner of the Cloud Shell window.

리소스가 만들어지는지 확인합니다.Verify that the resources are created

  1. Azure Portal의 왼쪽 메뉴에서 리소스 그룹을 선택합니다.In the Azure portal, select Resource groups on the left menu.

  2. 검색 상자에 리소스 그룹의 이름을 입력하여 리소스 그룹 목록을 필터링합니다.Filter the list of resource groups by entering the name of your resource group in the search box.

  3. 목록에서 해당 리소스 그룹을 선택합니다.Select your resource group in the list.

    리소스 그룹 선택

  4. 리소스 그룹에 다음 리소스가 표시되는지 확인합니다.Confirm that you see the following resources in the resource group:

    리소스 그룹의 리소스

SQL Data Warehouse에서 테이블 만들기Create a table in SQL Data Warehouse

CreateDataWarehouseTable.sql 스크립트를 실행하여 데이터 웨어하우스에 테이블을 만듭니다.Create a table in your data warehouse by running the CreateDataWarehouseTable.sql script. 스크립트를 실행하려면 Visual Studio 또는 포털의 쿼리 편집기를 사용합니다.To run the script, you can use Visual Studio or the Query Editor in the portal. 다음 단계는 쿼리 편집기 사용 방법을 보여줍니다.The following steps show you how to use the Query Editor:

  1. 리소스 그룹의 리소스 목록에서 해당 SQL 데이터 웨어하우스를 선택합니다.In the list of resources in the resource group, select your SQL data warehouse.

  2. SQL 데이터 웨어하우스 페이지의 왼쪽 메뉴에서 쿼리 편집기(미리 보기) 를 선택합니다.In the SQL data warehouse page, select Query editor (preview) in the left menu.

    SQL 데이터 웨어하우스 페이지

  3. SQL 서버의 사용자 이름 및 암호를 입력하고, 확인을 선택합니다.Enter the name of user and password for the SQL server, and select OK.

    SQL 서버 인증

  4. 쿼리 창에서 다음 SQL 스크립트를 복사하여 실행합니다.In the query window, copy and run the following SQL script:

    CREATE TABLE [dbo].[Fact_WindTurbineMetrics] (
        [DeviceId] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
        [MeasureTime] datetime NULL, 
        [GeneratedPower] float NULL, 
        [WindSpeed] float NULL, 
        [TurbineSpeed] float NULL
    )
    WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN);
    

    SQL 쿼리 실행

  5. 자습서가 끝나면 데이터가 생성되었는지는 확인할 수 있도록 이 탭 또는 창을 계속 열어 둡니다.Keep this tab or window open so that you can verify that the data is created at the end of the tutorial.

Azure Functions 앱 게시Publish the Azure Functions app

  1. Visual Studio를 시작합니다.Launch Visual Studio.

  2. GitHub에서 필수 구성 요소의 일부로 다운로드한 EventHubsCaptureEventGridDemo.sln 솔루션을 엽니다.Open the EventHubsCaptureEventGridDemo.sln solution that you downloaded from the GitHub as part of the prerequisites.

  3. 솔루션 탐색기에서 FunctionEGDWDumper를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.In Solution Explorer, right-click FunctionEGDWDumper, and select Publish.

    함수 앱 게시

  4. 다음 화면이 보이면 시작을 선택합니다.If you see the following screen, select Start.

    게시 시작 단추

  5. 게시 대상 선택 페이지에서 기존 항목 선택 옵션을 선택하고 프로필 만들기를 선택합니다.In the Pick a publish target page, select the Select existing option, and select Create Profile.

    게시 대상 선택

  6. App Service 페이지에서 Azure 구독을 선택하고, 리소스 그룹의 함수 앱을 선택하고, 확인을 선택합니다.In the App Service page, select your Azure subscription, select the function app in your resource group, and select OK.

    App Service 페이지

  7. Visual Studio에서 프로필이 구성되었으면 게시를 선택합니다.When Visual Studio has configured the profile, select Publish.

    게시 선택

함수를 게시한 후에는 이벤트를 구독할 수 있습니다.After publishing the function, you're ready to subscribe to the event.

이벤트 구독Subscribe to the event

  1. 웹 브라우저의 새 탭 또는 새 창에서 Azure Portal로 이동합니다.In a new tab or new window of a web browser, navigate to the Azure portal.

  2. Azure Portal의 왼쪽 메뉴에서 리소스 그룹을 선택합니다.In the Azure portal, select Resource groups on the left menu.

  3. 검색 상자에 리소스 그룹의 이름을 입력하여 리소스 그룹 목록을 필터링합니다.Filter the list of resource groups by entering the name of your resource group in the search box.

  4. 목록에서 해당 리소스 그룹을 선택합니다.Select your resource group in the list.

    리소스 그룹 선택

  5. 목록에서 App Service 플랜을 선택합니다.Select the App Service plan in the list.

  6. App Service 플랜 페이지의 왼쪽 메뉴에서 을 선택하고 함수 앱을 선택합니다.In the App Service Plan page, select Apps in the left menu, and select the function app.

    함수 앱 선택

  7. 함수 앱을 확장하고, 함수를 확장하고, 함수를 선택합니다.Expand the function app, expand functions, and then select your function.

    Azure 함수 선택

  8. 도구 모음에서 Event Grid 구독 추가를 선택합니다.Select Add Event Grid subscription on the toolbar.

  9. Event Grid 구독 만들기 페이지에서 다음 작업을 수행합니다.In the Create Event Grid Subscription page, do the following actions:

    1. 토픽 세부 정보 섹션에서 다음 작업을 수행합니다.In the TOPIC DETAILS section, do the following actions:

      1. Azure 구독을 선택합니다.Select your Azure subscription.
      2. Azure 리소스 그룹을 선택합니다.Select the Azure resource group.
      3. Event Hubs 네임스페이스를 선택합니다.Select the Event Hubs namespace.
    2. 이벤트 구독 세부 정보 페이지에서 구독 이름을 입력하고(예: captureEventSub) 만들기를 선택합니다.In the EVENT SUBSCRIPTION DETAILS page, enter a name for the subscription (for example: captureEventSub), and select Create.

      Event Grid 구독 만들기

앱을 실행하여 데이터 생성Run the app to generate data

이벤트 허브, SQL 데이터 웨어하우스, Azure 함수 앱 및 이벤트 구독 설정이 완료되었습니다.You've finished setting up your event hub, SQL data warehouse, Azure function app, and event subscription. 이벤트 허브에 대한 데이터를 생성하는 애플리케이션을 실행하기 전에 몇 가지 값을 구성해야 합니다.Before running an application that generates data for event hub, you need to configure a few values.

  1. Azure Portal에서 이전에 만든 리소스 그룹으로 이동합니다.In the Azure portal, navigate to your resource group as you did earlier.

  2. Event Hubs 네임스페이스를 선택합니다.Select the Event Hubs namespace.

  3. Event Hubs 네임스페이스 페이지의 왼쪽 메뉴에서 공유 액세스 정책을 선택합니다.In the Event Hubs Namespace page, select Shared access policies on the left menu.

  4. 정책 목록에서 RootManageSharedAccessKey를 선택합니다.Select RootManageSharedAccessKey in the list of policies.

  5. 연결 문자열 기본 키 텍스트 상자 옆에 있는 복사 단추를 선택합니다.Select the copy button next to the Connection string-primary key text box.

    이벤트 허브 네임스페이스에 대한 연결 문자열

  6. Visual Studio 솔루션으로 돌아갑니다.Go back to your Visual Studio solution.

  7. WindTurbineDataGenerator 프로젝트에서 program.cs를 엽니다.In the WindTurbineDataGenerator project, open program.cs.

  8. 두 상수 값을 바꿉니다.Replace the two constant values. EventHubConnectionString에는 복사한 값을 사용하고,Use the copied value for EventHubConnectionString. Event Hubs 이름으로 hubdatamigration을 사용합니다.Use hubdatamigration the event hub name. 이벤트 허브에 다른 이름을 사용한 경우 해당 이름을 지정합니다.If you used a different name for the event hub, specify that name.

    private const string EventHubConnectionString = "Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
    private const string EventHubName = "hubdatamigration";
    
  9. 솔루션을 빌드하십시오.Build the solution. WindTurbineGenerator.exe 애플리케이션을 실행합니다.Run the WindTurbineGenerator.exe application.

  10. 몇 분 후에 데이터 웨어하우스에서 마이그레이션된 데이터용 테이블을 쿼리합니다.After a couple of minutes, query the table in your data warehouse for the migrated data.

    쿼리 결과

이벤트 허브에서 생성한 이벤트 데이터Event data generated by the event hub

Event Grid는 구독자에게 이벤트 데이터를 배포합니다.Event Grid distributes event data to the subscribers. 다음 예제는 이벤트 허브를 통한 데이터 스트리밍을 BLOB에 캡처할 때 생성되는 이벤트 데이터를 보여줍니다.The following example shows event data generated when data streaming through an event hub is captured in a blob. 특히 data 개체의 fileUrl 속성은 스토리지의 BLOB을 가리킵니다.In particular, notice the fileUrl property in the data object points to the blob in the storage. 함수 앱은 이 URL을 사용하여 캡처된 데이터가 포함된 BLOB 파일을 검색합니다.The function app uses this URL to retrieve the blob file with captured data.

[
    {
        "topic": "/subscriptions/<guid>/resourcegroups/rgDataMigrationSample/providers/Microsoft.EventHub/namespaces/tfdatamigratens",
        "subject": "eventhubs/hubdatamigration",
        "eventType": "Microsoft.EventHub.CaptureFileCreated",
        "eventTime": "2017-08-31T19:12:46.0498024Z",
        "id": "14e87d03-6fbf-4bb2-9a21-92bd1281f247",
        "data": {
            "fileUrl": "https://tf0831datamigrate.blob.core.windows.net/windturbinecapture/tfdatamigratens/hubdatamigration/1/2017/08/31/19/11/45.avro",
            "fileType": "AzureBlockBlob",
            "partitionId": "1",
            "sizeInBytes": 249168,
            "eventCount": 1500,
            "firstSequenceNumber": 2400,
            "lastSequenceNumber": 3899,
            "firstEnqueueTime": "2017-08-31T19:12:14.674Z",
            "lastEnqueueTime": "2017-08-31T19:12:44.309Z"
        }
    }
]

다음 단계Next steps