共用方式為


本文章是由機器翻譯。

Windows Azure 內行人

Hadoop 與 HDInsight:Windows Azure 中的海量資料

Bruno Terkaly
Ricardo Villalobos

Bruno Terkaly, Ricardo Villalobos讓我們開始大膽的斷言:"如果你、 你的啟動或你工作的企業是不將大量的資料保存到磁片的當前和未來的分析,你妥協你作為技術領導者的效力"。是不是愚蠢的直覺本能的一個人,而不是真正定量資料重要的商業決定的依據?

有很大的資料是如此普遍的許多原因。第一,它是驚人地便宜,收集和存儲資料的任何形式,結構化或非結構化,尤其是與 Windows Azure 存儲產品的説明服務。第二,它是經濟能夠利用雲計算提供所需的計算能力 — — 在商品化的硬體上運行 — — 對此資料進行分析。最後,做得好的大資料提供給企業的主要競爭優勢,因為它是可能要從大量的非結構化資料中提取未被發現的資訊。這個月的條的目的是要顯示您可以如何利用 Windows Azure 平臺 — — 尤其是 Windows Azure HDInsight 服務 — — 以解決大資料難題。

幾乎沒有一天不用 IT 新聞有些興奮的故事 — — 有時甚至是在主流媒體 — — 關於大資料。大資料只是指的是如此之大的資料集和複雜就是他們難以進程使用的傳統技術,例如多維資料集、 重復資料正常化關係表和基於批次處理的提取物,變換和載入 (ETL) 引擎,名字幾個。宣導者談論的可能來自各種來源的非結構化資料的提取業務和科學情報:感應器、 Web 日誌、 行動裝置和互聯網的事或物聯網 (基於無線射頻識別技術 [RFID] 如近場通信、 條碼、 快速回應 [QR] 代碼和數位浮水印技術)。物聯網改變大的定義 — — 我們現在說的千兆百萬位元組的資料一天 !

不會大資料辜負所有的炒作嗎?微軟絕對相信它不會和大資料上有大的賭注。第一,大資料導致了更佳的行銷戰略,取代基於直覺決策與分析基於消費者的實際行為。第二,商業領袖可以提高戰略決定,例如將一個新的功能添加到應用程式或 Web 網站,因為他們可以研究大量的設備上運行的應用程式的遙測和使用資料。第三,它可以説明檢測欺詐和評估風險的金融服務。最後,雖然你可能沒有意識到,它是通常用來生成 (認為 Netflix) 的推薦引擎的大資料技術。建議經常被作為一種服務在 Web 上或內加速業務決策的大公司提供。真的很聰明企業甚至不知道什麼類型的問題他們會明天問問資料的今天收集資料。

大資料實際上意味著資料分析,到處都有很長時間。雖然一直有巨大的資料存儲區正在開採的情報,是什麼讓今天的世界上不同是純粹不同的主要非結構化資料。幸運的,像 Windows Azure 的產品帶來偉大經濟學,允許任何擴展他的計算能力,並將它應用於大量的存儲空間,所有人在同一個資料中心。資料科學家描述的新資料現象作為三 Vs — — 速度、 數量和種類。從來沒有與這種速度、 大小和一個定義的結構缺乏已創建的資料。

世界的大資料包含一個龐大而充滿活力的生態系統,但一個開放源碼專案上面他們所有,和那的 Hadoop 的王朝。Hadoop 是事實上的標準的分散式的資料運算。你會發現很好的介紹在 Hadoop bit.ly/PPGvDP:"Hadoop 提供了一個 MapReduce 框架編寫的應用程式處理大量的結構化和半結構化資料並行跨大型集群的機器以非常可靠和容錯的方式"。此外,當你學習更多有關此空間,你很可能會同意MattWinkler(HDInsight 上主要 PM) 的角度來看 Hadoop 是"生態系統相關的專案,除了核心的分散式存儲和 MapReduce 框架"。柏高森在併發資料科學主任和級聯開放源碼專案有朝一日 (cascading.org),表示進一步,"抽象層使人能夠利用 Hadoop 在規模不知道基礎"。

MapReduce 模型

MapReduce 是程式設計模型用於處理龐大的資料集 ; 基本上它是 Hadoop,"程式集語言"所以理解什麼是瞭解 Hadoop 的關鍵因素。MapReduce 演算法寫在JAVA和輸入的資料集分成由地圖的任務的處理方式完全平行的獨立塊。框架對地圖,然後被輸入到 reduce 任務的輸出進行排序。通常情況下,輸入和作業的輸出存儲在檔案系統中。該框架負責調度任務、 監控他們和重新執行失敗的任務。

最終,大多數開發人員不會為 MapReduce 作者低級的JAVA代碼。相反,他們會使用摘要 MapReduce,如蜂巢或豬的複雜性的高級的模具。若要獲得讚賞這種抽象,我們會看看在低級JAVAMapReduce 和高級別配置單元查詢引擎,HDInsight 支援,如何使工作更加容易。

為什麼 HDInsight 嗎?

HDInsight 是一個在全球範圍內分散式的 Microsoft 資料中心中運行的 Apache Hadoop 實現。它是一種服務,使您可以輕鬆地當你需要它,數分鐘內建立一個 Hadoop 群集和運行您的 MapReduce 作業後拆掉它。作為 Windows Azure 業內人士,我們認為有幾個關鍵價值主張的 HDInsight。第一次就是 100%基於 Apache 的、 沒有特別微軟版本,意思隨著 Hadoop 的發展,微軟會擁抱的較新版本。此外,微軟是 Hadoop/Apache 專案的主要貢獻,並提供了大量的查詢工具,配置單元及其查詢優化技術訣竅。

是令人信服的 HDInsight 的第二個方面是它與 Windows Azure Blob,機制來存儲大量的非結構化資料,可以從任意位置在訪問通過 HTTP 或 HTTPS 世界無縫地工程。HDInsight 也使它能夠堅持的SQL Server中的表定義的中繼資料,所以,當關閉群集時,你不需要重新創建您的資料模型從零開始。

圖 1 描繪的廣度和深度的 Hadoop 在 Windows Azure 平臺的支援。


圖 1 在 Windows Azure 的 Hadoop 生態系統

上面是 Windows Azure 存儲系統,其中提供了安全、 可靠的存儲和跨區域包括內置的土力工程處複製為您的資料的冗余。Windows Azure 存儲包括各種功能強大和靈活的存儲機制,如表 (NoSQL,keyvalue 存儲)、 SQL 資料庫、 Blob 和更多。它支援一個休息高傲的 API,允許任何用戶端來執行創建、 讀取、 更新、 刪除 (CRUD) 操作上的文本或二進位資料,如視頻、 音訊和圖像。這意味著任何 HTTP 功能的用戶端可以與存儲系統進行交互。Hadoop 與 Blob,直接交互的方式,但這並不會限制您能夠利用在您自己的代碼內其他的存儲機制。

第二個關鍵領域是 Windows Azure 支援運行 Linux 的虛擬機器 (Vm)。Hadoop 在 Linux 上運行,並利用了JAVA,這使得它能夠設置您自己的單節點或多節點的 Hadoop 集群。這可以是一個巨大省錢和生產力助推器,因為一個單獨的 VM 在 Windows Azure 是非常經濟的。其實可以用手,生成您自己的多節點群集,但它不是瑣碎和不需要的時候你只想驗證一些基本演算法。

設置您自己的 Hadoop 集群容易地開始學習和開發 Hadoop 應用程式。此外,自己執行安裝程式提供寶貴的洞察力 Hadoop 作業的內部工作原理。如果你想要知道如何做到這一點,請參閱博客發佈後,"如何向安裝 Hadoop Linux-Based Windows Azure 虛擬機器上,"在 bit.ly/1am85mU

當然,一旦你需要一個更大的群集,你就會想要利用的 HDInsight,這是今天在預覽模式下可用。要開始,請轉到 Windows Azure 入口網站 (bit.ly/12jt5KW),然後登錄。下一步,選擇資料服務 |HDInsight |快速建立。對於群集名稱,計算的數目將要求您要綁定到的節點 (目前四到 32 節點) 和存儲帳戶。您的存儲帳戶的位置確定您的群集的位置。最後,按一下創建 HDINSIGHT 群集。它將需要 10 到 15 分鐘提供您的群集。到規定的時間到的群集大小無關。

注意您還可以創建和管理 HDInsight 群集以程式設計方式使用 Windows PowerShell,以及通過跨平臺模具上和 Mac-基於 Linux 系統。此外提供便於使用的監管中心,允許您管理群集,包括執行和管理群集上的作業中的許多命令列介面 (CLI) 功能。您可以下載 Windows Azure PowerShell,以及輸入勞工計畫為 Mac 和 Linux 在 bit.ly/ZueX9Z。然後與JAVASDK 和 Hadoop 設置運行 CentOS (Linux 的版本),您的虛擬機器。

探索 Hadoop

實驗與 Hadoop 並瞭解它的力量,我們決定利用公開資料從 data.sfgov.org。具體來說,我們下載包含前三個月的三藩市犯罪資料的檔,用它如是。該檔包括多個 33,000 記錄 (相對較小的大資料標準) 從三藩市警方犯罪附隨報告系統派生。我們的目標是要執行一些簡單的分析,例如計算的數量和類型的犯罪事件。圖 2 演示從匯總的犯罪資料的 Hadoop 作業輸出的一部分。

圖 2 犯罪資料按類型匯總

鎖定汽車的盜竊 2617
惡意破壞 1623
駕駛執照 1230
資助的案例 1195
財產損失 1083

中的代碼圖 3 總結了三個月的罪行。輸入的檔包含多個 30,000 行的資料,而輸出所載僅 1000 條記錄。頂部的那些 1000 條記錄五所示圖 2

圖 3 犯罪的資料匯總的 MapReduceJAVA代碼

// CrimeCount.java
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;
// This code is based on the standard word count examples
// you can find almost everywhere.
// We modify the map function to be able to aggregate based on
// crime type.
// The reduce function as well as main is unchanged,
// except for the name of the job.
public class CrimeCount {
public static class Map extends MapReduceBase implements 
  Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    private String mytoken = null;
    public void map(LongWritable key, Text value,
                    OutputCollector<Text, IntWritable> output,
                    Reporter reporter) throws IOException {
      // Read one line from the input file.
String line = value.toString();
      // Parse the line into separate columns.
String[] myarray = line.split(",");
      // Verify that there are at least three columns.
if(myarray.length >= 2){
        // Grab the third column and increment that
        // crime (i.e.
LOST PROPERTY found, so add 1).
mytoken = myarray[2];
        word.set(mytoken);
        // Add the key/value pair to the output.
output.collect(word, one);
      }
    }
  // A fairly generic implementation of reduce.
public static class Reduce extends MapReduceBase implements Reducer<Text,
    IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterator<IntWritable> values,
                               OutputCollector<Text,
                               IntWritable> output,
                               Reporter reporter) throws IOException {
      // Loop through an aggregate key/value pairs.
int sum = 0;
      while (values.hasNext()) {
        sum += values.
next().get();
      }
      output.collect(key, new IntWritable(sum));
    }
  }
  // Kick off the MapReduce job, specifying the map and reduce
  // construct, as well as input and output parameters.
public static void main(String[] args) throws Exception {
    JobConf conf = new JobConf(CrimeCount.class);
    conf.setJobName("crimecount");
    conf.setOutputKeyClass(Text.class);
    conf.setOutputValueClass(IntWritable.class);
    conf.setMapperClass(Map.class);
    conf.setCombinerClass(Reduce.class);
    conf.setReducerClass(Reduce.class);
    conf.setInputFormat(TextInputFormat.class);
    conf.setOutputFormat(TextOutputFormat.class);
    FileInputFormat.setInputPaths(conf, new Path(args[0]));
    FileOutputFormat.setOutputPath(conf, new Path(args[1]));
    JobClient.runJob(conf);
  }
}

當您保存了中的代碼圖 3 CrimeCount.java,作為您需要編譯、 打包和提交 Hadoop 作業。 圖 4 包含指令用於將輸入的犯罪資料檔案複製到 Hadoop 分散式檔案系統 (HDFS) ; 編譯 CrimeCount.java ; 創建的 crimecount.jar 檔 ; 運行 Hadoop 作業 (使用 crimecount.jar) ; 和查看結果 — — 就是輸出的資料。 要下載整個原始程式碼,轉到 sdrv.ms/16kKJKh,然後用滑鼠右鍵按一下 CrimeCount 資料夾。

圖 4 編譯、 打包和運行 Hadoop 作業

# Make a folder for the input file.
hadoop fs -mkdir /tmp/hadoopjob/crimecount/input
# Copy the data file into the folder.
hadoop fs -put SFPD_Incidents.csv /tmp/hadoopjob/crimecount/input
# Create a folder for the Java output classes.
mkdir crimecount_classes
# Compile the Java source code.
javac -classpath /usr/lib/hadoop/hadoop-common-2.0.0-cdh4.3.0.jar:/usr/lib/hadoop-0.20-mapreduce/hadoop-core-2.0.0-mr1-cdh4.3.0.jar -d crimecount_classes CrimeCount.java
# Create a jar file from the compiled Java code.
jar -cvf crimecount.jar -C crimecount_classes/ .
# Submit the jar file as a Hadoop job, passing in class path as well as
# the input folder and output folder.
# *NOTE* HDInsight users can use \"asv:///SFPD_Incidents.csv,\" instead of
# \"/tmp/hadoopjob/crimecount/input\" if they uploaded the input file
# (SFPD_Incidents.csv) to Windows Azure Storage.
hadoop jar crimecount.jar org.myorg.CrimeCount /tmp/hadoopjob/crimecount/input /tmp/hadoopjob/crimecount/output
# Display the output (the results) from the output folder.
hadoop fs -cat /tmp/hadoopjob/crimecount/output/part-00000

現在你有一個片斷組成一個最小的 Hadoop 環境,和 MapReduceJAVA代碼看起來像以及它如何結束正在提交作為 Hadoop 作業在命令列的想法。 機會是,有些時候你會想要一個群集運行一些大的工作,然後關閉它下來使用較高級別的工具像蜂巢或豬和這是什麼 HDInsight 就是因為它能夠容易,對豬和蜂巢的內置支援與旋轉。

您的群集創建後,您可以工作的 Hadoop 命令提示符或您可以使用入口網站發出蜂巢和豬的查詢。 這些查詢的優點是您不需要深入JAVA和修改 MapReduce 函數、 執行彙編和包裝,或.jar 檔開球的 Hadoop 作業。 雖然你可以在 Hadoop 群集的頭節點的遠端和執行這些任務 (編寫JAVA代碼、 編譯的JAVA代碼,它打包為.jar 檔,和使用的.jar 檔來執行它作為 Hadoop 作業),但這並不是大多數 Hadoop 使用者採用的最佳辦法 — — 它是太低級。

最有效的方式來運行 MapReduce 作業,利用 Windows Azure 門戶在 HDInsight 併發出蜂巢查詢,假定使用豬是較不技術上適當。 可以配置單元視為走文摘編寫 MapReduce 函數在JAVA中的複雜性的較高級別的工具。 它真的只不過是一種類似于 SQL 的指令碼語言。 配置單元中編寫查詢獲取編譯成JAVAMapReduce 函數。 此外,因為微軟已經造成重大的部分優化代碼蜂巢 Apache Hadoop 專案中,機會也在蜂巢中編寫的查詢將會被更好地優化和將在JAVA中比手工的代碼更高效地運行。 你可以找到一個優秀的教程,在 bit.ly/Wzlfbf

我們以前介紹的JAVA和腳本代碼的所有可以替換代碼中的微小數量圖 5。 它是卓越如何三行代碼配置單元中可以有效地實現比那前面的代碼中相同或更好的結果。

圖 5 配置單元查詢代碼以執行 MapReduce

# Hive does a remarkable job of representing native Hadoop data stores
# as relational tables so you can issue SQL-like statements.
# Create a pseudo-table for data loading and querying
CREATE TABLE sfpdcrime(
IncidntNum string,
Category string,
Descript string,
DayOfWeek string,
CrimeDate string,
CrimeTime string,
PdDistrict string,
Resolution string,
Address string,
X string,
Y string,
CrimeLocation string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
# Load data into table.
LOAD DATA INPATH 'asv://sanfrancrime@brunoterkaly.blob.core.windows.
net/SFPD_Incidents.csv' OVERWRITE INTO TABLE sfpdcrime;
select count(*) from sfpdcrime;
# Ad hoc query to aggregate and summarize crime types.
SELECT Descript, COUNT(*) AS cnt FROM sfpdcrime GROUP BY Descript
order by cnt desc;

還有要注意的一些重要事項圖 5。 首先,請注意這些命令看起來像熟悉 SQL 語句,從而允許您創建您可以載入到其中的表結構的資料。 特別有趣的是載入的 Windows Azure 存儲服務中的資料。 請注意在 load 語句中的 asv 首碼圖 5。 ASV 代表 Azure 存儲庫,您可以使用作為存儲機制提供輸入的資料到 Hadoop 作業。 你可能還記得,雖然資源調配過程的 HDInsight 群集,您指定了一個或多個特定的 Windows Azure 存儲服務帳戶。 利用 Windows Azure 存儲服務在 HDInsight 大大的能力提高了管理和執行 Hadoop 作業的效率和可用性。

我們已經只皮毛在這篇文章。 有大量的複雜的工具,它支援並擴展了 HDInsight,以及各種其他開放源碼專案,您可以瞭解在 Apache Hadoop 入口網站 (hadoop.apache.org)。 您的下一步驟應包括觀看通道 9 視頻"使您的應用程式更聰明與 Azure HDInsight"在 bit.ly/19OVzfr。 如果您的目標是要保持競爭力,由作出決定的實際資料和分析的基礎,HDInsight 是有説明。

Hadoop 生態系統

一旦你離開的 MapReduce 作業寫在JAVA中低級世界,你會發現一個令人難以置信,高度進化的工具,大大擴展了 Hadoop 的功能的生態系統。 例如,Cloudera 和 Hortonworks 是基於 Hadoop 的產品、 教育和諮詢服務的業務模式與成功的公司。 許多開放源碼專案提供附加功能,例如,機器學習 (ML) ; 類似于 SQL 的查詢引擎,支援資料匯總和特設查詢 (蜂巢) ; 資料-­流語言支援 (豬) ; 還有更多。 在這裡,只是一些值得一看的專案:Sqoop,豬,Apache 馴象師,級聯和 Oozie。 Microsoft 提供的各種工具,如 Excel 與含 PowerPivot、 權力觀和 ODBC 驅動程式使 Windows 應用程式發出針對配置單中繼資料的查詢。 請訪問 bit.ly/WIeBeq 查看 Hadoop 生態迷人視覺。

Bruno Terkaly 是微軟開發者福音傳教士。他淵博的知識是來自在該領域使用眾多平台、語言、架構、SDK、程式庫和 API 撰寫程式碼的多年經驗。他花時間編寫代碼,寫博客,給現場演示上構建基於雲計算的應用程式,具體地使用 Windows Azure 平臺。您可以閱讀他的博客在 blogs.msdn.com/b/brunoterkaly

Ricardo Villalobos 是經驗豐富的軟體架構設計師,在為供應鏈管理產業的公司設計和建立應用程式擁有 15 以上的經驗。他從達拉斯大學工商管理持有不同的技術認證,以及碩士學位,為微軟工作作為一個雲建築師在 Windows Azure CSV 孵化組。您可以閱讀他的博客在 blog.ricardovillalobos.com

Terkaly 和比利亞洛沃斯共同提出大行業會議。 他們鼓勵讀者的 Windows Azure 內幕交易與他們聯繫的可用性。 也可以撥打 Terkaly bterkaly@microsoft.com 和比利亞洛沃斯也可以撥打 Ricardo.Villalobos@microsoft.com

衷心感謝以下技術專家對本文的審閱:柏森 (併發 Inc.) 和MattWinkler(Microsoft)