大数据入门与实战-Spark上手

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据入门与实战-Spark上手

1 Spark简介


1.1 引言

行业正在广泛使用Hadoop来分析他们的数据集。原因是Hadoop框架基于简单的编程模型(MapReduce),它使计算解决方案具有可扩展性,灵活性,容错性和成本效益。在这里,主要关注的是在查询之间的等待时间和运行程序的等待时间方面保持处理大型数据集的速度。



Spark由Apache Software Foundation引入,用于加速Hadoop计算计算软件过程。

与普遍看法相反,Spark不是Hadoop的修改版本,并且实际上并不依赖于Hadoop,因为它有自己的集群管理。Hadoop只是实现Spark的方法之一。

Spark以两种方式使用Hadoop - 一种是存储,另一种是处理。由于Spark有自己的集群管理计算,因此它仅将Hadoop用于存储目的。


1.2 Apache Spark


Apache Spark是一种闪电般快速的集群计算技术,专为快速计算而设计。它基于Hadoop MapReduce,它扩展了MapReduce模型,以便有效地将其用于更多类型的计算,包括交互式查询和流处理。Spark的主要特性是其内存中的集群计算,可以提高应用程序的处理速度。


Spark旨在涵盖广泛的工作负载,如批处理应用程序,迭代算法,交互式查询和流式处理。除了在相应的系统中支持所有这些工作负载之外,它还减少了维护单独工具的管理负担。


1.3 Apache Spark的演变


Spark是2009年在加州大学伯克利分校的Matei Zaharia的AMPLab开发的Hadoop子项目之一。它是在2010年根据BSD许可证开源的。它于2013年被捐赠给Apache软件基金会,现在Apache Spark已成为2014年2月的顶级Apache项目。



10.png


1.4 Apache Spark的功能


Apache Spark具有以下功能。

  • 速度 - Spark有助于在Hadoop集群中运行应用程序,内存速度提高100倍,在磁盘上运行速度提高10倍。这可以通过减少对磁盘的读/写操作次数来实现。它将中间处理数据存储在存储器中。
  • 支持多种语言 --Spark提供Java,Scala或Python内置API。因此,您可以用不同的语言编写应用程序。Spark提供了80个用于交互式查询的高级操作员。
  • 高级分析 - Spark不仅支持'Map'和'reduce'。它还支持SQL查询,流数据,机器学习(ML)和图形算法。


1.5 Spark建立在Hadoop上


下图显示了如何使用Hadoop组件构建Spark的三种方法。


11.png


Spark部署有三种方式,如下所述。


  • 独立 - Spark Standalone部署意味着Spark占据了HDFS(Hadoop分布式文件系统)之上的位置,并且明确地为HDFS分配了空间。在这里,Spark和MapReduce将并排运行,以涵盖集群上的所有火花作业。
  • Hadoop Yarn - Hadoop Yarn部署意味着,简单地说,在Yarn上运行spark,无需任何预安装或root访问。它有助于将Spark集成到Hadoop生态系统或Hadoop堆栈中。它允许其他组件在堆栈上运行。
  • MapReduce(SIMR)中的 Spark - 除了独立部署之外,MapReduce中的Spark还用于启动spark作业。使用SIMR,用户可以启动Spark并使用其shell而无需任何管理访问权限。


1.6 Spark的组件


下图描绘了Spark的不同组件


12.png


  • Apache Spark Core

Spark Core是Spark平台的基础通用执行引擎,所有其他功能都基于此构建。它在外部存储系统中提供内存计算和引用数据集。

  • Spark SQL

Spark SQL是Spark Core之上的一个组件,它引入了一个名为SchemaRDD的新数据抽象,它为结构化和半结构化数据提供支持。

  • Spark Streaming

Spark Streaming利用Spark Core的快速调度功能来执行流分析。它以小批量方式提取数据,并对这些小批量数据执行RDD(弹性分布式数据集)转换。

  • MLlib(机器学习库)

由于基于分布式内存的Spark架构,MLlib是Spark之上的分布式机器学习框架。根据基准测试,MLlib开发人员针对交替最小二乘(ALS)实现进行了测试。Spark MLlib的速度是基于Hadoop磁盘的Apache Mahout版本的9倍(在Mahout获得Spark界面之前)。

  • GraphX

GraphX是Spark上的分布式图形处理框架。它提供了一个表达图形计算的API,可以使用Pregel抽象API对用户定义的图形进行建模。它还为此抽象提供了优化的运行时。


2 Apache Spark - RDD


2. 1 Resilient Distributed Datasets


弹性分布式数据集(RDD )是Spark的基本数据结构。它是一个不可变的分布式对象集合。RDD中的每个数据集被划分为逻辑分区,其可以在集群的不同节点上计算。RDD可以包含任何类型的Python,Java或Scala对象,包括用户定义的类。


形式上,RDD是只读的分区记录集合。可以通过对稳定存储或其他RDD上的数据的确定性操作来创建RDD。RDD是一个容错的容错集合,可以并行操作。


有两种方法可以创建RDD - 在驱动程序中并行化现有集合,或在外部存储系统中引用数据集,例如共享文件系统,HDFS,HBase或提供Hadoop输入格式的任何数据源。

Spark利用RDD的概念来实现更快,更高效的MapReduce操作。让我们首先讨论MapReduce操作是如何发生的以及为什么它们不那么有效。


2. 2  MapReduce中的数据共享速度很慢


MapReduce被广泛用于在集群上使用并行分布式算法处理和生成大型数据集。它允许用户使用一组高级操作符编写并行计算,而不必担心工作分配和容错。


不幸的是,在大多数当前框架中,在计算之间重用数据的唯一方法(Ex-两个MapReduce作业之间)是将其写入外部稳定存储系统(Ex-HDFS)。虽然这个框架提供了许多用于访问集群计算资源的抽象,但用户仍然需要更多。


这两个迭代交互式应用程序需要跨并行作业更快速的数据共享。由于复制,序列化磁盘IO,MapReduce中的数据共享速度很慢。关于存储系统,大多数Hadoop应用程序,他们花费超过90%的时间进行HDFS读写操作。


2. 3 MapReduce上的迭代操作


在多阶段应用程序中跨多个计算重用中间结果。下图说明了在MapReduce上执行迭代操作时当前框架的工作原理。由于数据复制,磁盘I / O和序列化,这会导致大量开销,这会使系统变慢。


13.png


2. 4  MapReduce上的交互操作


用户对同一数据子集运行即席查询。每个查询都将在稳定存储上执行磁盘I / O,这可以控制应用程序执行时间。


下图说明了在MapReduce上执行交互式查询时当前框架的工作原理。

14.png

MapReduce上的交互操作


2. 5 使用Spark RDD进行数据共享


由于复制,序列化磁盘IO,MapReduce中的数据共享速度很慢。大多数Hadoop应用程序,他们花费超过90%的时间进行HDFS读写操作。


认识到这个问题,研究人员开发了一个名为Apache Spark的专用框架。火花的关键思想是- [R esilient d istributed d atasets(RDD); 它支持内存处理计算。这意味着,它将内存状态存储为作业中的对象,并且对象可在这些作业之间共享。内存中的数据共享比网络和磁盘快10到100倍。


现在让我们试着找出Spark RDD中迭代和交互操作的发生方式。


2. 6 Spark RDD的迭代操作


下面给出的插图显示了Spark RDD的迭代操作。它将中间结果存储在分布式存储器中而不是稳定存储(磁盘)中,从而使系统更快。


- 如果分布式内存(RAM)不足以存储中间结果(JOB的状态),则它会将这些结果存储在磁盘上。


15.png

Spark RDD的迭代操作


2. 7  Spark RDD的交互操作


此图显示了Spark RDD上的交互操作。如果对同一组数据重复运行不同的查询,则可以将此特定数据保存在内存中以获得更好的执行时间。


16.png

Spark RDD的交互操作


默认情况下,每次对其执行操作时,都可以重新计算每个转换后的RDD。但是,您也可以在内存中保留 RDD,在这种情况下,Spark会在群集上保留元素,以便在下次查询时更快地访问。还支持在磁盘上保留RDD或在多个节点上复制。


3 Spark安装


这个步骤不再赘述,google一下相关的文章比较多,我推荐一篇文章Spark学习之路 (五)Spark伪分布式安装。按照上面的步骤一步一步来,不要跳过步骤,然后安装时比如路径或者ip端口可以根据自己的实际情况更改。


安装成功之后,执行sudo sbin/start-all.sh,可以看到如下进程:


17.png


通过http://192.168.31.135:8080,查看Web界面


18.png


4 Spark 核心编程


Spark Core是整个项目的基础。它提供分布式任务调度,调度和基本I / O功能。Spark使用称为RDD(弹性分布式数据集)的专用基础数据结构,它是跨机器分区的数据的逻辑集合。RDD可以通过两种方式创建; 一种是通过引用外部存储系统中的数据集,另一种是通过在现有RDD上应用转换(例如map,filter,reducer,join)。


4.1 Spark Shell


Spark提供了一个交互式shell - 一种以交互方式分析数据的强大工具。它以Scala或Python语言提供。Spark的主要抽象是一个名为Resilient Distributed Dataset(RDD)的分布式项目集合。可以从Hadoop输入格式(例如HDFS文件)或通过转换其他RDD来创建RDD。


4.2 打开Spark Shell


以下命令用于打开Spark shell。


$ spark-shell


4.3 创建简单的RDD


我们可以从文本文件中创建一个简单的RDD。使用以下命令创建简单的RDD。


scala> val inputfile = sc.textFile(“input.txt”)


Spark RDD API 提供了了一些转换和操作来处理RDD。


4.4 RDD 转换(RDD Transformations)


RDD转换返回指向新RDD的指针,并允许您在RDD之间创建依赖关系。依赖关系链中的每个RDD(依赖关系字符串)都有一个用于计算其数据的函数,并且具有指向其父RDD的指针(依赖关系)。

Spark很懒,所以除非你调用一些会触发作业创建和执行的转换或动作,否则不执行任何操作。请查看以下单词计数示例的片段。

因此,RDD转换不是一组数据,而是程序中的一个步骤(可能是唯一的步骤),告诉Spark如何获取数据以及如何处理数据。

下面给出了RDD转换列表:

  • map(func):返回一个新的分布式数据集,它是通过函数func传递的每个元素而形成的。
  • filter(func):返回通过选择func返回true的源元素形成的新数据集,也就是返回符合某种条件的数据集。
  • flatMap(func):与map类似,但每个输入项可以映射到0个或更多输出项(因此func应该返回Seq而不是单个项)。
  • ...

其他的这里不再一一列举,想要了解更多的,大家可以看下:Spark核心编程


4.5 RDD 操作


-reduce(func):使用函数func(它接受两个参数并返回一个)来聚合数据集的元素。该函数应该是可交换的和关联的,以便可以并行正确计算。

  • collect():以数组的形式返回数据集的所有元素。在过滤器或其他返回足够小的数据子集的操作之后,这通常很有用。
  • count():返回数据集中的元素的个数。
  • first():返回数据集的第一个元素(类似于take(1))。
  • take(n):返回数据集的前n个元素的数组。
  • ...


5 RDD 编程实例


5.1 单词计数实例


考虑单词计数示例 - 它计算出现在文档中的每个单词。将以下文本视为输入,并将其另存为input.txt文件。


people are not as beautiful as they look, 
as they walk or as they talk.
they are only as beautiful  as they love, 
as they care as they share.


19.png


5.2 打开Spark-Shell


以下命令用于打开spark shell。通常,使用Scala构建spark。因此,Spark程序在Scala环境中运行。


$ spark-shell


如果Spark shell成功打开,那么您将找到以下输出。查看输出的最后一行“可用作sc的Spark上下文”意味着Spark容器会自动创建名为sc的 spark上下文对象。在开始程序的第一步之前,应该创建SparkContext对象。


20.png


5.3 创建一个RDD


首先,我们必须使用Spark-Scala API读取输入文件并创建RDD。


以下命令用于从给定位置读取文件。这里,使用inputfile的名称创建新的RDD。在textFile(“”)方法中作为参数给出的String是输入文件名的绝对路径。但是,如果仅给出文件名,则表示输入文件位于当前位置。


21.png


5.4 执行一个单词计数转换


我们的目的是统计一个文件的单词个数。首先创建一个flat map将文本的每行用空格分割。


然后使用 (map(word ⇒ (word, 1))将每个词作为keyvalue1 ( = )

最后,通过添加类似键的值(reduceByKey(_ + _))来减少这些键.

以下命令用于执行字数统计逻辑。执行此操作后,您将找不到任何输出,因为这不是一个动作,这是一个转换; 指向一个新的RDD或告诉火花如何处理给定的数据)


val counts = inputfile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_);


22.png


5.5 当前的RDD


使用RDD时,如果您想了解当前的RDD,请使用以下命令。它将向您显示有关当前RDD及其调试依赖项的描述。


counts.toDebugString

23.png


5.6 缓存转换


可以使用persist()或cache()方法标记要保留的RDD。第一次在动作中计算它,它将保留在节点的内存中。使用以下命令将中间转换存储在内存中。


counts.cache()


5.7 执行操作


执行操作(如存储所有转换)会将结果导入文本文件。saveAsTextFile(“”)方法的String参数是输出文件夹的绝对路径。请尝试以下命令将输出保存在文本文件中。在以下示例中,'output'文件夹位于当前位置。


5.8 查看输出

24.png


我们输入命令查看统计结果:


bin/hdfs dfs -text /user/root/output/p*


25.png


5.9 查看Spark 任务和存储


在浏览器中使用以下URL:


http://192.168.31.135:4040/jobs/


26.png


参考资料


Apache Spark - 简介

十大章节108讲——零基础大数据实战特训营 菜鸟窝

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
19天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
54 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
18天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
63 2
|
19天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
57 1
|
19天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
20天前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
48 1
|
10天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
1月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
60 0