深入了解 Windows Azure

Hadoop 和 HDInsight:Windows Azure 中的大数据

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 框架编写的应用程序处理大量的结构化和半结构化数据并行跨大型集群的机器以非常可靠和容错的方式"。此外,当你学习更多有关此空间,你很可能会同意马特温克勒 (HDInsight 上主要 PM) 的角度来看 Hadoop 是"生态系统相关的项目,除了核心的分布式存储和 MapReduce 框架"。柏高森在并发数据科学主任和级联开放源码项目有朝一日 (cascading.org),表示进一步,"抽象层使人能够利用 Hadoop 在规模不知道基础"。

MapReduce 模型

MapReduce 是编程模型用于处理庞大的数据集 ; 基本上它是 Hadoop,"程序集语言"所以理解什么是了解 Hadoop 的关键因素。MapReduce 算法写在 Java 和输入的数据集分成由地图的任务的处理方式完全平行的独立块。框架对地图,然后被输入到 reduce 任务的输出进行排序。通常情况下,输入和作业的输出存储在文件系统中。该框架负责调度任务、 监控他们和重新执行失败的任务。

最终,大多数开发人员不会为 MapReduce 作者低级的 Java 代码。相反,他们会使用摘要 MapReduce,如蜂巢或猪的复杂性的高级的模具。若要获得赞赏这种抽象,我们会看看在低级 Java MapReduce 和高级别配置单元查询引擎,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。然后设置您运行 CentOS (Linux 的版本),以及 Java SDK 和 Hadoop 的 VM。

探索 Hadoop

实验与 Hadoop 并了解它的力量,我们决定利用公开数据从 data.sfgov.org。具体来说,我们下载包含前三个月的旧金山犯罪数据的文件,用它如是。该文件包括多个 33,000 记录 (相对较小的大数据标准) 从旧金山警方犯罪事件报告系统派生。我们的目标是要执行一些简单的分析,例如计算的数量和类型的犯罪事件。图 2 演示从汇总的犯罪数据的 Hadoop 作业输出的一部分。

图 2 犯罪数据按类型汇总

锁定汽车的盗窃 2617
恶意破坏 1623
驾驶执照 1230
资助的案例 1195
财产损失 1083

中的代码图 3 总结了三个月的罪行。输入的文件包含多个 30,000 行的数据,而输出所载仅 1000 条记录。顶部的那些 1000 条记录五所示图 2

图 3 的 MapReduce Java 代码的犯罪数据汇总

 

    // 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 环境,和 MapReduce Java 代码看起来像以及它如何结束正在提交作为 Hadoop 作业在命令行的想法。 机会是,有些时候你会想要一个群集运行一些大的工作,然后关闭它下来使用较高级别的工具像蜂巢或猪和这是什么 HDInsight 就是因为它能够容易,对猪和蜂巢的内置支持与旋转。

您的群集创建后,您可以工作的 Hadoop 命令提示符或您可以使用门户网站发出蜂巢和猪的查询。 这些查询的优点是您不需要深入 Java 和修改 MapReduce 函数、 执行汇编和包装,或.jar 文件开球的 Hadoop 作业。 虽然你可以在 Hadoop 群集的头节点的远程和执行这些任务 (编写 Java 代码、 编译的 Java 代码,它打包为.jar 文件,和使用的.jar 文件来执行它作为 Hadoop 作业),但这并不是大多数 Hadoop 用户采用的最佳办法 — — 它是太低级。

最有效的方式来运行 MapReduce 作业,利用 Windows Azure 门户在 HDInsight 并发出蜂巢查询,假定使用猪是较不技术上适当。 可以配置单元视为走文摘编写 MapReduce 函数在 Java 中的复杂性的较高级别的工具。 它真的只不过是一种类似于 SQL 的脚本语言。 配置单元中编写查询获取编译成 Java MapReduce 函数。 此外,因为微软已经造成重大的部分优化代码蜂巢 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是 Microsoft 的开发推广人员。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、SDK、库和 API 编写代码的经验。他不辞辛苦,就有关构建基于云的应用程序(特别是使用 Windows Azure 平台)编写代码、发布博客并给予现场演示。您可以阅读他的博客 blogs.msdn.com/b/brunoterkaly

Ricardo Villalobos 是一名资深的软件设计师,具有 15 年为供应链管理行业设计和创建应用程序的经验。他持有几个不同的技术证书,并获得了达拉斯大学商务管理专业的硕士学位。他是 Microsoft 的 Windows Azure CSV 孵化团队的云架构师。您可以阅读他的博客在 blog.ricardovillalobos.com

Terkaly 和比利亚洛沃斯共同提出大行业会议。 他们鼓励读者的 Windows Azure 内幕交易与他们联系的可用性。 也可以拨打 Terkaly bterkaly@microsoft.com 和比利亚洛沃斯也可以拨打 Ricardo.Villalobos@microsoft.com

衷心感谢以下技术专家对本文的审阅:柏森 (并发 Inc.) 和马特 Winkler (Microsoft)