1.Spark数据分析导论
1.1 Spark是什么
Spark是一个用来实现快速而通用的集群计算的平台。在速度方面,Spark扩展了广泛使用的MapReduce计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理。总的来说,Spark适用于各种各样原先需要多种不同的分布式平台的场景,包括批处理、迭代算法、交互式查询、流处理。Spark所提供的接口非常丰富。除了提供基于Python、Java、Scala和SQL的简单易用的API以及内建的丰富的程序库以外,Spark还能和其他大数据工具密切配合使用。
1.2一个大一统的软件栈
Spark项目包含多个紧密集成的组件。Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。
各组件间密切结合的设计原理有这样几个优点。首先,软件栈中所有的程序和高级组件都可以从下层的改进中获益。其次,运行整个软件栈的代价变小了。最后,我们能够构建出无缝整合不同处理模型的应用。
这里写图片描述
1.2.1 Spark Core
Spark Core实现了Spark的基本功能,包括任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(RDD)的API定义。RDD表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要的编程抽象。Spark Core 提供了创建和操作这些集合的多个API。
1.2.2 Spark SQL
Spark SQL是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用SQL或者Apache Hive版本的SQL方言(HQL)来查询数据。
1.2.3 Spark Streaming
Spark Streaming是Spark提供的对实时数据进行流式计算的组件。比如生产环境中的网页服务器日志,或是网络服务中用户提交的状态更新组成的消息队列,都是数据流。Spark Streaming提供了用来操作数据流的API,并且与Spark Core中的RDD API高度对应。
1.2.4 MLlib
Spark中还包含一个提供常见的机器学习功能的程序库,叫作MLlib。MLlib提供了很多种机器学习算法,包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
1.2.5 GraphX
GraphX是用来操作图(比如社交网络的朋友关系图)的程序库,可以进行并行的图计算。与Spark Streaming和Spark SQL类似,GraphX也扩展了Spark的RDD API,能用来创建一个顶点和边都包含任意属性的有向图。GraphX还支持针对图的各种操作,以及一些常用图算法。
1.2.6 集群管理器
就底层而言,Spark设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器上运行,包括Hadoop YARN、Apache Mecos,以及Spark自带的一个简易调度器,叫作独立调度器。
1.3 Spark的用户和用途
Spark是一个用于集群计算的通用计算框架,因此被用于各种各样的应用程序。Spark用例分为两类:数据科学应用和数据处理应用。
1.3.1数据科学任务
数据科学家就是主要负责分析数据并建模的人。
1.3.2数据处理应用
1.4 Spark简史
1.5 Spark的版本和发布
1.6 Spark的存储层次
Spark不仅可以将任何Hadoop分布式文件系统上的文件读取为分布式数据集,也可以支持其他支持Hadoop接口的系统。Hadoop并非Spark的必要条件,Spark支持任何实现了Hadoop接口的存储系统。
2. Spark下载与入门
Spark可以通过Python、Java或Scala来使用。Spark本身是用Scala写的,运行在Java虚拟机(JVM)上。要在你的电脑或集群上运行Spark,安装Java 6以上的版本,如果希望使用Python接口,还需要一个Python解释器(2.6解释器),Spark尚不支持Python3。
2.1 下载Spark
2.2 Spark中Python和Scala的shell
Spark带有交互式的shell,可以作即时数据分析。Spark shell可用来与分布式存储在很多机器的内存或者硬盘上的数据进行交互,并且处理过程的分发由Spark自动控制完成。
在Spark中,我们通过对分布式数据集的操作来表达我们的计算意图,这些计算会自动地在集群上并行进行。这样的数据集被称为弹性分布式数据集,RDD是Spark对分布式数据和计算的基本抽象。
要退出任一shell,按Ctrl-D。
2.3 Spark核心概念简介
从上层来看,每个Spark应用都由一个驱动器程序来发起集群上的各种并行操作。驱动器程序包含应用的main函数,并且定义了集群上的分布式数据集,还对这些分布式数据集应用了相关操作。在前面的例子里,实际的驱动器程序就是Spark shell本身,你只需要输入想要运行的操作就可以了。
驱动器程序通过一个 SparkContext 对象来访问 Spark。这个对象代表对计算集群的一个连接。 shell 启动时已经自动创建了一个 SparkContext 对象,是一个叫作 sc 的变量。
一旦有了SparkContext,你就可以用它来创建RDD。调用sc.textFile() 来创建一个代表文件中各行文本的RDD。我们可以在这些行上进行各种操作,比如count()。要执行这些操作,驱动器程序一般要管理多个执行器( executor)节点。比如,如果我们在集群上运行 count() 操作,那么不同的节点会统计文件的不同部分的行数。由于我们刚才是在本地模式下运行 Spark shell,因此所有的工作会在单个节点上执行,但你可以将这个 shell连接到集群上来进行并行的数据分析。
2.4独立应用
如何在独立程序中使用 Spark。除了交互式运行之外,Spark也可以在Java、Scala或Python的独立程序中被连接使用。这与在 shell 中使用的主要区别在于你需要自行初始化 SparkContext。接下来,使用的 API 就一样了。
连接Spark的过程在各语言中并不一样。在Java和Scala中,只需要给你的应用添加一个对于spark-core工件的Maven依赖。
2.4.1 初始化SparkContext
一旦完成了应用与 Spark 的连接,接下来就需要在你的程序中导入 Spark 包并且创建SparkContext。你可以通过先创建一个 SparkConf 对象来配置你的应用,然后基于这个SparkConf 创建一个 SparkContext 对象。

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
SparkConf conf = new SparkConf().setMaster("local").setAppName("My App");
JavaSparkContext sc = new JavaSparkContext(conf);

创建 SparkContext 的最基本的方法,只需传递两个参数:
• 集群 URL:告诉 Spark 如何连接到集群上。在这几个例子中我们使用的是 local,这个特殊值可以让 Spark 运行在单机单线程上而无需连接到集群。
• 应用名:在例子中我们使用的是 My App。当连接到一个集群时,这个值可以帮助你在集群管理器的用户界面中找到你的应用。
2.4.2构建独立应用
用sbt以及Maven来构建并打包一个简单的单词数统计的例程。

// 创建一个Java版本的Spark Context
SparkConf conf = new SparkConf().setAppName("wordCount");
JavaSparkContext sc = new JavaSparkContext(conf);
// 读取我们的输入数据
JavaRDD<String> input = sc.textFile(inputFile);
// 切分为单词
JavaRDD<String> words = input.flatMap(
    new FlatMapFunction<String, String>() {
        public Iterable<String> call(String x) {
            return Arrays.asList(x.split(" "));
        }});
// 转换为键值对并计数
JavaPairRDD<String, Integer> counts = words.mapToPair(
    new PairFunction<String, String, Integer>(){
        public Tuple2<String, Integer> call(String x){
            return new Tuple2(x, 1);
        }}).reduceByKey(new Function2<Integer, Integer, Integer>(){
            public Integer call(Integer x, Integer y){ return x + y;}});
// 将统计出来的单词总数存入一个文本文件,引发求值
counts.saveAsTextFile(outputFile);

可以使用非常简单的sbt或 Maven构建文件来构建这些应用。由于Spark Core包已经在各个工作节点的classpath中了,所以我们把对Spark Core的依赖标记为 provided,这样当我们稍后使用assembly方式打包应用时,就不会把spark-core包也打包到assembly包中。
一旦敲定了构建方式,我们就可以轻松打包并且使用 bin/spark-submit 脚本执行我们的应用了。 spark-submit 脚本可以为我们配置 Spark 所要用到的一系列环境变量。我们可以使用 Scala或者 Java进行构建。

mvn clean && mvn compile && mvn package
$SPARK_HOME/bin/spark-submit \
    --class com.oreilly.learningsparkexamples.mini.java.WordCount \
    ./target/learning-spark-mini-example-0.0.1.jar \
    ./README.md ./wordcounts
Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐