1、往期实训
Spark大数据快速运算实训三:虚拟机进行hadoop安装及配置+工作原理流程解释-CSDN博客
Spark大数据快速运算实训二:linux系统的配置基础操作-CSDN博客
Spark大数据快速运算实训一:linux虚拟机安装及JAVA安装-CSDN博客
2、目录
3、什么是spark?
Apache Spark 是一种开源的集群计算框架,用于快速处理大数据。它是由加州大学伯克利分校AMPLab 开发的,并于 2013 年开源。Spark 提供了一种高效、可扩展和易于使用的编程模型,支持多种编程语言,如 Scala、Java、Python 和 R。
Spark 的核心是 Resilient Distributed Dataset(RDD),它是一个可以并行处理的分布式内存数据结构。RDD 可以通过多个操作进行转换和操作,从而实现对数据的高效处理和分析。这些操作包括过滤、映射、聚合、排序等。RDD 具有高度的容错性,即使出现故障也能快速地恢复。
Spark 不仅支持批处理,还支持流处理和机器学习等高级分析应用程序。Spark 的流处理库“Spark Streaming”支持实时处理,并可与Kafka、Flume、Twitter等数据源一起使用。Spark 的机器学习库“MLlib”提供了多种算法,比如聚类、分类、回归等,并支持模型导入和导出。
在大数据分析中,Spark 可以帮助用户快速处理海量数据并进行分析,比如基于历史数据进行预测,识别潜在的异常和趋势等。另外,Spark 可以轻松地与 Hadoop、Hive、Cassandra 和其他大数据技术进行集成,从而提供更广泛的大数据分析功能。
4、spark的生态系统
Spark的生态系统是由许多与Spark相关的开源工具和库组成的,这些工具和库可以与Spark一起使用,以增强Spark的功能和效率。以下是一些常见的Spark生态系统组件:
-
Hadoop:Spark可以与Hadoop分布式文件系统(HDFS)和YARN资源管理器集成,以在分布式环境中运行。
-
Spark SQL:Spark SQL是一个强大的工具,用于在Spark上执行结构化数据处理。它支持SQL查询、DataFrame和DataSet API。
-
Spark Streaming:Spark Streaming是一个用于实时数据处理的库。它允许开发人员使用与批量数据处理相同的API来处理实时数据流。
-
MLlib:MLlib是Spark的机器学习库,它提供了许多算法和工具,用于分类、回归、聚类、协同过滤等任务。
-
GraphX:GraphX是Spark的图形处理库,它允许处理大型图形数据集。
-
SparkR:SparkR是一个R语言包,它允许在Spark上运行R代码。
-
Tungsten:Tungsten是Spark的新一代执行引擎,它提高了Spark的性能和内存管理。
-
Zeppelin:Zeppelin是一个交互式笔记本,用于数据科学家和分析师在Spark上探索数据。
-
Kafka:Kafka是一个流处理平台,用于处理大规模实时数据流。
5、spark的工作原理
Spark是基于内存的分布式计算框架,相比于传统的基于磁盘的计算框架(如Hadoop MapReduce),Spark具有更快的速度和更好的扩展性。
Spark的工作原理可以简单概括为以下步骤:
-
将输入数据集划分为多个小的数据块,称之为RDD(Resilient Distributed Datasets)。
-
将RDD分散到集群中的不同节点上。
-
Spark的计算引擎会将用户编写的任务(称之为transformations)转换成有向无环图(DAG)。
-
Spark将DAG划分为多个小的任务(称之为tasks),并将这些tasks分配到集群中的不同节点上。
-
每个节点上的任务会对其分配的RDD执行操作(称之为actions),将结果返回给Spark。
-
Spark将结果合并,形成最终的输出数据集。
Spark的优势在于它将整个计算过程都放在内存中完成,同时支持各种数据源和数据处理方式,例如SQL查询、流处理、机器学习等,因此能够满足不同场景下的需求。
6、spark的工作流程
-
创建SparkContext:SparkContext是Spark的入口点,它连接了Spark与集群管理器(如YARN、Mesos或Standalone)以及存储系统(如HDFS)。
-
加载数据:使用SparkContext对象读取数据源,可以从文件系统、数据库、Hadoop HDFS、Apache Cassandra等读取数据。
-
转换数据:使用RDD(弹性分布式数据集)进行数据转换,例如map、filter、groupBy等操作,可将数据进行筛选、过滤、分组等操作。
-
缓存数据:在计算过程中,Spark可以对RDD进行缓存,避免重复计算,提高性能。
-
执行任务:Spark将RDD转换为DAG(有向无环图)进行分析,将计算划分为多个任务,分布式执行任务。
-
输出结果:Spark支持多种输出方式,包括文件系统、数据库、消息队列、HTTP服务等。
-
关闭SparkContext:SparkContext使用完毕后必须关闭,释放资源。
以上是一般的流程,对于特定的应用场景,也可以根据具体需要对流程进行优化或者增加其他的步骤。
7、spark的安装及配置
7.1. 传输压缩包及解压
tar -zxvf spark-2.4.2-bin.hadoop2.7.tgz
7.2. 配置etc/profile
7.3. 对文件进行改名
在上面目录的基础上,进入到spark/conf目录下,对文件进行改名,(后续输入文件名更方便)
cp spark-env.sh.template spark-env.sh
7.4. 对文件进行配置
配置spark-env.sh文件
vim spark-env.sh
vim slaves
7.5. 查看进程
进程出现八个即为成功
8、spark的运行实例
8.1配置准备
mkdir code
cd code
mkdir ch3
cd ch3
vim WordCount.py #输入python语句
WordCount.py文件内容
sudo vim /etc/profile
source /etc/profile
profile文件配置内容
python3 WordCount.py
8.2运行程序(命令行方法)
以下有三种:
python3 WordCount.py
spark-submit WordCount.py
spark-submit --master spark://s0766:7077 WordCount.py
这条命令是在Spark集群模式下提交一个名为WordCount.py的Python脚本作业。其中,--master参数指定了Spark应用程序的主节点地址,这里是s0766:7077;WordCount.py是所要提交的脚本文件。该脚本将执行一个单词计数任务,用Spark计算出输入文本中每个单词出现的次数,并输出结果。
8.3运行程序(pyspark 方法)
pyspark
sc.textFile("file:///opt/apps/spark/READMe.md",2).filter(lambda x:'a' in x).count()
sc.textFile("file:///opt/apps/spark/READMe.md",2).filter(lambda x:'b' in x).count()
sc.textFile("file:///opt/apps/spark/READMe.md",2)
:使用SparkContext对象sc
读取位于本地文件系统路径file:///opt/apps/spark/READMe.md
下的文件,并将其转化成RDD,其中参数2
表示使用2个分区来对文件进行并行处理。.filter(lambda x:'a' in x)
:对RDD进行过滤操作,筛选出RDD中文本行(字符串类型)中包含字符a
的行。.count()
:对过滤后的RDD计数,返回RDD中包含字符a
的文本行数。
8.4运行程序(jupyter 方法)
①先安装jupyter
sudo pip3 install jupyter
sudo python3 -m pip install --upgrade setuptools
sudo python3 -m pip install --upgrade pip
②打开虚拟机,切换到code目录(上面文件存放的目录)
③source文件profile,再打开jupyter
source /etc/profile
jupyter notebook
④运行代码
#导入了"SparkConf"和"SparkContext"这两个类,这两个类是用于配置和创建Spark应用程序的核心组件。
from pyspark import SparkConf, SparkContext
#创建了一个"SparkConf"对象,并使用setAppName()方法给应用程序命名为"MyAPP"。
conf = SparkConf().setAppName("MywAPP")#创建了一个"SparkContext"对象,并传入了"SparkConf"对象作为参数,用于初始化Spark。
sc = SparkContext(conf=conf)
#使用Apache Spark读取了一个文本文件"README.md"
logFile = "file:///opt/apps/spark/README.md"
将其划分为两个分区(2)
logData = sc.textFile(logFile, 2).cache()使用filter函数过滤包含字符'a'或字符'b'的行,并使用count函数统计过滤后的行数。
numAs = logData.filter(lambda line:'a' in line).count()
numBs = logData.filter(lambda line:'b' in line).count()最后它输出了两个计数的结果,其中第一个是包含字符'a'的行数,第二个是包含字符'b'的行数。
print("包含a的行一共:{}, 包含b的行一共: {}".format(numAs, numBs))