# Hadoop 使 Microsoft 開發人員的操作更加簡單
**[Omid Afnan](https://msdn.microsoft.com/zh-cn/magazine/ee532098.aspx?sdmr=OmidAfnan&sdmi=authors)**
這一年微軟宣布 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 管理門戶。
?
**圖 1 在微軟 Azure 管理門戶中創建的 Hadoop 集群**
創建群集后它將顯示在管理門戶中,您可以在其中查看或根據需要刪除它。請注意也是一個查詢控制臺,您可以從管理門戶提交簡單查詢直接從瀏覽器中打開。
此時你應該已經安裝 Azure SDK 2.5 中,包括 HDInsight 工具 Visual Studio。當您導航到該文件 |新 |項目屏幕上,你會發現一個新的類別的 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 Studio IDE 來簡化這一任務。**圖 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 Studio 進一步的 HDInsight 工具允許您以直觀方式探討您的 Hadoop 集群和數據。更重要的是,它允許您創建 Hive 查詢項目和管理它們像任何其他代碼,幫助你從工作的簡單,查詢移動到復雜信息處理隨著時間的推移。通過工具 (如雙電源,提供了與 HDInsight 源的直接連接,使用 HDInsight 創建的聚合數據最好結果進行可視化顯示。其他功能,比如機器學習,也可以結合這些工具用于擴展解析的可能性。更多關于解決大數據問題使用 Azure 服務觀看此空間。