Microsoft Fabric에서 Time Series Insights Gen2를 실시간 인텔리전스로 마이그레이션

참고 항목

Time Series Insights 서비스는 2024년 7월 7일에 사용 중지됩니다. 최대한 빨리 기존 환경을 대체 솔루션으로 마이그레이션하는 것이 좋습니다. 사용 중단 및 마이그레이션에 대한 자세한 내용은 설명서를 참조하세요.

개요

Eventhouse 는 실시간 인텔리전스의 시계열 데이터베이스입니다. Time Series Insights에서 데이터를 마이그레이션하기 위한 대상으로 사용됩니다.

높은 수준의 마이그레이션 권장 사항.

기능 마이그레이션 권장됨
평면화 및 이스케이프를 사용하여 허브에서 JSON 수집 Azure Event Hubs에서 데이터 가져오기
콜드 저장소 열기 Eventhouse OneLake 가용성
Power BI 커넥터 Eventhouse Power BI 커넥터를 사용합니다. TSQ를 KQL로 수동으로 다시 씁니다.
Spark 커넥터 Eventhouse로 데이터를 마이그레이션합니다. Apache Spark와 함께 Notebook을 사용하여 Eventhouse 를 쿼리하거나 Notebook을 사용하여 레이크하우스의 데이터 탐색
대량 업로드 Azure Storage에서 데이터 가져오기
시계열 모델 JSON 파일로 내보낼 수 있습니다. Eventhouse로 가져올 수 있습니다. Kusto Graph 의미 체계를 사용하면 시계열 모델 계층 구조를 그래프로 모델, 트래버스 및 분석할 수 있습니다.
시계열 탐색기 KustoTrender를 사용하여 실시간 대시보드, Power BI 보고서 또는 사용자 지정 대시보드 작성
쿼리 언어 KQL에서 쿼리를 다시 작성합니다.

원격 분석 마이그레이션

환경에서 모든 데이터의 복사본을 검색하려면 스토리지 계정의 폴더를 사용합니다 PT=Time . 자세한 내용은 데이터 스토리지를 참조하세요.

마이그레이션 1단계 - 원격 분석 데이터에 대한 통계 가져오기

데이터

  1. Env 개요
    • 데이터 액세스 FQDN의 첫 번째 부분에서 환경 ID 기록(예: .env.crystal-dev.windows-int.net에서 d390b0b0-1445-4c0c-8365-68d6382c1c2a)
  2. Env 개요 -> 스토리지 구성 -> 스토리지 계정
  3. Storage Explorer를 사용하여 폴더 통계 가져오기
    • PT=Time 폴더의 크기 및 BLOB 수를 기록합니다.

마이그레이션 2단계 - Eventhouse로 데이터 마이그레이션

Eventhouse 만들기

마이그레이션 프로세스에 대한 Eventhouse를 설정하려면 Eventhouse를 만드는 단계를 수행합니다.

데이터 수집

Time Series Insights 인스턴스에 해당하는 스토리지 계정에 대한 데이터를 검색하려면 Azure Storage에서 데이터를 가져오는 단계를 따릅니다.

확인할 사항은 다음과 같습니다.

  1. 적절한 컨테이너를 선택하고 필요한 SAS 토큰 또는 계정 키와 함께 해당 URI를 제공합니다.

  2. 관련 Blob을 필터링하도록 파일 필터 폴더 경로를 V=1/PT=Time 구성합니다.

  3. 적어도 타임스탬프, TSID 열 및 값을 유지하면서 유추된 스키마를 확인하고 자주 쿼리되지 않는 열을 제거합니다. 모든 데이터가 Eventhouse에 복사되도록 하려면 다른 열을 추가하고 DropMappedFields 매핑 변환을 사용합니다.

  4. 수집 프로세스를 완료합니다.

데이터 쿼리

이제 데이터를 성공적으로 수집했으므로 KQL 쿼리 세트를 사용하여 탐색을 시작할 수 있습니다. 사용자 지정 클라이언트 애플리케이션에서 데이터에 액세스해야 하는 경우 Eventhouse는 C#(링크), Java(링크) 및 Node.js(링크)와 같은 주요 프로그래밍 언어에 대한 SDK를 제공합니다.

시계열 모델을 Azure Data Explorer로 마이그레이션

TSI 탐색기 UX 또는 TSM Batch API를 사용하여 TSI 환경에서 JSON 형식으로 모델을 다운로드할 수 있습니다. 그런 다음, 모델을 Eventhouse로 가져올 수 있습니다.

  1. TSI UX에서 TSM을 다운로드합니다.

  2. Visual Studio Code 또는 다른 편집기를 사용하여 처음 세 줄을 삭제합니다.

    Azure Data Explorer로 TSM 마이그레이션 - 처음 3줄 삭제의 스크린샷

  3. Visual Studio Code 또는 다른 편집기를 사용하여 regex \},\n \{ 로 검색 및 바꾸기 }{

    Azure Data Explorer로 TSM 마이그레이션 - 검색 및 바꾸기의 스크린샷

  4. 단일 파일에서 데이터 가져오기를 사용하여 별도의 테이블로 ADX에 JSON으로 수집합니다.

시계열 데이터를 패브릭 실시간 인텔리전스의 Eventhouse로 마이그레이션한 후에는 Kusto Graph 의미 체계기능을 사용하여 데이터를 컨텍스트화하고 분석할 수 있습니다. Kusto Graph 의미 체계를 사용하면 시계열 모델의 계층 구조를 그래프로 모델링, 트래버스 및 분석할 수 있습니다. Kusto Graph 의미 체계를 사용하면 자산, 사이트 및 데이터 요소와 같은 시계열 데이터의 여러 엔터티 간의 관계에 대한 인사이트를 얻을 수 있습니다. 이러한 인사이트는 시스템의 다양한 구성 요소 간의 종속성 및 상호 작용을 이해하는 데 도움이 됩니다.

TSQ(시계열 쿼리)를 KQL로 변환

GetEvents

{
  "getEvents": {
    "timeSeriesId": [
      "assest1",
      "siteId1",
      "dataId1"
    ],
    "searchSpan": {
      "from": "2021-11-01T00:00:0.0000000Z",
      "to": "2021-11-05T00:00:00.000000Z"
    },
    "inlineVariables": {},
  }
}
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where assetId_string == "assest1" and siteId_string == "siteId1" and dataid_string == "dataId1"
| take 10000

필터가 있는 GetEvents

{
  "getEvents": {
    "timeSeriesId": [
      "deviceId1",
      "siteId1",
      "dataId1"
    ],
    "searchSpan": {
      "from": "2021-11-01T00:00:0.0000000Z",
      "to": "2021-11-05T00:00:00.000000Z"
    },
    "filter": {
      "tsx": "$event.sensors.sensor.String = 'status' AND $event.sensors.unit.String = 'ONLINE"
    }
  }
} 
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where deviceId_string== "deviceId1" and siteId_string == "siteId1" and dataId_string == "dataId1"
| where ['sensors.sensor_string'] == "status" and ['sensors.unit_string'] == "ONLINE"
| take 10000

프로젝트된 변수가 있는 GetEvents

{
  "getEvents": {
    "timeSeriesId": [
      "deviceId1",
      "siteId1",
      "dataId1"
    ],
    "searchSpan": {
      "from": "2021-11-01T00:00:0.0000000Z",
      "to": "2021-11-05T00:00:00.000000Z"
    },
    "inlineVariables": {},
    "projectedVariables": [],
    "projectedProperties": [
      {
        "name": "sensors.value",
        "type": "String"
      },
      {
        "name": "sensors.value",
        "type": "bool"
      },
      {
        "name": "sensors.value",
        "type": "Double"
      }
    ]
  }
}	 
events
| where timestamp >= datetime(2021-11-01T00:00:0.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.000000Z)
| where deviceId_string== "deviceId1" and siteId_string == "siteId1" and dataId_string == "dataId1"
| take 10000
| project timestamp, sensorStringValue= ['sensors.value_string'], sensorBoolValue= ['sensors.value_bool'], sensorDoublelValue= ['sensors.value_double']

AggregateSeries

{
  "aggregateSeries": {
    "timeSeriesId": [
      "deviceId1"
    ],
    "searchSpan": {
      "from": "2021-11-01T00:00:00.0000000Z",
      "to": "2021-11-05T00:00:00.0000000Z"
    },
    "interval": "PT1M",
    "inlineVariables": {
      "sensor": {
        "kind": "numeric",
        "value": {
          "tsx": "coalesce($event.sensors.value.Double, todouble($event.sensors.value.Long))"
        },
        "aggregation": {
          "tsx": "avg($value)"
        }
      }
    },
    "projectedVariables": [
      "sensor"
    ]
  }	
events
| where timestamp >= datetime(2021-11-01T00:00:00.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.0000000Z)
| where  deviceId_string == "deviceId1"
| summarize avgSensorValue= avg(coalesce(['sensors.value_double'], todouble(['sensors.value_long']))) by bin(IntervalTs = timestamp, 1m)
| project IntervalTs, avgSensorValue

필터가 있는 AggregateSeries

{
  "aggregateSeries": {
    "timeSeriesId": [
      "deviceId1"
    ],
    "searchSpan": {
      "from": "2021-11-01T00:00:00.0000000Z",
      "to": "2021-11-05T00:00:00.0000000Z"
    },
    "filter": {
      "tsx": "$event.sensors.sensor.String = 'heater' AND $event.sensors.location.String = 'floor1room12'"
    },
    "interval": "PT1M",
    "inlineVariables": {
      "sensor": {
        "kind": "numeric",
        "value": {
          "tsx": "coalesce($event.sensors.value.Double, todouble($event.sensors.value.Long))"
        },
        "aggregation": {
          "tsx": "avg($value)"
        }
      }
    },
    "projectedVariables": [
      "sensor"
    ]
  }
}	
events
| where timestamp >= datetime(2021-11-01T00:00:00.0000000Z) and timestamp < datetime(2021-11-05T00:00:00.0000000Z)
| where  deviceId_string == "deviceId1"
| where ['sensors.sensor_string'] == "heater" and ['sensors.location_string'] == "floor1room12"
| summarize avgSensorValue= avg(coalesce(['sensors.value_double'], todouble(['sensors.value_long']))) by bin(IntervalTs = timestamp, 1m)
| project IntervalTs, avgSensorValue

Power BI

Time Series Insights를 기반으로 한 Power BI 보고서를 마이그레이션하는 자동화된 프로세스는 없습니다. Time Series Insights에 저장된 데이터를 사용하는 모든 쿼리는 Eventhouse마이그레이션해야 합니다.

Power BI에서 효율적인 시계열 보고서를 만들려면 다음 정보 블로그 문서를 참조하는 것이 좋습니다.

Power BI에서 효과적인 시계열 보고서를 만드는 방법에 대한 지침은 이러한 리소스를 참조하세요.

실시간 대시보드

패브릭의 실시간 대시보드는 각 타일에 기본 쿼리와 시각적 표현이 있는 페이지로 구성된 타일 컬렉션입니다. 기본적으로 KQL(Kusto 쿼리 언어) 쿼리를 시각적 개체로 대시보드로 내보내고 나중에 필요에 따라 기본 쿼리 및 시각적 서식을 수정할 수 있습니다. 이 완전히 통합된 대시보드 환경은 데이터 탐색의 용이성 외에도 향상된 쿼리 및 시각화 성능을 제공합니다.

먼저 패브릭 실시간 인텔리전스에서 새 대시보드를 만듭니다. 이 강력한 기능을 사용하면 데이터를 탐색하고, 시각적 개체를 사용자 지정하고, 조건부 서식을 적용하고, 매개 변수를 활용할 수 있습니다. 또한 실시간 대시보드에서 직접 경고를 만들어 모니터링 기능을 향상시킬 수 있습니다. 대시보드를 만드는 방법에 대한 자세한 지침은 공식 설명서를 참조 하세요.