Spark在大数据分析中的处理原理与标准分析模型

| 2022-09-22

Spark在大数据分析中的应用与数据管道

Spark

大数据正在从根本上改变组织和企业的运营和竞争方式。大数据和物联网也共享紧密相连的未来,提供数据驱动的分析和洞察力。

Dataframe:

Spark中的DataFrame表示组织在命名列[33]中的分布式数据集合。DataFrame在概念上相当于关系数据库中的一个表、R或Python的Panda DataFrame中的数据帧,但对Spark引擎进行了额外的优化。DataFrames支持并可以从广泛的来源构建,包括结构化数据文件,Hive表,JSON、Parquet、外部数据库、HDFS、S3等。此外,通过spark-SQL的外部数据源API, DataFrames可以扩展到支持任何第三方数据格式或源,包括Avro, CSV, ElasticSearch, Cassandra等。与rdd一样,dataframe的计算是惰性的,而操作是自动并行化的,并分布在集群上。Spark SQL Catalyst优化器利用树形转换框架编织了最先进的优化和代码生成。dataframe可以很容易地与其余的Hadoop生态系统工具和框架通过Spark Core,并提供了一个API,Python, Java, Scala和R编程

创建DF

为了启动任何Spark计算,需要使用sparkR.session()命令初始化基本的Spark会话。

DataFrames为结构化数据操作提供了一种领域特定的语言

Scala、Java、Python和R. DataFrames是Scala和Java中的行数据集api。这些操作也被称为“非类型转换”,这与通常与强类型Scala或Java相关的“类型转换”形成了对比数据集。

类型转换:返回值是dataset

非类型转换:使用API,返回的值是dataframe(dataset的行元素)

SparkSession上的SQL函数的优点是,它允许应用程序以编程方式运行SQL查询,并以DataFrame返回结果。

Spark SQL中的临时视图是会话作用域的,如果创建临时视图的会话终止,临时视图将消失。如果需要一个临时视图来持久化并在所有会话之间共享,直到Spark应用程序终止,那么应该创建一个全局临时视图。全局临时视图绑定到系统保存的数据库global_temp,必须使用限定名来引用它,例如:SELECT * FROM global_temp.employee.

Spark MLlib

Spark MLlib是一个包含各种机器学习(ML)功能的库,针对Spark计算框架进行了优化。MLlib提供大量的机器学习算法和实用工具,包括分类、回归、聚类、关联规则、顺序模式挖掘、集成模型、分解、主题建模和协同过滤。此外,MLlib还支持各种功能,如特征提取、模型评估和验证。所有这些方法都经过设计和优化,以跨Spark集群扩展。Spark的机器学习工具可以构建各种管道,包括数据摄入和特征转换、数据标准化、规范化、汇总统计、降维等任务,以及模型构建、超参数调优和评估。最后,Spark通过保存和加载模型和管道实现了机器学习持久性

MLlib的能力使大量主要机器学习算法的利用,包括回归(线性,广义线性,逻辑),分类算法(包括决策树,随机森林,梯度增强树,多层感知器,支持向量机,朴素贝叶斯等),聚类

(K-means, K-medoids,平分K-means,)潜Dirichlet分配,高斯混合模型,协同过滤。此外,它还支持特征提取、变换、降维、选择,以及设计、构造、评价等功能。

MLlib的设计有许多优点,包括简单性、可伸缩性和兼容性。Spark的api设计简单,提供的实用程序看起来和典型的数据科学工具(如R和Python)很像。通过有效的参数调整,机器学习方法可以很容易地执行。此外,MLlib提供了无缝的可伸缩性,允许在大型计算集群上执行ML方法,对代码进行最小或不进行调整。Spark兼容R、Python pandas、scikit-learn和许多其他流行的ML工具。Spark的DataFrames和MLlib提供与现有工作流程集成的通用数据科学工具。

大多数机器学习实验的目标是创建一个精确的模型,以预测未来的未知数据。为了实现这一目标,使用训练数据集对模型进行“训练”,并使用测试数据集对训练数据集上获得的模型进行评估和验证。

利用PySpark MLlib特性,传统的机器学习方法现在可以扩展到大型和复杂的数据集。例如,我们可以使用传统的Iris数据集来演示MLlib在Spark上开发预测模型的能力。

批处理和流处理

在研究Spark Streaming如何工作的细节之前,应该定义批处理和流处理之间的区别。通常,批处理一次性将大量数据元素收集到一个组中。然后在指定的时间以批处理的方式同时处理整个组。批量计算的时间可以用多种方法来量化。计算时间可以根据预先指定的预定时间间隔或特定的触发条件(包括收集的数据的若干元素或数量)来确定。在不需要实时分析的情况下,批数据处理是处理一段时间内收集的大量数据的一种非常有效的方法。在历史上,这一直是最常见的数据处理方法。

传统数据库和数据仓库(包括Hadoop)是批处理系统处理的常见例子。流处理通常使用连续数据,是实现快速数据处理的关键组件。流可以在几乎瞬间对从一个设备到另一个设备的数据流进行数据分析。这种连续计算方法发生在数据流经系统时,输出不需要时间限制。由于接近即时的数据流,系统不需要存储大量的数据。

流方法在到达时处理每一个新的单独的数据块。与批处理相反,不需要等待下一个批处理间隔。术语微批处理经常与流联系在一起,当批处理较小或以较小的间隔处理时。尽管处理可能以高频率发生,但在微批处理范例中,数据仍然是一次处理一批。Spark Streaming是一个支持微批处理的系统的例子。如果事件非常频繁,特别是在快速的时间间隔内,并且需要快速检测和响应,那么流处理是非常有益的。

Spark Streaming

Spark Streaming是一个Spark组件,支持实时数据流处理,支持可扩展、高吞吐量、容错的数据流处理。Spark Streaming是一个Spark组件,通过提供一个类似于Spark的API来操作数据流,从而支持实时数据流的处理核心的抽样API。它支持可扩展、高吞吐量、容错的数据流处理。Spark Streaming的API支持与Spark Core相同的高度容错性、吞吐量和可伸缩性。Spark Streaming接收输入数据流,并将它们分成称为DStreams的批。DStreams可以从很多来源创建,比如Kafka, Flume和Kinesis,或者通过在其他DStreams上应用操作来创建。

Spark 功能

Spark Streaming接收输入的数据流,并对数据进行批量处理。然后,Spark引擎对这些批进行处理,以生成最终的批结果流。离散流或DStream是Spark Streaming支持的核心概念。

它表示连续的数据流。DStream由一系列连续的rdd表示。应用于DStreams的操作转换为底层rdd上的操作。Spark Streaming将数据离散成小的微批。Spark Streaming receiver并行地接受数据,并缓冲到工作节点的内存中,Spark引擎处理这些批,同时优化延迟,并将结果输出到外部系统

Spark Streaming基于流中的数据维护状态,通常称为有状态计算。此外,Spark Streaming允许窗口操作,其中可以使用指定的时间框架对数据执行操作。利用窗口长度和滑动间隔参数,利用窗口中的滑动时间间隔来更新窗口。当窗口滑动到源DStream上时,底层rdd被组合并操作以生成窗口DStream的rdd。根据数据所在位置和可用资源动态分配Spark任务,实现负载均衡和故障恢复。Spark Streaming的数据流可以来源于源数据流,也可以来源于通过转换输入流产生的处理数据流。在内部, DStream由一系列连续的rdd表示。每个输入DStream都与Receiver相关联,Receiver从源接收数据并将其存储在执行器内存中。

类似于Spark rdd, Spark转换支持DStream修改。输入DStreams支持许多适用于rdd的转换,包括map、filter、count、countbyvalue、reduce、union等。Spark Streaming支持两类内置流源:基本和高级源。基本源通常在StreamingContext API中直接可用,比如文件系统和套接字连接。高级资源通常包括Kafka, Flume,Kinesis等,并可通过额外的实用工具类。这需要通过链接工具链接额外的依赖项。如果应用程序需要多个数据流并行,可以创建多个DStreams。可以创建多个接收器,同时接收多个数据流,通常需要分配多个核来处理所有接收器的数据

DStream向外部系统(包括HDFS、数据库或其他文件系统)的数据输出使用的是输出操作。输出操作触发由print、saveAsTextFiles、saveAsObjectFiles、saveAsHadoopFiles等操作之一定义的DStream转换的实际执行。DStreams类似于rdd,通过输出操作惰性地执行。

下面的示例演示了Spark Streaming的一个基本应用:计算从TCP套接字侦听的数据服务器接收到的文本数据的字数

然后输入你想被计算的文本,屏幕上的输出将显示所统计的字数

这个示例演示了将数据输入到离散流框架。DStreams允许用户捕获数据并执行许多不同类型的计算,如本例中通过对传入数据集进行简单的单词计数所示。DStreaming和rdd是一组关键的构建块,可以使用它们(Spark和Spark Streaming)构建复杂的流应用程序。

Data Pipeline

对于大数据,可以考虑几个不同的成熟度级别分析。有很多组织(DAMM, Gartner, IIA, HIMMS,TDWI、IBM等),它们已经定义了自己的分析成熟度级别版本。然而,他们都统一有三个总体层次。所有的组织都是从原始数据开始,然后首先转移到清洁、标准化和有组织的数据。他们接下来发展到基本和高级报告。最后,他们可能最终会发展到建立预测模型。这个过程强调了分析从描述性到诊断性,再到预测性,最后到说明性建模的复杂程度。描述性分析有助于理解过去发生了什么,而诊断分析则着眼于某些事情可能发生的原因。预测分析技术建立机器学习模型来预测将要发生的事情。然后,这些模型可以被输入到说明性模型中,说明性模型通过建议在特定条件下应该做什么,直接将这个过程带入决策和行动中。

开发预测性和规定性模型

约翰·奈斯比特(John Naisbitt)有句名言:“我们淹没在数据中,却渴望知识!”这是一句伟大的名言,如果你想到它是在1982年说的,那就更令人惊讶了。他的观察在今天更加正确。虽然数据的规模已经发生了变化,但在大数据世界的混乱中寻找意义的技能、工具和技术的需求并没有改变。收集、存储和保护大数据的成本很高,而真正的投资回报率(ROI)取决于从大数据中提取可操作性的数据的能力。数据科学领域是研究数据洪水的一个角度。数据科学家努力提取数据的意义,并讲述数据的故事,以提供洞察力和指导。数据科学家已经建立了能够在大量数据中发现关系和模式的技术,然后可以利用这些技术来预测未来的行为和事件。例如,利用机器学习方法的预测建模技术的发展是由解决数据爆炸的必要性驱动的。这种技术从经验中学习,并预测未来的结果,以推动更好的业务决策。它从原始数据中提取规则、规则、模式和约束,目标是从数据中发现隐式的、先前未知的和意外的有价值的信息。

数据挖掘的跨行业标准流程(CRISP-DM)

确定此数据挖掘过程的六个主要阶段。

  1. 项目理解阶段: 在进行预测模型开发时,深入理解应用领域的特征是至关重要的。一旦业务问题和整个项目目标得到充分理解,项目就进入数据理解阶段。创建适当的数据集是本阶段的目标。
  2. 数据理解阶段: 对项目的需求进行了解后开始收集海量数据,对于这些数据而言,它可能涉及将来自不同来源和不同类型的数据放在一起,以便能够开发全面的模型。数据的速率、数量和质量都要仔细考虑。此阶段的执行可能需要基于数据可用性、资源限制等因素重新考虑业务理解。即该阶段不仅会推向下一阶段的输入,也会因情况回滚至第一阶段重新考虑或使用该结果再修订上一阶段的内容。
  3. 数据准备阶段:数据准备阶段通常是流程中最耗费时间和资源密集的阶段。在这一阶段进行的数据预处理和清理可能需要相当大的努力,不应低估。仔细的、高级的数据收集和存储计划可以帮助最小化在此阶段所花费的精力。
  4. 建模阶段:一旦数据准备充分,就可以启动建模阶段。然而,典型的情况是,数据准备工作将继续进行,并根据建模过程中所取得的进展和获得的见解进行修改。建模阶段包括对数据集应用一种或多种数据科学技术,以提取可操作的洞察力。即该阶段不仅会推向下一阶段的输入,也会因情况回滚至第一阶段重新考虑或使用该结果再修订上一阶段的内容。建模阶段和数据准备阶段是可以并行的,但是要求达到建模所需的一定数据量,然后可以互相反馈从而提升建模精确度。
  5. 评价阶段: 一旦模型在建模阶段被开发或训练,评估阶段就会在原始业务理解的上下文中考虑模型的价值。通常,需要对过程进行多次迭代才能得到一个满意的数据挖掘解决方案。
  6. 部署阶段:最后,部署阶段处理组织内模型的实现并完成流程。除了数据科学团队之外,这可能还涉及到来自各种团体的多个人员和专业知识。