作为一名开发人员,用内存处理数据是每天都在做的事情。内存处理数据最大的优势就是方便,快捷,可以很快得到结果,但是内存总是有瓶颈的,不管你运行代码的机器有多大的内存,总是有更大规模的数据需要处理,而且随着单个机器内存扩容,硬件成本会指数级上升。在当今互联网行业,数据快速膨胀的时代,分布式计算来处理数据是大势所趋。本文通过介绍的是大数据领域优秀框架spark ,打开分布式实时计算的大门
Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎。以下是对Spark的详细介绍:
Spark最初于2009年诞生于加州大学伯克利分校AMPLab(AMP:Algorithms,Machines,People),作为伯克利大学的研究性项目。
2010年,Spark正式开源。
2013年6月,Spark成为Apache孵化项目。
2014年2月,Spark成为Apache顶级项目。
Spark包含了多个内置模块和组件,以满足不同场景下的数据处理需求:
Spark的应用场景非常广泛,包括但不限于推荐系统、交互式实时查询等。同时,Spark已经形成了一个丰富的生态圈,能够与其他多种框架和系统进行融合和扩展。这些框架和系统包括数据科学和机器学习框架(如scikit-learn、pandas、TensorFlow、PyTorch等)、SQL分析和BI工具(如Superset、Power BI、Looker等)、存储和基础设施(如Elasticsearch、MongoDB、Kafka等)。
综上所述,Spark作为一种基于内存的快速、通用、可扩展的大数据分析引擎,在大数据处理领域具有广泛的应用前景和重要的学术价值。
在前期,我会先下载spark并在本地单机运行spark,后期会搭建spark集群并将任务交给集群处理。关于版本问题,本文选择3.4.4 来演示
Spank 带有交互式的 shell,可以作即时数据分析。如果你使用过类似R、Python、Seala 所提供的 shell,或操作系统的 shell(例如 Bash 或者 Windows 中的命令提示符),你也会对Spark shell 感到很熟悉。
然而和其他 shell 工具不一样的是,在其他she 工具中你只能使用单机的硬盘和内存来操作数据,而Sparkshell 可用来与分布式存储在许多机器的内存或者硬盘上的数据进行交互,并且处理过程的分发由Spark自动控制完成。
由于Spark 能够在工作节点上把数据读取到内存中,所以许多分布式计算都可以在几秒钟之内完成,哪怕是那种在十几个节点上处理TB级别的数据的计算。这就使得一般需要在shell 中完成的那些交互式的即时探索性分析变得非常适合Spark。Spark提供Python 以及Scala的增强版shell,支持与集群的连接。
Scala 是 Spark 的原生语言,因此 Spark Shell 默认是基于 Scala 的。spark-shell
提供了一个预配置的环境,其中包含 Spark 上下文(SparkContext)和 SQL 上下文(SparkSession),使得用户可以立即开始使用 Spark。
在命令行中输入以下命令来启动 Scala Shell:
bin/spark-shell
启动后,你会看到一个类似 REPL(Read-Eval-Print Loop)的界面,可以开始输入 Scala 代码。
val sc = spark.sparkContext
val data = sc.textFile("hdfs:///path/to/input.txt")
val words = data.flatMap(line => line.split(" "))
val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _)
wordCounts.collect().foreach(println)
PySpark 是 Spark 的 Python API,允许用户使用 Python 编写 Spark 应用程序。pyspark
shell 提供了一个与 Scala shell 类似的环境,但适用于 Python 开发者。
在命令行中输入以下命令来启动 PySpark Shell:
bin/pyspark
启动后,你会看到一个 Python REPL 界面,并且 Spark 上下文(sc)和 SQL 上下文(spark)已经预先配置好了。
from pyspark import SparkContext, SparkConf
sc = SparkContext(appName="PythonWordCount")
data = sc.textFile("hdfs:///path/to/input.txt")
words = data.flatMap(lambda line: line.split(" "))
wordCounts = words.map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b)
wordCounts.collect()
SPARK_HOME
)已经配置好。requirements.txt
文件或虚拟环境来实现。通过使用这些 shell,可以快速原型化和测试 Spark 应用程序,而无需编写完整的脚本或应用程序。
RDD是Spark的核心数据结构,代表一个不可变、可分区、可并行操作的元素集合。RDD具有如下特性:
RDD支持两种操作:
SparkContext是Spark的入口点,用于连接Spark集群,创建RDD并进行操作。它是Spark应用程序的上下文环境,控制应用的生命周期。
Cluster Manager负责管理Spark集群的资源(如CPU核心、内存等)。在不同的部署模式下,Cluster Manager可以是Spark自带的(Standalone模式),也可以是YARN、Mesos等外部集群管理器。
Worker Node是执行作业任务的工作节点,是Spark计算能力的实际提供者。在Standalone模式中,Worker Node负责控制计算节点,启动Executor。
Driver是每个Spark应用程序的核心,负责启动并控制整个应用程序。它创建SparkContext,与Cluster Manager通信,管理资源申请、任务分配和监控。
Executor是在Worker Node上运行的进程,可以派生出多个线程来并行处理任务。每个Spark应用程序都拥有独立的一组Executors。
在Spark中,只有Actions操作才会触发计算。Actions操作会返回一个结果或把RDD数据写到存储系统中。常见的Actions操作包括collect、count、saveAsTextFile等。
综上所述,Spark的核心概念包括RDD、SparkContext、Cluster Manager、Worker Node、Driver、Executor、DAGScheduler、TaskScheduler、Stage、Task以及Actions触发计算等。这些概念共同构成了Spark的分布式计算框架,使得Spark能够高效地处理大规模数据。
Client
|
v
Driver (SparkContext)
|
+--- DAGScheduler (划分Stage)
|
+--- TaskScheduler (分发Task)
|
v
Cluster Manager (资源分配)
|
+--- Worker Node (控制计算节点)
|
v
Executor (执行任务)
Client提交作业:
Driver启动并管理作业:
DAGScheduler划分Stage:
TaskScheduler分发Task:
Cluster Manager分配资源:
Worker Node控制计算节点:
Executor执行任务:
以上,如有错误,请不吝指正!