2018 年 6 月

磁碟區 33 編號 6

本文章是由機器翻譯。

Azure Databricks-監視使用 Application Insights Databricks 工作

約瑟夫 Fultz|2018 年 6 月

我們在想要實作,或將其方案移轉至雲端的大型公司著重於資料與分析資料的小組中工作。這些努力會隨附明顯最佳化,以及重新設計以確保它們充分利用雲端提供了各種程度的應用程式的工作。為這些工作可能會針對應用程式本身一樣大,有開始其雲端之旅,組織的其他挑戰他們還必須執行所有工作,以及擴充至雲端其操作功能。為新的技術會出現並發展,這些必須摺疊現有操作的基礎結構,以及在。這是具有 Spark 和 Apache Hadoop 為基礎的解決方案的挑戰。是,Apache Ambari 提供不錯的儀表板且已 API,以公開 (expose) 的指標,但許多組織已投資架設和其他監視,並提供解決方案,例如 Azure Application Insights 充分了解。

假設會從 Azure 事件中心提取訊息,會執行一些初始驗證,然後再卸除到 Azure 儲存體,此時資料會處理透過數個 Spark 工作,如中所示的 WebJob圖 1。目標是可以提供不僅發生什麼事,會顯示的資訊,但程序和商務特定資訊在執行時的單一執行階段儀表板。此外,它適合能夠追蹤該資訊做為整體的處理序的流程,並查看構成的處理程序的詳細資料。

圖 1 單一解決方案,個別處理序另外的步驟

當然,您可以檢視預設度量 WebJobs Application Insights 和 Spark 的部分資訊在作業中 Ambari 進行,並將其 Azure Log Analytics all up with post 特定的深入剖析。不過,我們不想要查看兩個不同的處理程序包含四個步驟。我們想要查看整個程序,而且我們想要執行階段深入資訊和執行階段的警示。

在本文中,我們將逐步考量與規劃使完整專案一起使用 Application Insights。此外,我們將使用 Spark Azure Databricks 的類別具有很棒的一組功能,可協助我們更多輕鬆開發和實施我們的工作流程。

Planning for Application Insights 遙測

我們將不會涵蓋核心概念,但如需這些概念的入門看透過線上文件,網址bit.ly/2FYOCyp。此外,將由 Victor Mushkatin 和 Sergey Kanzhelev 提到良好的發行項最佳化遙測資料收集,"最佳化遙測的 Application Insights"(msdn.com/magazine/mt808502)。在這裡,我們將著重於組織我們筆記本與作業,以便適當追蹤作業、 事件及我們從我們 Databricks 作業傳送之資料的形式。

Databricks,在您可以將工作定義為具有特定參數的筆記本執行。圖 2說明幾個基本的方法來組織 Databricks 筆記本中的工作。

圖 2 Databricks 筆記本工作的基本組織選項

圖 2示範兩種簡單的可能性,其中一項工作定義為單一的筆記本具有多個程式碼區塊或其他工作則會顯示控制項筆記本協調子筆記本執行被呼叫的函式請依序或平行。這不是,透過任何方式,可以使用,只有組織,但足以協助說明如何看待相互關聯。如何執行組織的筆記本和程式碼一定是值得主題,根據大小和作業的本質很大的不同。如果加入一點深度 Databricks 筆記本工作流程上,針對看看部落格文章,「 筆記本工作流程:最簡單的方式實作 Apache Spark 管線 」 (bit.ly/2HOqvTj)。

請注意,已使用不同的操作,可以用來群組事件 Application Insights 中的報告已對齊筆記本組織。Application Insights 中相互關聯是透過兩個屬性來完成:作業識別碼及父作業識別碼。中所見圖 2、 我們想要擷取的所有離散事件和度量的程式碼中封鎖或分隔筆記本,方式是使用不同的作業識別碼的每個區段可以在單一作業的內容。此外,我們想要查看這些個別的大型作業區塊做為整個,我們可以這麼做的內容的父作業識別碼設為相同值的每個作業中的報告的所有標準的一部分。父作業識別碼也可以傳遞在從外部觸發程序進行作業,然後會提供機制來連結所有先前的程序與單一 gestalt 作業所識別的一部分的 Azure Databricks 工作不同的操作父作業在 Application Insights 中的識別碼。

我們已說明幾種情況。重點是,您應該考慮您想要組織您的作業、 事件和度量的整體的工作組織一部分的方式。

將 Application Insights 加入至環境

若要準備環境,您需要在叢集上安裝 Python Application Insights 文件庫中,抓取某些組態設定,加入一些協助程式程式碼。您可以找到 pypi Application Insights (pypi.python.org/pypi/applicationinsights/0.1.0)。若要將它加入至 Databricks,只要您 (我們建立一個具名的 Lib) 的工作區中選擇一個位置和上按一下滑鼠右鍵,並選擇 [建立],然後按一下 [程式庫。一次,您可以輸入 pypi 應用程式名稱,而且 Databricks 下載及安裝套件。您必須決定的最後一個項目是要將程式庫會自動附加至所有叢集。

嘗試減少程式碼以加入至每個筆記本,我們已加入具有幾個 helper 函式的 include 檔案:

def NewTelemetryClient (applicationId, operationId="",  
  parentOperationId=""):
  tc = TelemetryClient(instrumentationKey)
  tc.context.application.id = applicationId
  tc.context.application.ver = '0.0.1'
  tc.context.device.id = 'Databricks notebook'
  tc.context.operation.id = operationId
  tc.context.operation.parentId = parentOperationId
  return tc

這個程式碼包含名為 NewTelemetryClient 建立遙測用戶端物件、 設定某些屬性和返回呼叫端的物件 factory 函式。如您所見,它會使用父作業識別碼和作業識別碼。這會初始化物件,但請注意,是否您需要變更作業的識別碼,您必須直接執行作業筆記本中。也值得注意的,TelemetryClient 建構函式會採用非檢測金鑰,可以在您想要使用 Application Insights 執行個體的屬性刀鋒。我們已靜態指派幾個值所需的範例中,但 TelemetryClient 內容物件都有許多子物件和可用的屬性。如果您需要初始化其他值,這是要執行的地方。將 factory 函式區隔保留混亂的情形,也可以簡化開發人員將筆記本從沙箱原型種程式碼轉換成實作的企業工作類型的實作。 

使用程式庫加入至叢集,以及定義安裝筆記本,我們只需要在執行安裝程式,然後建立入門遙測物件作業筆記本最上方加入線條。我們將會發出 %頂端的筆記本執行命令:

%run ./AppInsightsSetup

在後續的資料格中我們將直接具現化 TelemetryClient 物件的新執行個體。

圖 3顯示我們建立的預測範例的程式碼。有幾件事,請注意這裡。首先,我們要加入的筆記本做為工作初始化後,其作法是經由 dbutils.widgets 物件 Databricks 環境的一部分傳送傳遞一些變數中。因為我們父作業和個別的作業需要幾個識別碼,我們現在要前往並請選取並,它們是空的如果建立並指派新的 Uuid。指定任意的識別碼在此情況下主要是為了更輕鬆地以互動方式執行。不過,其他方法可以採取,例如工作筆記本的程式碼封裝成一系列的函式和執行測試藉由呼叫父函式,並提供特定的識別碼。兩者都很適合充分我們的目的。最後我們會將指派為作業名稱,最後出現在 Application Insights 中為項目可用來檢視和 group by 中所見圖 4

圖 3 筆記本初始化程式碼

baseRatingsFile = dbutils.widgets.get("baseRatingsFile")
newRatingsFile = dbutils.widgets.get("newRatingsFile")
trainOperationId = dbutils.widgets.get("trainOperationId")
parentOperationId = dbutils.widgets.get("parentOperationId")
maxIterations =  int(dbutils.widgets.get("maxIterations"))
numFolds = int(dbutils.widgets.get("numFolds"))
numUserRecommendations = int(
  dbutils.widgets.get("numUserRecommendations"))
predictionFilePath = dbutils.widgets.get("predictionFilePath")
if trainOperationId == "":
  trainOperationId = NewCorrelationId()
if parentOperationId == "":
  parentOperationId = NewCorrelationId()
#setup other needed variables
telemetryClient = NewTelemetryClient("PredictionExample",
  trainOperationId, parentOperationId)
telemetryClient.context.operation.name = "Train Model"

查看圖 3,您可以查看作業名稱已指派值的定型模型。圖 4描述格線中的資料之後,它會被選為群組機制的資料。當我們透過執行多項作業,並指派不同的作業名稱,我們可以出現在檢視中,以及查看。與就地這些動作,我們在檢測要擷取的事件和度量的作業程式碼上運作良好圖形中。

Application Insights 中的作業名稱

圖 4 Application Insights 中的作業名稱

檢測 Databricks 作業程式碼

讓我們逐步解說使用 Application Insights 以監視在 Databricks 典型資料工程工作的範例。在此案例中,我們將使用可公開可用的資料,從 Fannie Mae (bit.ly/2AhL5sS) 和會將原始來源資料採取家族貸款效能上並準備報告和分析。幾個步驟,才能正確地準備資料。透過每個步驟中,我們將擷取的記錄計數和經過時間等資訊,並記錄這些項目在 Application Insights 中。圖 5說明工作中的概要步驟。我們已決定使用頂端的標題圖 5來識別我們個別的作業。

圖 5 資料工程工作流程

此外,我們在所建立的度量具有類似名稱 (例如,寫入的持續時間、 讀取持續期間、 記錄計數) 會報告一組不同的具名事件。這會是重要,在分析中因為我們查看特定的衡量標準,然後檢視這些作業,或事件。中所示圖 5,首先我們內嵌多個資料檔案,然後合併與轉換,和最後寫入至兩個目標位置。完整備妥的資料集保存到長期的 Blob 儲存體和彙總的子集傳送給我們的 RDBMS Azure SQL Database。當然,每個高階步驟內有幾個子步驟。具體來說,我們匯入四個不同的檔案、 將其合併到單一的 Spark 資料框架,並寫入 Blob 儲存體中的原始資料、 彙總的資料集。合併的資料然後讀入從 Blob 儲存體傳回新的資料框架的清理和轉換。若要完成轉換,我們子集的資料框架 (也就是縮小至相關資料行),將資料行重新命名為有意義的名稱,並取代伺服器名稱] 資料行中的 null 值。最終格式的資料保存於 Parquet 檔案格式。在此範例中的最後一個步驟會保存到 Azure SQL Database 的資料。

針對這個 Azure Databricks 工作範例中,我們已經單一的筆記本方法所撰寫的程式碼個別資料格的步驟。一個父代作業設定的每個執行的作業識別碼。(子系) 作業識別碼適用於內工作,每項作業,我們已定義擷取、 轉換和持續性,為這些作業。我們追蹤事件發生的每個作業,在 Application Insights 中的時間戳記、 記錄計數、 持續時間和其他參數錄製工作階段。

就如同舊版的預測範例中,我們新增至叢集的 Python 封裝 「 applicationinsights"、 執行安裝程式筆記本中,和具現化 TelemetryClient 物件的新執行個體。這次我們將 DataEngineeringExample 此執行個體,然後將初始作業名稱為收購,以取得來源的資料準備我們第一系列的步驟:

telemetryClient = NewTelemetryClient(
  "DataEngineeringExample", operationId, parentOperationId)
telemetryClient.context.operation.name = "Acquisition"

接下來,我們會擷取目前的時間,並追蹤我們在 Application Insights,記錄已啟動工作中的第一個事件:

import datetime
jobStartTime = datetime.datetime.now()
jobStartTimeStr = str(jobStartTime)
telemetryClient.track_event('Start Job', { 'Start Time': jobStartTimeStr,
  'perfDataFilePath':perfDataFilePath, 'perfDataFileNamePrefix' :  
  perfDataFileNamePrefix, 'consolidatedDataPath':consolidatedDataPath, 
  'transformedFilePath' : transformedFilePath, 'perfDBConnectionString':
  perfDBConnectionString, 'perfDBTableName': perfDBTableName})
telemetryClient.flush()

這是要設定工作的開始時間為目前時間戳記,並將其記錄在我們的第一個 Application Insights 事件中的程式碼。首先,我們很方便的日期和時間函數,針對匯入的 Python 程式庫的日期時間,然後將變數 jobStartTime 設定為目前的時間戳記。值得注意的是 track_event 的簽章 ([事件名稱] [{props}] {} [度量]) 方法採用參數的事件名稱、 屬性的字典和度量的字典。為了這個目的,時間戳記變數必須是 JSON 可序列化將其併入遙測事件的內容。因此,我們轉換為字串的 jobStartTime 物件,並將值放在新的變數 jobStartTimeStr。在下一個步驟中,我們會傳送我們初始遙測事件與 track_event 方法,將它傳遞為我們的自訂事件名稱開始時間,以及數個參數,我們選取要擷取與此事件。工作中包含了不同的檔案路徑和所參考的連接字串參數。例如,perfDataFilePath 包含來源檔案的位置資料,而 perfDBConnectionString 包含 Azure SQL database,其中,我們將保存的部分資料的連接字串。這是很有幫助的資訊,在此情況下,請參閱 0 記錄連接,或具有設定; 警示我們可以使用快速查看相關作業的遙測,並快速檢查的檔案及/或目前正在存取的資料庫。

現在我們可以繼續透過命令中的資料格筆記本,將類似的事件追蹤程式碼加入至每個步驟中,適用於內部作業的步驟進行一些變更。通常很有幫助使用記錄的計數,整個資料工程工作時要考量資料磁碟區監視效能和資源使用量,因為我們已加入至每個追蹤事件的記錄計數和度量。

圖 6示範一些基本資料轉換,後面的 Application Insights 事件追蹤。例外狀況處理 Try 區塊中,我們對三種類型的轉換次 perfTransformDF 資料框架。我們子集保留相關的資料行的選取群組並捨棄其餘資料框架。我們將伺服器名稱] 資料行中的 null 取代 「 未知 」。 而且,因為原始的資料行名稱 (例如,"_C0,""_C1"),無意義,所以我們將重新命名相關的資料行的子集為有意義的名稱,例如"loan_id"和"loan_age。 」

圖 6 資料轉換事件追蹤程式碼

if notebookError == "":
  try:
    perfTransformedDF = perfTransformedDF['_c0','_c1','_C2','_C3','_C4', \
                                          '_C5','_C6','_C7','_C8','_C9', \
                                          '_C10','_C11','_C12','_C13'] \
      .fillna({'_C2':'UNKNOWN'}) \
      .withColumnRenamed("_C0", "loan_id") \
      .withColumnRenamed("_C1", "period") \
      .withColumnRenamed("_C2", "servicer_name") \
      .withColumnRenamed("_C3", "new_int_rt") \
      .withColumnRenamed("_C4", "act_endg_upb") \
      .withColumnRenamed("_C5", "loan_age") \
      .withColumnRenamed("_C6", "mths_remng") \
      .withColumnRenamed("_C7", "aj_mths_remng") \
      .withColumnRenamed("_C8", "dt_matr") \
      .withColumnRenamed("_C9", "cd_msa") \
      .withColumnRenamed("_C10", "delq_sts") \
      .withColumnRenamed("_C11", "flag_mod") \
      .withColumnRenamed("_C12", "cd_zero_bal") \
      .withColumnRenamed("_C13", "dt_zero_bal")
    print("nulls replaced")
    end = datetime.datetime.now()
    rowCount = perfTransformedDF.count()
    duration = round((end - start).total_seconds(), 1)
    telemetryClient.track_event('Transformation Complete', {}, \
                                { 'Records Transformed': rowCount, \
                                 'Transformation Duration':duration })
    telemetryClient.flush()
  except Exception as e:
    notebookError = str(e)
    telemetryClient.track_exception(e,{"action":"column transform"},{})
else:
  print("command skipped due to previous error")

轉換完成後,我們擷取變數"end"中的目前時間戳記做為時間完成,此步驟計算資料列中的資料框架中。並計算逐步執行持續期間開始和結束時間為基礎。我們傳送至 Application Insights 的遙測 telemetryClient.track_event 方法,使用 「 轉換完成,」 事件名稱和我們包含記錄轉換和轉換持續時間的度量單位。

我們新增至我們筆記本只是為了說明追蹤例外狀況與 Application Insights,以及處理某些非常基本例外狀況。請注意內 except 區塊中圖 6 ,如果攔截例外狀況,我們將呼叫 track_exception 方法。我們的第一個參數傳遞例外狀況,後續的參數是相同的類型如同 track_event,可讓您記錄的事件發生盡可能最多資訊。若要在此處的一個重要事項的原因是目前的內嵌 sql 沒有例外狀況處理語意。因此,可能是最佳類似實際執行作業的 %sql 我們才支援略過,都會加入例外狀況處理。

我們的工程資料作業,包括擷取和持續性作業中的其他步驟,請遵循與自訂度量遙測事件傳送至 Application Insights 轉換程式碼所示的模式。

設定分析和警示

可傳送遙測中的程式碼,我們開啟設定 Application Insights 以建立即時儀表板,請查看事件與關聯的事件的詳細資訊,並設定警示通知和可能根據採取動作的事件觸發程序。

圖 7描述幾個圖表,我們已透過計量瀏覽器刀鋒視窗,然後在 Application Insights 中的 [度量 (預覽)] 刀鋒視窗,並再釘選到我們的 Azure 入口網站儀表板。

Azure 的儀表板上的應用程式 Insights 圖表

圖 7 Azure 儀表板上的應用程式 Insights 圖表

請注意右邊的兩個四分位。右上方顯示的持續時間分組,我們會報告在我們加入追蹤呼叫時遙測的作業名稱的方格。右下角會顯示依我們所用的事件名稱分組的記錄計數和度量單位。有足夠,「 保存至 SQL DB 」 是比其他更低,因為這是小型的已篩選的子集我們的資料寫入 Azure SQL Database 的事件。選擇您的作業群組,作業名稱和事件名稱會表現卓著,此時您以視覺化方式檢視和報告資料的考慮您的作業有意義的方式取得的計劃的重要部分。

左邊的兩個四分位在圖 7顯示使用中的度量 (預覽),有好的組態 UI,以及一些額外的功能,來分割另一個屬性為基礎的度量所建立的圖表。在左上方中,您可以看到的記錄計數,但我們已分割,它使這報告的事件名稱,為不同的事件的記錄計數圖形和資料提供給我們。這裡我們要比較的來源資料中讀取時合併的資料已載入至資料框架,稍後採取的記錄計數時採取的記錄計數。這是一項重要功能,因為記錄計數可能很常見的度量跨父作業中,但是我們想要查看每個作業或事件。

如果您看到其中一個呼叫的一些研究操作圖形中的項目,您可以搜尋所有遙測資料。圖 8描述搜尋和一個圖形,顯示經過一段時間的左窗格中的發生計數的結果。在右窗格中您可以查看所有的事件中記錄的資訊。前文提過 track_event ([name]、 [內容]、 [度量]) 簽章。我們已再保存的詳細資料提取到 SQL 資料庫事件,請參閱上方的自訂屬性。在中間,標示為自訂資料,是您可以在其中找到的自訂度量與遙測傳送。在右下方都是所有相關的項目,其中您可以輕鬆地瀏覽至所有屬於父作業或作業的事件。此外,若要查看所有可用遙測事件的時間在底部沒有一條線。如果您已經為執行階段監視標準化 Application Insights,這會是了解整體系統狀態和事件的運作內容的絕佳工具。需要深入了解廣泛可能有助於解釋記錄計數已關閉或持續時間是 askew。

事件搜尋和詳細資料

圖 8 事件搜尋和詳細資料

我們想要涵蓋 Application Insights 的最後一個項目是設定警示的能力。在圖 9您可以看到警示組態的一部分。我們探討的其他項目,例如我們傳送事件中的自訂資訊顯示在此我們選擇做為警示的準則。

圖 9 度量的警示設定

如您所料,警示可以傳送電子郵件。不過,它也可以呼叫 WebHook,使得 nice 又簡單的方法來採取任何其他您可能想要的動作。Azure 的函式是非常適合這個安裝程式,並可讓您建立任何您喜歡的自訂動作。更有趣的是,Application Insights 直接與邏輯應用程式整合。這可讓原生功能整合,並協調跨越各種不同的整合和 Microsoft Azure 的動作。因此,Application Insights 警示可以通知的人員採取補償及/或修正動作,透過 Logic Apps 協調流程,包括動作和整合與下游和上游系統啟動時。

結論

我們想要確定我們反白顯示的索引鍵的位元的資訊。Application Insights 不是記錄分析解決方案。它可以整合 Azure 記錄分析,提供特定 post 分析和長期的記錄檔保留。Application Insights 是資訊、 insights 和有關最新動態的立即警示,讓您監視及分析您的執行階段作業。直接與其他 Azure 服務和廣泛使用的平台 Sdk 整合可讓剛好適合可協助您推動您的 Azure Databricks 作業。如此一來,監視這些作業無法完成在定址接收器,但而不是完整的解決方案架構內容中。


約瑟夫 Fultz 是在 Microsoft 雲端方案架構設計人員。他的運作方式與 Microsoft 客戶開發架構來解決商務問題列弗 eraging Microsoft Azure。先前,Fultz 所負責的開發和 GM 的汽車共用程式架構 (mavendrive.com)。Con 可識別他在 Twitter 上: @JosephRFultz或透過電子郵件在jofultz@microsoft.com

Ryan 菲 是住在聖路易、 Mo.方案架構設計人員他已建立並開創資料與電腦科技幾乎 20 年,包括遊戲和農林產業廣泛的工作。目前,菲協助部分世界上最大組織現代化企業資料解決方案由 Microsoft Azure 雲端。在 Twitter 上關注他: @murphrp