此文章由机器翻译。

Azure SDK 2.5

Hadoop 使 Microsoft 开发人员的操作更加简单

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 中,包括 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 服务观看此空间。


Omid Afnan 是 Azure 大数据团队致力于实现的分布式的计算系统和相关的开发工具链中的主要程序经理。他生活和工作在中国。联系到他在 omafnan@microsoft.com

衷心感谢以下技术专家参与本文的审阅:德勒和托尼 · 墨菲
Le Duc (MIcrosoft)。德勒是在 Microsoft HDInsight 大数据团队的软件开发人员。加入了微软之前, 他是一名研究生做编程语言和软件测试的研究。他喜欢读书,尤其是享有 Arthur 柯南 · 道尔爵士。

托尼 · 墨菲 (微软)。托尼 · 墨菲一直与微软 2007 年以来,第一工作组移到 SQL Azure 团队之前,SQL Server 引擎。他是微软的 HDInsight 团队的创始成员。