大数据是专门为那些传统数据处理方法和技术无法妥善解决的超大数据集而提出的术语。从表意上来看,大数据指的是那些数据规模超大的数据集。但更多的时候,大数据指的是用于预测分析、用户行为分析或者其他的高级数据分析方法。

当我们为解决互联网搜索、城市信息学、商业信息学、气象学、基因学、物理模拟、生物和环境研究等问题,就不可避免地会遇上这种大规模的数据集。这时候,使用传统的数据处理方法已经不能满足实际需求了,所以必须要有不同的技术手段来处理这种「大数据」了。

本文将讨论大数据的基础概念和一些你应该了解的术语,还会展现当前与大数据相关的一些处理流程和技术。

大数据是什么?

大数据是一个很不好定义的术语,根据使用大数据的人不同,大数据代表的意义可能不一定相同。这些人可能是城市管理者、金融分析师、企业管理者、医学研究者等,他们会在自己特定的领域使用大数据解决各自领域里的复杂问题。但不管怎么说,一般来说,大数据指的是:

  • 大量的数据集
  • 用来处理大量数据集的计算策略和技术的种类

这里的大量数据集指的是那些无法使用传统的工具在一台电脑上处理和存储的数据。

大数据有什么不同?

处理大数据的基本需求和处理其他数据的需求是一样的,像是:

  • 数据采集
  • 数据存储
  • 数据分析
  • 数据监控
  • 数据搜索
  • 数据共享
  • 数据传输
  • 数据可视化
  • 数据查询
  • 数据更新
  • 数据信息隐藏

但是如果我们使用处理一般的数据的方法来处理大数据时,就不得不面对数据规模巨大,数据获取和处理速度慢和数据的多样性等问题。这时候我们就需要一个新的系统(解决方案)来解决,这个系统应该可以从大量各种各样的数据中提取出有价值的数据,并描述它们的关联性。

2001 年,Gartner(高德纳公司,美国的一家咨询公司)的分析师 Doug Laney 在一篇论文里首次提出了大数据的概念,并提出了大数据不同于其他数据的三个特性,也被称为「 3V 」特性:

Volume

Volume 指数据量大。随着一大批便宜的信息感知的物联网设备,像智能手机、卫星、照相机、麦克风、射频识别(RFID,Radio-Frequency Identification)设备和无线传感网络,使用的越来越频繁了,我们能获取的数据量也越来越多。

单台电脑的处理与存储能力早已无法满足这种大量数据集的处理需求,于是我们不得不组合多台电脑(一般我们把这种组合计算的多台电脑称为集群)的处理能力来解决这个问题,但随之而来的多台电脑的计算资源管理、分配和定位都是我们不得不解决的问题,所以集群管理和算法越来越关注于将繁重的任务划分为小任务,分发到集群中。

Velocity

Veloctiy 指数据处理的速度。与传统数据处理相比,大数据更关注数据处理的实时性,多个数据源的数据频繁地输入到大数据系统中,还要求数据能立即被处理,在可容忍的时间范围内生成最新的信息。数据的实时处理对数据处理的速度提出了很高的要求,数据处理方式也从批处理模式慢慢过渡到流式处理模式,另外还对系统的容错能力有很高的要求。

Variety

Variety 指数据类型和来源的多样性。与传统数据处理的数据类型(多为结构化数据)相比,大数据处理的数据类型包含了非结构化数据、半结构化数据和结构化数据,它们可能来自内部系统的系统日志、社交媒体、物理传感器或者其他数据提供者。

大多数传统数据处理系统处理的只是已经格式化、标记和组织好的数据,而大数据确实要处理的数据基本都是原生的数据,这些数据的格式化、标记和组织工作都是在进行数据处理的同时在内存中进行。

其他的特性

各种各样的机构和组织针对数据的质量,也提出了对「 3V 」特性的扩充特性,其中得到大多数人认可的有:

  • Veracity: 数据源的真实性显著影响数据的质量
  • Variability: 数据的可变性也会影响数据的质量
  • Value: 数据的价值

大数据的生命周期

说了那么多,我们处理大数据的时候究竟经过了哪些流程呢?虽然实际处理大数据的策略和软件很多,但还是它们还是有一定的共同点的。下面列出的步骤可能不适用所有的场景,但使用还是比较广泛的。

数据处理的一般流程可分为:

  • 获取数据
  • 保存数据
  • 计算和分析数据
  • 可视化数据处理结果

在详细介绍这四个数据处理流程之前,我们先来了解下集群计算。如今大多数大数据解决方案都会采用集群计算作为一种重要策略,而搭建集群通常是一切处理流程的基础。

集群计算

因为大数据的量太大了,单独的计算机大多数情况通常无法完全处理这种数据量。为了更好地满足高存储和计算需求,计算机集群就明显更胜任。

大数据集群软件会结合多台小型计算机,致力于提供大量的便利:

  • 资源池化(Resource Pooling):存储空间、CPU 和内存都是处理大数据集必不可少的资源。
  • 高可用性(High Availability):集群可以提供各种级别的容错处理和保证数据不会因软硬件问题而影响数据的访问和处理,这在我们之前强调数据的实时处理中特别重要。
  • 易扩展性(Easy Scalability):集群让水平扩展变得更简单,你只需要再添加额外的机器到集群中就可以了,并不需要扩展原来机器的资源。

使用集群就需要一个解决方案来管理集群成员,协调数据共享,以及安排每个节点的实际工作。集群成员管理和资源分配都可以通过软件来实现,比如 Hadoop 的 YARN(Yet Another Resource Negotiator,另一种资源协调者)或者 Apache Mesos。

这种组合使用的计算集群通常作为其他软件接口处理数据的基础组件。计算集群常常伴随着分布式存储系统,我们可以在讨论数据存储流程时再来了解分布式存储系统。

获取数据

数据获取是指将原生数据(raw data)导入系统的过程,该过程的复杂性取决于导入数据源的数据类型和数据质量。

可以将数据添加到大数据系统中的一种方法是使用专门的导入工具。比如说 Apache Sqoop 就能取出关系型数据库的数据,导入到大数据系统中。类似的,Apache Flume 和 Apache Chukwa 可以整合的导入系统日志。像 Apache Kafka 这样的排队系统(Queuing systems)也可以用作多个数据源和操作系统的接口。而数据采集框架 Gobblin 就可以再数据导入到系统的最后阶段,用来整合和规格化以上工具生成的数据。

在数据采集阶段,还会执行一些分析、排序和标记操作。这个过程有时也称为 ETL,分别代表提取(extract),转换(transform)和加载(load)。虽然 ETL 通常使用描述数据仓库(data warehousing)的流程,但对于大数据概念也是可以互通的。这个过程通常包含:

  • 格式化输入的数据
  • 分类和标记数据
  • 过滤不需要的数据
  • 验证数据(该流程是可选的,看实际需求)

存储数据

导入系统的数据通常需要保存到磁盘上用于进一步的处理,这听起来是个很简单的过程。这通常就需要升级现有的文件系统,Apache Hadoop 的 HDFS 文件系统就允许把大量的数据写入到集群内多个节点上。 这确保了数据可以被多个计算资源访问,可以加载到集群的 RAM 中进行内存操作,还能优雅地处理组件错误。也可以使用其他文件系统来代替 HDFS,比如 Ceph 和 GlusterFS。

为了获取数据的结构化访问,还可以将数据导入到其他分布式系统。分布式数据库,尤其是 NoSQL 数据库,非常适合担任这个角色,因为分布式数据库也会考虑到容错能力和存储各种各样的数据。根据你想如何组织和展现数据,可以选择不同类型的分布式数据库。

计算和分析数据

一旦数据可用,系统就可以处理数据并输出信息。计算层可能是系统中最多样化的部分,因为需求和最佳方法可能因所需的不同类型的分析而有很大的不同。数据会经常被反复地处理,要么使用一个工具迭代处理,要么使用多个工具来执行不同类型的分析任务。

批处理(Batch processing)是计算大数据的一种方法。这一过程包括任务分片,在单独的机器上调度分片,基于中间结果打乱数据,然后再计算和组合最终结果。这些步骤通常被分别称为分割(splitting)、映射(mapping)、混排(shuffling)、还原(reducing)和装配(assembling),或者合称映射化简(MapReduce)算法。Apache Hadoop 的 MapReduce 也使用了这个策略。批处理在处理数据计算操作比较少的大量数据时非常有用。

尽管批处理对某些类型的数据和计算是很好的,但其他工作需要更及时的实时处理。实时处理要求信息处理完后立即准备好,并要求系统在新信息可用时作出反应。实现一种方法是流处理(stream processing),它运行在由单个项目(item)组成的连续流数据流中。实时处理器的另一个常见特性是内存计算(in-memory computing),它可以处理集群内存中的数据,从而避免写回磁盘。

Apache Storm,Apache Flink 和 Apache Spark 提供了实现实时或接近实时处理的不同方法,可以根据具体的问题选择最好的方法。一般来说,实时处理最适合于分析正在更改或正在快速添加到系统中的较小数据块。

上面的例子都是一些计算框架。然而,在一个大的数据系统中,还有许多其他的计算和分析数据的工具。这些工具经常插入到上面的框架中,并为与底层交互提供额外的接口。例如,Apache Hive 为 Hadoop 提供了一个数据仓库接口,Apache Pig 提供了一个高级的查询接口,而类似SQL的交互与数据的交互可以通过 Apache Drill、Apache Impala、Apache Spark SQL 和 Presto 等项目来实现。对于机器学习,像 Apache SystemML、Apache Mahout 和Apache Spark 的 MLlib 这样的项目是可以用的。对于在大数据生态系统中广泛支持的纯分析编程,R 和 Python 都是很流行的选择。

可视化数据

由于在大数据系统中处理的信息类型,识别数据的发展趋势或变化往往比数据值本身更重要。可视化数据是发现趋势和理解大量数据点的最有用的方法之一。

实时处理经常用于可视化应用程序和服务器的指标(metrics)。数据频繁变化,并且指标的突然增大通常表明对系统或组织的健康有重大影响。在这些情况下,像 Prometheus 这样的项目可以用来处理数据流,它会把数据流当作一个时间序列数据库(time-series database)并且可视化这些信息。

可视化数据的一种流行方式是使用 Elastic Stack,即以前称为 ELK stack 的数据。通过组合了用于数据收集的 Logstash 、用于索引数据的 Elasticsearch 和用于可视化的 KibanaElastic Stack 可以与大型数据系统一起使用,可以可视化地与计算结果或原始度量结果进行交互。使用 Apache Solr 进行索引和称为 BananaKibana 分支可以实现类似的技术栈。这种技术栈叫做 Silk

另一种用于交互式数据科学工作的可视化技术是一个数据「笔记本」。这些项目允许交互式地探索和可视化数据的格式,从而有助于共享、呈现或协作。这种可视化界面的流行例子是 Jupyter NotebookApache Zeppelin

大数据术语表

虽然我们已经解释了在整篇教程中使用的概念,有时使用术语表集中展现专门的术语是有帮助的:

大数据:大数据是数据集的一个统称,它不能合理地由传统计算机或工具来处理,因为它们的体积、速度和多样性。这一术语通常也适用于处理此类数据的技术和策略。

批处理:批处理是一种处理大量数据的计算策略。这通常适用于对非常大的数据集进行操作的对响应时间要求不是很高的工作。批处理过程启动后,要过一段时间,系统才会返回结果。

集群计算:集群计算是池化(集中)多个机器的资源并管理它们的集体能力来完成任务。计算机集群需要一个集群管理层,它处理各个节点之间的通信,并协调工作分配。

数据湖:数据湖(Data Lake)是一个在相对原始状态下收集数据的大型存储库的术语。这常常用来指在一个大数据系统中收集的数据,这些数据可能是非结构化的,而且经常变化。这与数据仓库的本质不同(定义见下)。

数据仓库:数据仓库是大型的、有序的数据仓库,可以用于分析和报告。与数据湖相比,数据仓库由已清理的数据组成,与其他数据源集成,通常是有序的。数据仓库经常是与大数据相关的,但通常是传统系统的组成部分。

数据挖掘:数据挖掘是一种广泛的术语,用于尝试在大量数据中寻找模式。它是试图将大量的数据提炼成一组更容易理解和连贯的信息的过程。

ETL:ETL代表提取、转换和加载。它指的是获取原始数据并为系统的使用做准备的过程。这通常是与数据仓库相关联的过程,但是在大型数据系统的数据导入流水线中也发现了这个过程的特征。

Hadoop:Hadoop 是一个 Apache 项目,在大数据发展早期便开源,并获得了成功。它包含了一个名为 HDFS 的分布式文件系统,在这之上是一个名为 YARN (Yet Another Resource Negotiator,另一个资源协商器) 的集群管理和资源调度程序。批处理能力由 MapReduce 计算引擎提供。在现代 Hadoop 部署中,其他计算和分析系统可以与 MapReduce 一起运行。

内存计算:内存计算是一种将工作数据集完全移动到集群的集体内存中的策略。中间计算结果并不会写到磁盘上,而是保存在内存中。这使像 Apache Spark 这样的内存计算系统与依赖 I/O 操作的计算系统(如 Hadoop 的 MapReduce )相比在计算速度方面拥有巨大的优势。

机器学习:机器学习是设计系统的学习和实践,它可以根据所提供的数据学习、调整和改进。这通常涉及到预测和统计算法的实现,这些算法在更多的数据流通过系统时,能够持续关注“正确”的行为和分析结果(insights)。

Map reduce(大数据算法):Map reduce(这是一种大数据算法,而不是 Hadoop 的 MapReduce 计算引擎)是一个用于在计算集群上调度工作的算法。这个过程包括将问题建立(映射到不同的节点)并计算它们来产生中间结果,将结果混排到一个集合中,然后通过输出每个集合的单个值来减少(化简)结果。

NoSQL:NoSQL是一个广泛的术语,指的是不使用传统关系模型设计的数据库。与关系型数据库相比,NoSQL 数据库有不同的权衡,但由于它们的灵活性和频繁的分布式优先架构,它们常常适合大型数据系统。

流处理:流处理是在单个数据项通过系统时进行计算的实践。这允许对系统提供的数据进行实时分析,并且对于使用高速度量的时间敏感(响应时间快)操作非常有用。

结论

大数据是一个广泛的、快速发展的主题。虽然它并不适合所有类型的计算,但许多企业正在转向针对某些工作类型的大数据,并使用它来补充现有的分析和业务工具。大数据系统特别适合于克服难以检测的模式,并提供对不可能通过常规手段找到的行为分析。通过正确地实现处理大数据的系统,企业可以从已有的数据中获得难以置信的价值。

参考文献