BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

访谈与视频辑要:处理大数据——架构、算法与可视化

| 作者 Aslan Brooke 关注 0 他的粉丝 ,译者 沈倩诚 关注 0 他的粉丝 发布于 2013年9月3日. 估计阅读时间: 15 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

摘要:在本视频教程系列中,Paul Dix对大数据进行了探索实践。本教程的前5节课重点介绍了跨多个服务器系统对大批量XML数据进行的端到端处理,这些数据来自于真实的股票交易公告。在最后一节课中Paul讲解了开发可视化视图,从大数据的宏观分析中得到深刻见解。

Paul Dix通过一系列视频教程“处理大数据:架构、算法与可视化”对大数据进行了探索实践。本教程的前5节课重点介绍了跨多个服务器系统对大批量XML数据进行的端到端处理,这些数据来自于真实的股票交易公告。在最后一节课中Paul讲解了开发可视化视图,从大数据的宏观分析中得到深刻见解。在本教程中,Paul使用Ruby作为主要开发语言,在浏览器端使用Javascript。而且,Paul还在GitHub上创建了一个项目,让大家可以查看到他在本次教程中使用到的命令。这样,人们就可以跟着他在AWS云服务上一个Ubuntu Linux实例上安装所有软件。而且,Paul也在相同的实例上开发了所有的程序。

准备编写代码

在教程的前五节课中,几乎所有的代码示例都是使用Ruby语言编写的,这主要是为了从其他技术转移到大数据架构技术时能有一个平稳过渡。Paul坦言,在教程中的某些地方应当使用其他语言来代替Ruby以获得更优的性能。但是,在教程中使用一种编程语言可以帮助读者关注大数据技术的架构而非底层细节。在最后一节课中,Paul使用了Javascript,因为它天生适合于浏览器端编程。

简易的软件安装

教程的前三节课中讲述了如何安装大数据架构中常用的服务器端软件。在教程中用作示例的服务器端软件分别是:Hadoop、Cassandra 和 Kafka。对于其中每个软件的安装,教程都提供了十分详尽的介绍,读者可以跟着Paul一步步进行操作。这些软件相辅相成,而且能够在单个服务器实例中一起运行。Paul使用的是Amazon EC2云服务平台中Ubuntu 12.04 LTS的m1.large实例。在必要的时候,Paul还在教程中使用了一些额外的软件和代码,但这些都不会削弱教程对大数据架构中主要服务器端系统的关注。额外的软件有ZooKeeper、Redis和Sinatra等。

触手可及的大数据架构

教程的读者在进行架构时可以很方便地全部选用开源软件,而且教程中所使用的数据也可以在Internet上下载。教程的开头主要关注了使用Hadoop处理非结构化数据。教程中使用了2011年9月的股票交易公告数据,读者也可以使用最新的2013年3月的股票交易公告数据代替。在Hadoop之后,教程介绍了Cassandra。Cassandra是一个具有高度可扩展性的、面向列的数据库,该数据库可以在超大规模网络中实现高效读写。Paul提到Netflix和Twitter都使用了Cassandra。然后,Paul介绍了高吞吐量的消息系统及其在大数据架构中搬运数据时起到的作用。在对上述主要的服务器端软件进行讲解后,Paul探讨了机器学习相关的算法。该部分教程包含了多种计算k-nearest neighbors的算法,然后对股票交易公告的标签进行了预测分析。教程的最后2节课将大数据架构整合到生产环境中,并使用可视化技术进行宏观层面的分析。

使用Hadoop处理非结构化数据

教程首先明确了一点,即在当下的每个大数据相关议题中都会谈到Hadoop。Paul推荐了Cloudera发布版,因为其安装相对比较容易。Doug Cutting是Cloudera的主架构师,他参与创建了Hadoop这一开源框架,该框架可以作为服务集群运行在多个服务器上以处理海量非结构化数据。Google公司的MapReduce和Goolge文件处理系统(Google File System)为Hadoop提供了灵感。Hadoop的主要组件包括Hadoop内核、Hadoop分布式文件处理系统(HDFS)以及MapReduce。教程中所使用的伪分布式Hadoop使得组件服务的启动方式与真正的分布式Hadoop类似。HDFS提供了一种跨服务器的弹性数据存储系统;MapReduce技术提供了感知数据位置的标准化处理流程:读取数据,对数据进行映射(Map),使用某个键值对数据进行重排,然后对数据进行化简(Reduce)得到最终的输出。在Map和Reduce的过程中,可以将Hadoop与其他软件进行整合,例如数据库,消息总线(message bus)和其他文件系统。而且,有一个包含了一系列技术的扩展系统,这些技术主要包括了Sqoop、Flume、Hive、Pig、Mahout、Datafu和Hue等。

使用Cassandra存储结构化数据

在大数据架构中,Cassandra的主要作用就是存储结构化数据。Paul在教程中推荐了DataStax的Cassandra版本作为参考。Cassandra是一种面向列的数据库,它通过分布式架构提供高可用性及耐用性的服务。它实现了超大规模的集群,并提供一种称作“最终一致性”的一致性类型,这意味着在任何时刻,在不同服务器中的相同数据库条目可以有不同的值。Cassandra最终会将数据收敛到具有一致性的状态,但是在同一时刻,来自系统不同地方的请求对某个数据库条目会读取到不同的值。软件工程师可以通过对Cassandra进行调整,降低其一致性风险以满足期望的使用模式。在教程中Paul使用两种方式实现Cassandra和Ruby的交互,即原生的客户端gem“cassandra”CQL客户端gem“cassandra-cql”。教程带领读者们使用Ruby进行Map和Reduce,并与Cassandra交互。Paul讲解了一种大数据架构,该架构使用Hadoop处理非结构化数据,使用Cassandra处理结构化数据。

使用Kafka进行通信

Paul认为:“合理的大数据架构使用消息系统对输入的数据和事件进行实时处理”。在教程中,Paul以开源的软件平台“Kafka”为例阐述了消息系统在大数据架构中所扮演的角色。Kafka最初由LinkedIn开发,现在已经作为一个Apache项目进行维护。Kafka的开发者最初从性能角度考虑开发了这个系统,如果要在功能性和性能之间进行取舍的话,他们会选择性能。Kafka可以安装在单机上,而且即使在单机上也能保持消息系统中生产者(Producer)、代理(Broker)和消费者(Consumer)的分工。Kafka依赖ZooKeeper辅助判断代理间的上下游关系。通过Ruby的gem“Kafka-rb”可以获取到一个KafkaAPI,该API可以方便地被生产者/消费者调用。Paul确保大家理解了应当由消息的消费者负责处理接收到的消息。而且,他还详细解释了一个使用Redis作为外部系统的算法,这个算法可以防止多个消费者处理同样的消息。

使用机器学习算法对结果进行预测

大数据架构从数据中提炼出有用的信息,并利用模型对这些数据进行预测分类。Paul提到了一种机器学习算法“k-nearest neighbor(k-NN)”,以预测与股票交易有关的公告的标签。讲座也涵盖了两种与距离有关的算法的Ruby实现,即欧几里得算法cosin相似性算法。Paul指出,虽然Ruby语言可以用于对大数据架构进行探索,但是在真实系统中应当使用一种更为高效的语言——例如C语言。该部分包含了很多实际编码的内容,包括创建词表,前面提到的距离算法,如何将公告数据转换为稀疏矩阵以及一个预测公告标签的完整算法。

在生产环境中测试模型

Paul以在整个教程中贯穿使用的“公告问题”作为例子,解释了“交叉验证(Cross-Validation)”的涵义并提供了其Ruby实现。他使用了之前部分的代码,并将其整合到一个发展中的HTTP服务器,即名叫Sinatra的Ruby gem。该服务即成为了一个标签推荐系统。针对Paul所讲的内容,上述代码提供了概念和基本的工程思路。Paul也探讨了如何使用多组数据集去构建标签推荐系统,其中每组数据集构建的系统都是一个新版本。服务器可以对不同版本的推荐系统提供不同的访问接口,但是用户只知道获得了标签推荐的服务,而不会意识到多个推荐系统的存在。这样,就可以对不同版本的推荐系统进行实时切换。网站可以将各版本的标签推荐系统中终端用户选择的标签数据进行汇总,并将其输出到消息总线(Message Bus)中进行带外(Out of Band)处理。通过消息总线收集到的信息被储存在Hadoop中,然后使用存有公告数据的数据库进行交叉验证以判断模型准确率。最后,当前模型的预测结果将被反馈到新一轮模型中。

在浏览器中进行可视化

在最后一堂课中,Paul谈到了如何将大数据架构中得到的数据结果进行可视化,并将其转变为人类能够理解的信息。课程通过必要的JavaScript详细讲解了如何在浏览器中展示时间序列的标签数据。Paul使用了D3 Javascript库创建了柱状图和时间序列图。Paul基于D3库编写的代码是通过公告数据“驱动”的(译者注:D3指Data Driven Document,即数据驱动的文档)。他提到了如下几个D3 Javascript库的函数:求值域(extent),数据映射(scale),选择html元素,以及数据检索。

InfoQ就该系列的视频教程对Paul Dix进行了专访:

InfoQ:在进行大数据项目时,一家公司会面临的最大挑战是哪些? 

Paul:我认为有两个最大的挑战,一个是进行实际操作,另一个是学习针对新工具进行编程。在大数据的情况下探讨的都是分布式系统,所以实际操作是非常棘手的。对于许多公司而言,这是首次尝试运行分布式集群。这种分布式集群并不简单的是一组Web服务器,也不是典型的RDBMS配置的主、从服务器系统。针对大数据系统进行编程的时候,大家总是会寻找MapReduce范式进行批处理,或者是带有消息系统以及实时流处理的模式。这些模式与标准的Web请求、缓存和数据库生命周期差异很大。 

InfoQ:在开发和发布大数据架构的产品时,如何将“持续交付”作为一项软件开发中的实践进行整合?

Paul:在大数据的环境下进行持续交付是很困难的,至少也是代价十分昂贵的。因为在大数据的情况下,许多处理在小规模的数据下都运行得很好,但是一放到整个数据集上就完全失效了。确保持续交付系统运行正常的唯一方式,就是检查

每件事情的正确性,那就需要有一个完全映射了生产环境中数据的系统。这样就会需要同时运行两组集群,代价十分高昂。一种折中的方式就是对生产环境中的数据进行取样,这样就不必保存生产环境的全部数据的镜像。但是,即时这样也要保证取样到足够多的数据,确保在部署到生产环境前就解决了性能问题。

InfoQ:在发布到生产环境之前,大数据架构的组件应当进行怎样的自动化质量监测?

Paul:对所有组件进行“测试驱动的开发(TDD)”显然是一个不错的实践。但是,也有其他一些要点在TDD下无法实现。第一点就是确保在发布到生产环境前测试大规模数据下的性能。另一点仅在创建分类或者聚类之类的预测模型时用到,就是需要理解生产环境下的数据,以便可以针对数据不断迭代模型,并能比较各版本模型间的性能。

视频教程作者简介:

Paul Dix是Errplane的CEO和合创者。Errplane是由美国著名的创业孵化器Y Combinator支持启动的,主要提供对应用程序和基础设施进行检测和监控的服务,并能根据检测到的异常自动发送报警信息。Paul是《Service Oriented Design with Ruby and Rails》一书的作者。他经常在会议和用户组(包括Bacon、Web 2.0、RubyConf、RailsConf和GoRuCo)中进行演讲。Paul是NYC机器学习讨论组(NYC Machine Learning Meetup)的创始人和组织者,该讨论组中有3600多名成员。Paul曾在创业公司和Google、Microsoft和McAfee这样的大公司中任职。他目前居住在纽约。

 

查看原文链接:Interview and Video Review: Working with Big Data: Infrastructure, Algorithms, and Visualizations


感谢马国耀对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT