1. 什么是 Spark
官网:http://spark.apache.org
Spark 是一个快速、通用、可扩展的大数据分析引擎。
Spark 是基于内存计算的大数据并行计算框架
1.1 Spark 的特点
快:与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的 DAG 执行引擎,可以通过基于内存来高效的处理数据流。计算的中间结果是存在于内存中。
易用:Spark 支持 Java, Python 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 Shell,可以非常方便地在这些 Shell 中使用 Spark 集群来验证解决问题的方法
通用:Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用
兼容性:Spark 可以非常方便地与其他的开源产品进行整合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS, HBase 和 Cassandra 等
1.2 Spark 的子项目
Spark Core: 以下子项目都基于 Spark Core, Spark Core 实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core 中还包含了对弹性分布式数据集(RDD: Resilient Distributed Dataset)的 API 定义
Spark SQL: 结构化数据处理。是 Spark 用来操作结构化数据的程序包,通过 Spark SQL,可以使用 SQL 或者 Apache Hive 版本的 SQL 来查询数据。Spark SQL 支持多种数据源,比如:Hive 表、Parquet 以及 JSON 等
Spark Streaming: 实时计算。是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应
Spark MLlib: 机器学习。提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能
2. Spark 集群安装
2.1 Spark 集群的角色
- 从物理层面上来看,Spark 主要分为以下两种节点
- Master 节点
- Worker 节点
Master 节点主要运行集群管理器的中心化部分,所承载的作用是分配 Application 到 Worker 节点,维护 Worker 节点,Driver, Application 的状态。
Worker 节点负责具体的业务运行。
- 从 Spark 程序运行的层面来看,Spark 主要分为以下两种节点
驱动节点
执行器节点
2.2 Spark 的部署方式
Spark 的部署方式主要有:Local, Local-Cluster, Standalone, Yarn, Mesos,其中最具有代表性的是 Standalone 部署模式。
3. 执行 Spark 程序
3.1 执行第一个 Spark 程序
cd ${SPARK_HOME}
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hdp01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
${SPARK_HOME}/examples/jars/spark-examples_2.11-2.2.2.jar \
100
参数说明:
- –master: 指定 Master 的地址
- –executor-memory: 指定每个 executor 可用内存大小
- –total-executor-cores: 指定每个 executor 使用的 CPU 核心数
Note: 该算法用的是蒙特·卡罗算法求 PI
3.2 Spark 应用提交
打包好自己编写的程序后,就可以使用 ./bin/spark-submit 脚本来启动应用了。这个脚本负责设置 Spark 使用的 classpath 和依赖,支持不同类型的集群管理器和发布模式。
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
一些常用的选项:
--class:
应用的启动类(如 org.apache.spark.example.SparkPi)
--master:
集群的 Master URL(如 spark://hdp01:7077)
--deploy-mode:
是否发布你的驱动程序到 worker 节点(Cluster),或者作为一个本地客户端(Client),默认为 Client
--conf:
任意的 Spark 配置属性,格式为:Key-Value。如果值包含空格,可以加引号:“key=value”.
application-jar:
打包好的应用 jar 包,包含依赖。这个 URL 在集群中全局可见。比如 hdfs:// 共享存储系统,如果是 file://path,那么所有的节点的 path 下都包含同样的 jar 包
application-argument:
传给 main() 方法的参数
Master URL 可以有如下设置:
local
本地以一个 worker 线程运行(例如非并行的情况)local[n]
本地以 K worker 线程运行(理想情况下,n 设置为机器的 CPU 核心数)spark://HOST:PORT
连接到指定的 Spark standalone cluster master。端口是 Master 配置的端口,缺省值为 7077mesos://HOST:PORT
连接到指定的 Mesos 集群。PORT 是配置的 Mesos 端口,缺省为 5050,或者如果 Mesos 使用 ZooKeeper, 格式为:mesos://zk//…yarn-client
以 Client 模式连接到 YARN Cluster,集群的位置基于 HADOOP_CONF_DIR 变量找到yarn-cluster
以 Cluster 模式连接到 YARN Cluster,集群的位置基于 HADOOP_CONF_DIR 变量找到
查看 spark-submit 的全部参数:
./bin/spark-submit -h
3.3 启动 Spark Shell
spark-shell 是 Spark 自带的交互式 Shell 程序,方便用户进行交互式编程,用户可以在该命令行下用 Scala 编写 Spark 程序。
启动 Spark Shell
./bin/spark-shell \
--master spark://hdp01:7077 \
--executor-memory 2G \
--total-executor-cores 2
Note: 如果启动 Spark Shell 时没有指定 Master 地址,但是也可以正常启动 Spark Shell 和执行 Spark Shell 中的程序,其实是启动了 Spark 的 Local 模式,该模式仅在本机启动一个进程,没有与集群建立联系。
Spark Shell 中已经默认将 SparkContext 类初始化为对象 sc, 用户代码如果需要用到,则直接用 sc 即可。
4. 提交 WordCount 应用
cd jars;
~/apps/spark/bin/spark-submit \
--class cn.gldwolf.spark.WordCount \
--master spark://hdp01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
wordcount-jar-with-dependencies.jar \
hdfs://bd1810/in/day0518/1/word-count.txt \
hfds://bd1810/out/day0518/1
5. Spark 核心概念
每个 Spark 应用都由一个驱动器程序(Driver Program)来发起集群上的各种并行操作。驱动器程序包含应用的 mian() 方法,并且定义了集群上的分布式数据集(RDD),还对这些分布式数据集应用了相关操作。
驱动器程序通过一个 SparkContext 对象来访问 Spark,这个对象代表对计算集群的一个连接。Spark Shell 启动时已经自动创建了一个 SparkContext 对象,是一个叫 sc 的变量。
驱动器程序一般要管理多个执行器(executor)节点。