Il presente articolo è stato tradotto automaticamente.

Azure SDK 2.5

Hadoop 作微軟開發人員更容易

Omid Afnan

這一年微軟宣佈 HDInsight 的可用性,其大資料雲計算服務。與此服務你能夠創建 Hadoop,HBase 和現在風暴集群微軟 Azure 的內部。通過使用 Azure 監管中心網站,你可以遵循一些簡單的步驟來創建 Hadoop 集群、 與它關聯 Azure 存儲空間和選擇你需要的核心的數量。與按一下一個按鈕,在幾分鐘內,您有了一個群集配置必要的計算資源與 100%Apache Hadoop 分佈上和在雲中運行。就是這樣:沒有硬體採購,沒有排序通過 Hadoop 棧,無需瞭解如何安裝 Hadoop。你準備好運行大資料查詢 !

你可能會說:這是偉大的......現在做什麼呢?那裡有很多人正在處理大資料的常見情況。您或您的組織可能有某些特定的情況下,在心目中,像物聯網 (物聯網) 遙測嘎吱嘎吱,社交輿情分析或使用者偏好分析。我們的許多客戶感興趣的是一個例子是分析 Web 服務或應用程式日誌。在這篇文章,我要向您展示如何這種情況下可以被引導-捆綁使用 HDInsight 和如何使用Visual Studio最新發佈的微軟 Azure HDInsight 工具來簡化你的開發經驗。

日誌分析場景

大多數應用程式和服務生產資料用於跟蹤使用方式,瞭解故障或執行環境管理一大串。資料流程錯誤日誌、 軟體品質管制 (平方米) 的輸出,點擊流儀器儀錶等 Web 服務器日誌可以很容易積聚在千百萬位元組或每週兆百萬位元組的速率。除了調試應用程式出現故障或服務中斷,這些日誌往往留下觸及由於其龐大的規模和其內容的半結構化的性質。

然而,許多組織正在著手解決這個為了更快地發現品質問題,瞭解客戶使用更好的問題,並最終推高客戶參與度和滿意度。常見的基本情況是分析 Web 服務器日誌來推匯出兩種資訊:

  • 在 Web 網站上發生的特定錯誤的頻率
  • 進入或離開該 Web 網站的流量模式

解析和聚合此日誌資料是允許高度的並行性的活動。理想的是有外包給單獨的伺服器,可以分析、 變換和總結那些記錄的記錄的子集。然後你會合並這些部分的結果來創建最終的匯總的資料。這正是,當然,在 Hadoop MapReduce 引擎做什麼和蜂巢的查詢語言 (HiveQL) 使你能夠表達你目標聚合在一個類似于 SQL 的查詢語法。隨著資料的增長較大,隨著應用的增多,這種方法有效地秤保持整體處理時間在控制之下。

針對 Hadoop MapReduce 程式設計是使用像 HiveQL 高階語言容易得多。Visual Studio中的 HDInsight 工具將此類代碼的管理納入所有開發人員熟悉的標準框架。該工具還會公開與 Hadoop 集群和資料工件以易於理解的方式相關的資訊。在本文的其餘部分中我將步行通過一個簡單的日誌分析案例並突出顯示如何使用這種語言和工具來快速到達一個可行的解決方案。

開始設置

我要去開始通過創建 HDInsight 群集運行我的查詢。群集需要僅當執行查詢並可被刪除時不使用,或者它可以保留運行 (在這種情況下,你繼續支付費用)。我將我的持久性資料 Azure 存儲空間,單獨創建,並隨著時間的推移可以用許多不同的集群。圖 1 顯示在那裡,這樣做是在 Azure 監管中心。

在微軟 Azure 監管中心中創建的 Hadoop 集群
圖 1 在微軟 Azure 監管中心中創建的 Hadoop 集群

創建群集後它將顯示在監管中心中,您可以在其中查看或根據需要刪除它。請注意也是一個查詢主控台,您可以從監管中心提交簡單查詢直接從瀏覽器中打開。

此時你應該已經安裝 Azure SDK 2.5 中,包括Visual Studio的 HDInsight 工具。當您導航到該檔 |新 |專案螢幕上,你會發現一個新的類別的 HDInsight 專案。像其他Visual Studio專案,蜂巢的應用程式專案類型允許在給定語言中指定一個運行應用程式所需的相關檔輕鬆地創建 — — 在這種情況下的 HiveQL。您還會注意到的蜂巢示例專案中包含本文中的代碼示例。使用蜂巢的專案可以讓你輕鬆地組、 保存、 修改和共用相關的查詢。

獲取資料

現在,在Visual Studio,打開伺服器資源管理器流覽 Azure 服務和您的訂閱中的物件。用於導航到 Azure |HDInsight 節點,您可以找到您最近創建的 Hadoop 集群 (稱為博客­在此示例中的分析)。展開此節點可找到兩個孩子:Hadoop 資料庫和預設 blob 存儲您在創建時與該帳戶關聯。Blob 存儲現在已作為您的群集中,同名的預設容器和 Hadoop 應用程式可以讀取和寫入到此容器,使用 Uri 及其子資料夾中提供。

你可以現在將複製或將您的資料載入到此容器中,然後簡單地通過提供正確的 URI 引用的資料。如果您的 Web 網站位於在 Azure 之外,使用 AzCopy 將所需的日誌移動到此存儲容器中,根據需要。如果您有現有的資料在 Azure 中,您可以訪問該資料不進行進一步的複製,即如果您使用 Azure 網站以承載應用程式要簡單得多。在這種情況下,在群集創建時,選擇包含您的 Web 網站的資料作為您的群集的關聯的存儲帳戶的存儲帳戶。你有更多的靈活性,若要添加多個存儲容器,使用 HDInsight 自訂創建選項。在這些情況下可以輕鬆地訪問所需的檔與參考如:

wasb://container@storage.blob.core.windows.net/example/data/filename.ext

這篇文章我想用一些可用的日誌資料作為 HDInsight 中的代碼示例的一部分。您可以導航到你將在這裡找到一套包含樣本,包括該檔的資料夾的 HDISamples 資料夾中的預設容器:

HDISamples/webloganalyticsstorage/webloganalytics/HdiSamples/
  WebsiteLogSampleData/SampleLog/909f2b.log

一旦原始資料不可用,可以將其重新變成一個蜂巢表,可以引用其他蜂巢查詢中為您可以從中選擇的行的行集。要做到這一點您創建它作為一個外部的表,這是在 Hadoop 的中繼資料操作,並且不會更改磁片上的資料。你必須採取的唯一步驟是定義列類型和他們的名字,所以您可以引用熟悉 SQL 風格時尚中的資料。這是大資料模型的一個重要方面 — — 你可以做您的資料的格式和資料本身之間的後期綁定。還有沒有必要創建架構前場,或擔心在載入時清洗您的資料。事實上,那裡是沒有檢查您的資料中的行符合您定義的任何架構。相反,它是你的工作是建立您的查詢,這樣不同版本的資料或缺少資料處理您的業務邏輯的需要。

再次,你可以使用Visual StudioIDE 來簡化這一任務。圖 2 SQL Server工具中顯示表創建工具,你可能看過的那種。只是,可以定義表中的列通過將條目添加到表中的欄區域中,這為提供名稱、 資料類型和附加注釋。除了名字外,沒有別的需要創建一個基本的、 空的表定義。然而,在這種情況下,我想這個定義適用于現有的檔,所以用於外部表屬性指定前面提到的 URI。

創建一個蜂巢表定義
圖 2 創建一個蜂巢表定義

中繼資料操作被通過在 Hadoop 集群中運行 DDL 語句。創建表對話方塊中顯示的 DDL 生成的在這種情況下對工作進行的:

CREATE EXTERNAL TABLE IF NOT EXISTS weblogs (s_date date, s_time string,
  s_sitename string, cs_method string, cs_uristem string,
  cs_uriquery string, s_port int, cs_username string, c_ip string,
  cs_useragent string,
  cs_cookie string, cs_referer string, cs_host string, sc_status int,
  sc_substatus int,
  sc_win32status int, sc_bytes int, cs_bytes int, s_timetaken int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
STORED AS TEXTFILE LOCATION 'wasb://webloganalytics@
  webloganalyticsstorage.blob.core.windows.net/HdiSamples/ 
  WebsiteLogSampleData/SampleLog/'
TBLPROPERTIES ('skip.header.line.count'='2');

DDL 還包括兩個額外的專案。在此示例中,該示例檔使用空格來分隔每一行中的列值,所以我指定欄位分隔符號必須使用行格式子句的空間。蜂巢還允許您設置與表有關的一些特定的中繼資料值。在最後一行的 DDL 我現在跟你們指明文字檔中包含兩行,可以跳過的標題資訊。此 DDL 可以剪切和粘貼到另一個 HiveQL 腳本,或者您可以按提交按鈕創建表的過程揭開序幕。這將導致在被送往將創建的表的 Hadoop 集群的任務。Visual Studio中你會看到一個工作狀態視窗,您可以刷新來跟蹤任務的完成狀態。完成任務後,可以使用伺服器資源管理器以查看新表,流覽其定義或查看 (從內容功能表中的資料庫) 的第一次 100 行。

烹調資料轉化為資訊

你會想知道的關鍵的事情之一就是您的 Web 網站如何工作。起始點可能要看看如何經常在使用者在他們的 HTTP 要求得到用戶端錯誤。你可以看一看不同種類的錯誤受到不同的源引用他們的錯誤類型組和列出他們最受影響的 (最大錯誤計數)。想要保持這些結果,因此,讓我們把它們放在一個新的蜂巢表,你可以使用創建外部表的語句。這一次會通過插入使用 select 語句的計算的值來填充表。圖 3 顯示的代碼是什麼樣子。

圖 3 插入計算的值

DROP TABLE IF EXISTS ClientErrors;               
--create table ClientErrors for storing errors users experienced and their frequencies
CREATE EXTERNAL TABLE ClientErrors(sc_status int, cs_referer string, cs_page string, cnt int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
--populate table ClientErrors with data from table weblogs
INSERT OVERWRITE TABLE ClientErrors
SELECT sc_status,
  cs_referer,
  concat(cs_uristem,'?', regexp_replace(cs_uriquery,
  'X-ARR-LOG-ID=[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}','')) cs_page,
  count(distinct c_ip) as cnt
FROM weblogs
WHERE sc_status >=400 and sc_status < 500
GROUP BY sc_status,
  cs_referer,
  concat(cs_uristem,'?', regexp_replace(cs_uriquery,
  'X-ARR-LOG-ID=[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',''))
ORDER BY cnt;

您會注意到我在做一些清理的資料中。Cs uri 查詢欄位中,我只想看到任何查詢字串 (它傳入的 HTTP 要求,但不關心 X ARR 日誌 ID 資訊存儲在日誌中。所以,我只是替換字串的那部分的一片空白。當然,由於這是聲明式的查詢語句,而不是一個程式,是不可以指定的轉換為 cs uri 查詢欄位使用的重用。然而,我可以指望的查詢執行運行時優化這種情況。

我還想看看我的網站上引用。做到這一點我可以簡單地從 IIS 日誌選擇 cs_referer 欄位,按天和引用計數轉介的數目。再次,我想保留此資料供進一步使用,因此,我創建名為 RefersPerDay 的另一個蜂巢表和存儲查詢結果。圖 4 演示如何做表創建和資料插入。

圖 4 創建表並插入資料

DROP TABLE IF EXISTS RefersPerDay;
--create table RefersPerDay for storing references from external Web sites
CREATE EXTERNAL TABLE IF NOT EXISTS RefersPerDay(year int, month int, day int,
  cs_referer string, cnt int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
--populate table RefersPerDay with data from the weblogs table
INSERT OVERWRITE TABLE RefersPerDay
SELECT year(s_date), month(s_date), day(s_date),
  cs_referer, count(distinct c_ip) as cnt
FROM weblogs
WHERE sc_status >=200 and sc_status <300
GROUP BY s_date, cs_referer
ORDER BY cnt desc;

所有的代碼在圖 3圖 4 可以被放入一個單一的蜂巢 QL 檔。現在可以創建一個新的蜂巢應用程式專案,輸入此代碼和執行查詢。蜂巢專案允許您將保存您的查詢供以後使用。這些例子都十分簡單,但他們基於 IIS 日誌的實際格式。因此,他們應該對你實際的伺服器日誌的工作,充當創建更複雜的分析的基礎。

當然,執行查詢意味著它們提交您在 Azure 中的 Hadoop 集群。要做到這一點,你必須選擇要提交作業的群集。HDInsight 工具列允許您從集群可用清單中選擇您的群集,跨您的訂閱。正如你可以看到在圖 5,選擇了博客­聚類分析。選擇提交時,會將查詢發送到該群集。在這裡我展示先進的提交,您可以在群集中添加生成作業將顯示的易記名稱。這使得它更容易地跟蹤運行的查詢。您還可以進一步添加蜂巢處理器的參數。

提交查詢
圖 5 提交查詢

儘快提交查詢時,您將看到類似于作業摘要視窗圖 6,指示您的查詢的目前狀態,因為它初始化,開始運行,最終完成或失敗。蜂巢查詢轉化為大量的節點的執行可以各處的 MapReduce 任務。這是 Hadoop 處理模型的內在動力在哪裡踢允許大規模測量。在工作的摘要視圖中,您可以看到工作經歷不同比例的地圖和減少階段直到它完成了一起提交的所有查詢。

蜂巢的工作摘要視窗
圖 6 蜂巢的工作摘要視窗

當這項工作完成後時,你可以查看關聯的查詢,並看看作業輸出和異常或錯誤通過下作業詳細資訊的連結。當然,該查詢將匯總的資料放入新表,您可以返回到伺服器資源管理器來看看這些表和它們的內容。您還可以運行新的查詢 — — 那些使用這些新表中的資料進行進一步匯總或聚合。

總結

與 HDInsight 您可以快速、 輕鬆地訪問大量的您已經生成或轉移到雲計算的資料。你可以旋轉了 Hadoop 集群來處理資料,從任何位置訪問資料在 Azure 中。蜂巢允許您指定您的資料的結構,隨變化隨著時間的推移發生在您的資料格式。為進一步的Visual StudioHDInsight 工具允許您以直觀方式探討您的 Hadoop 集群和資料。更重要的是,它允許您創建 Hive 查詢專案和管理它們像任何其他代碼,説明你從工作的簡單,查詢移動到複雜資訊處理隨著時間的推移。通過工具 (如雙電源,提供了與 HDInsight 源的直接連接,使用 HDInsight 創建的聚合資料最好結果進行視覺化顯示。其他功能,比如機器學習,也可以結合這些工具用於擴展解析的可能性。更多關於解決大資料問題使用 Azure 服務觀看此空間。


Omid Afnan 是 Azure 大資料團隊致力於實現的分散式的計算系統和相關的開發工具鏈中的主要程式經理。他生活和工作在中國。聯繫到他在 omafnan@microsoft.com

衷心感謝以下技術專家對本文的審閱:德勒和托尼 · 墨菲
Le Duc (MIcrosoft)。德勒是在 Microsoft HDInsight 大資料團隊的軟體發展人員。加入了微軟之前, 他是一名研究生做程式設計語言和軟體測試的研究。他喜歡讀書,尤其是享有 Arthur 柯南 · 道爾爵士。

托尼 · 墨菲 (微軟)。托尼 · 墨菲一直與微軟 2007 年以來,第一工作組移到 SQL Azure 團隊之前SQL Server引擎。他是微軟的 HDInsight 團隊的創始成員。