Spark基础知识
一、Spark概叙
- spark是一个基于内存计算并且快速、通用、可扩展的集群计算引擎
- spark目前是Apache最活跃的开源项目
二、Spark特点
- 快速性:基于内存计算,比MapReduce快一百倍
- 通用性:提供了大量的类库, 包括 SQL 和 DataFrames, 机器学习(MLlib), 图计算(GraphicX), 实时流处理(Spark Streaming),可以把这些类库无缝的柔和在一个 App 中;它还结合了SQL, Streaming和复杂分析
- 易用性:支持 Scala, Java, Python, R 和 SQL 脚本, 并提供了超过 80 种高性能的算法, 非常容易创建并行 App
- 可融合:可以非常方便的与其他开源产品进行融合,比如yarn,还有Hbase和HDFS
三、Spark内置模块介绍(组件)
- 集群管理器(Cluster Manager):主要有三种,standalone(spark自带)、yarn(国内开发中使用)、mesos(国外使用较多)
- Spark Core:用于离线计算,最基本的模块
- Spark Sql:用于离线计算,和Sql结合使用
- Spark Streaming:用于实时计算
- Spark MLlib:用于机器学习
- Spark GraghX:用于图计算
四、Spark的核心概念
-
Master(针对于standalone模式):管理worker,管理application。在yarn模式里面是RescourceManager
-
Worker(针对于standalone模式):发送心跳给master,管理自身节点的资源,真正执行程序的节点。在yarn模式里面是NodeManager
-
Executor(针对于standalone模式):worker节点上真正执行程序的进程。在yarn模式里面是ApplicationMaster启动executor
-
Driver program:驱动程序,负责程序的分发,资源管理器的注册。spark-shell就是一个典型的driver program
-
Job(一个作业或者说一个程序):划分为多个stage
-
Stage(阶段):小的task的集合
-
task(任务):计算单元
-
有 client 和 cluster 两种模式,主要区别在于:Driver 程序的运行节点不同
- client:Driver程序运行在客户端,驱动不在集群内,适用于交互、调试,希望立即看到app的输出
- cluster:Driver程序运行在由 RM(ResourceManager)启动的 AM(ApplicationMaster)上,驱动在集群内, 适用于生产环境
五、Spark运行模式
-
local(本地模式)
-
安装解压安装包后就可使用
-
运行官方求PI的案例
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local[2] \ ./examples/jars/spark-examples_2.11-2.1.1.jar 100 //注意:如果你的shell是使用的zsh, 则需要把local[2]加上引号:'local[2]'
-
local[*]:这个里面的星符号表示该程序设置几个cpu来执行,或者说几个线程
-
-
standalone(spark自带的集群模式)
-
构建一个由 Master + Slave 构成的 Spark 集群,Spark 运行在集群中
-
standalone运行模式介绍
- 客户端注册给master
- master申请资源,然后告诉worker启动ExecutorBackend
- worker会随时报告Executor的状态
- worker会向客户端反向注册
- 客户端会给worker分配task
- worker会报告给task的状态给客户端,直到结束
-
进入配置文件目录conf, 配置spark-evn.sh
SPARK_MASTER_HOST=hadoop101 SPARK_MASTER_PORT=7077 # 默认端口就是7077, 可以省略不配
-
修改 slaves 文件, 添加 worker 节点
hadoop101 hadoop102 hadoop103
-
分发spark-standalone
-
启动 Spark 集群
sbin/start-all.sh
-
如果启动的时候报JAVA_HOME is not set, 则在sbin/spark-config.sh中添加入JAVA_HOME变量即可,不要忘记分发修改的文件
-
在网页中查看 Spark 集群情况(http://hadoop101:8080)
-
使用 Standalone 模式运行计算 PI 的程序
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark://hadoop101:7077 \ --executor-memory 1G \ --total-executor-cores 6 \ --executor-cores 2 \ ./examples/jars/spark-examples_2.11-2.1.1.jar 100
-
在 Standalone 模式下启动 Spark-shell
bin/spark-shell --master spark://hadoop101:7077
-
配置 Spark 任务历史服务器(为 Standalone 模式配置)
-
配置spark-default.conf文件, 开启 Log
spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop101:9000/spark-job-log
-
修改spark-env.sh文件,添加如下配置
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://hadoop101:9000/spark-job-log"
-
分发配置文件
-
启动历史服务(先启动 HDFS,然后再启动spark的历史服务器)
sbin/start-history-server.sh
-
启动任务, 查看历史服务器(http://hadoop101:18080)
-
-
HA 配置(仅为standalone模式下为 Master 配置)
-
给 spark-env.sh 添加如下配置
# 注释掉如下内容: #SPARK_MASTER_HOST=hadoop101 #SPARK_MASTER_PORT=7077 # 添加上如下内容: export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop101:2181,hadoop102:2181,hadoop103:2181 -Dspark.deploy.zookeeper.dir=/spark"
-
分发配置文件
-
启动 Zookeeper
-
在 hadoop101 启动全部节点
sbin/start-all.sh
-
在 hadoop102 启动一个 master
sbin/start-master.sh
-
杀死 hadoop101 的 master 进程,hadoop102 的 master 会自动切换成 Active
-
可在网页上查看(8080端口)
-
-
-
yarn(借助hadoop的yarn做集群资源管理器,国内使用)(重点)
-
Spark 客户端可以直接连接 Yarn,不需要额外构建Spark集群
-
yarn的运行模式介绍
- 客户端会向ResourceManager(RM)提交App程序任务
- RM会选择一个NM启动AM,AM会初始化Driver(即初始化sc)
- AM启动Executor,并分配Task
- AM会随时报告App运行的状态,直到运行结束
- AM最后会向RM注销自己
-
修改 hadoop 配置文件 yarn-site.xml, 添加如下内容
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property>
-
分发配置文件
-
解压安装包, 并命名为spark-yarn
-
修改spark-env.sh文件
#yarn的配置文件位置 YARN_CONF_DIR=/opt/module/hadoop/etc/hadoop #配置历史服务器 export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=30 -Dspark.history.fs.logDirectory=hdfs://hadoop101:9000/spark-job-log"
-
配置spark-default.conf文件
#开启Log spark.eventLog.enabled true #配置log存储位置 spark.eventLog.dir hdfs://hadoop101:9000/spark-job-log #配置历史日志服务器 spark.yarn.historyServer.address=hadoop101:18080 spark.history.ui.port=18080
-
执行样例
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode client \ ./examples/jars/spark-examples_2.11-2.1.1.jar 100
-
如果在 yarn 日志端无法查看到具体的日志, 则在yarn-site.xml中添加如下配置
<property> <name>yarn.log.server.url</name> <value>http://hadoop101:19888/jobhistory/logs</value> </property>
-
-
几种运行模式的对比
模式 Spark安装机器数 需启动的进程 所属者 Local 1 无 Spark Standalone 多台 Master及Worker Spark Yarn(实际开发中使用) 1 Yarn及HDFS Hadoop
六、Spark中的常见端口
- spark协议端口:7077
- spark程序运行过程信息的端口:4040
- spark启动后观察集群情况的端口(standalone模式):8080
- spark历史服务器端口:18080
- spark的yarn模式的可视化端口(yarn模式):8088
七、Spark-submit发布应用程序的语法
-
样例:
./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.examples.SparkPi)
-
–master 指定 master 的地址,默认为local. 表示在本机运行
-
–deploy-mode是否发布你的驱动到 worker节点(cluster 模式) 或者作为一个本地客户端 (client 模式) (default: client)
-
–conf是任意的 Spark 配置属性, 格式key=value. 如果值包含空格,可以加引号**“key=value”**
-
application-jar 是打包好的应用 jar,包含依赖. 这个 URL 在集群中全局可见。 比如hdfs:// 共享存储系统, 如果是 file:// path, 那么所有的节点的path都包含同样的jar
-
application-arguments 是指传给**main()**方法的参数
-
–executor-memory 1G 指定每个executor可用内存为1G
-
–total-executor-cores 6 指定所有executor使用的cpu核数为6个
-
–executor-cores 表示每个executor使用的 cpu 的核数