1、安装Spark
1.1、 配置Java环境:
<1>下载Java SE
网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
选择合适的压缩包下载
<2>配置Java环境
打开profile文件: ~$ sudo vim /etc/profile
在文件结尾加上Java配置语句:
export JAVA_HOME=$YOUR_PATH #$YOUR_PATH为实际的Java包路径,如:/home/jj/java/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
1.2、 下载、编译Spark
<1>下载
网址:http://spark.apache.org/downloads.html
Spark下载步骤:
1) 选择Spark发行版本,目前最新版本为2.2.0
2) 选择发行包类型,可以选择Source Code、Pre-built for Apache Hadoop 2.7 and later等
3) 选择下载方式
4) 点击Download Spark:spark-2.2.0.tgz进行下载
<2>编译
可以使用Maven或SBT(Simple Build Tool,简单编译工具)进行编译,以下介绍Maven编译流程:
1) Maven下载:
2) Maven配置:
~$ export M2_HOME=$your_path;export PATH=$M2_HOME/bin:$PATH
上述命令中的your_path为Maven所在的目录
3)Maven编译Spark
在Spark源码目录(如spark-2.2.0)下,编译Spark运行环境,命令如下:
~/spark-2.2.0$ export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
~/spark-2.2.0$ mvn -Pyarn -phadoop-2.6 -Dhadoop.version=2.6.0 -DskipTests clean package
第一条命令中:
-Xmx为Java虚拟机堆内存最大允许值,
-XX:MaxPermSize为最大允许的非堆内存大小,
-XX:ReservedCodeCaheSize为缓存大小。
编译过程较为漫长。
2、Spark集群部署
2.1 Spark集群部署的模式介绍
<1> 组件
Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过你的主程序(也叫作驱动器,即:driver)中的SparkContext对象来进行协调。
特别要指出的是:SparkContext对象能与多种集群管理器进行通信(包括:Spark独立部署时自带的集群管理器,Mesos或者YARN)。一旦连接上集群管理器,Spark会为该应用在各个集群节点上申请执行器(executor),用于执行计算任务和存储数据。接下来,Spark将应用程序代码(JAR包或者Python文件)发送给所申请到的执行器。最后SparkContext将分割出的任务(task)发送给各个执行器去运行。
这个架构中有几个值得注意的地方:
- 每个Spark应用程序都有其对应的多个执行器进程,执行器进程在整个应用程序生命周期内,都保持运行状态,并以多线程方式运行所收到的任务。这样的好处是,可以隔离各个Spark应用,从调度角度来看,每个驱动器可以独立调度本应用程序内部的任务,从执行器角度来看,不同的Spark应用对应的任务将会在不同的JVM中运行。然而这种架构同样也有其劣势,多个Spark应用程序之间无法共享数据,除非把数据写到外部存储中。
- Spark对底层的集群管理器一无所知。只要Spark能申请到执行器进程,并且能与之通信即可。这种实现方式可以使Spark相对比较容易在一个支持多种应用的集群管理器上运行(如:Mesos或YARN)
- 驱动器(driver)程序在整个生命周期内必须监听并接受其对应的各个执行器的连接请求(参考:spark.driver.port and spark.fileserver.port in the network config section)。因此,驱动器程序必须能够被所有worker节点访问到。
- 因为集群上的任务是由驱动器来调度的,所以驱动器应该和worker节点距离近一些,最好在同一个本地局域网中。如果你需要远程对集群发起请求,最好还是在驱动器节点上启动RPC服务,来响应这些远程请求,同时把驱动器本身放在集群worker节点比较近的机器上。
<2>集群管理器类型
Spark支持以下3中集群管理器:
- Standalone – Spark自带的一个简单的集群管理器,这使得启动一个Spark集群变得非常简单。
- Apache Mesos – 一种可以运行Hadoop MapReduce或者服务型应用的通用集群管理器。
- Hadoop YARN – Hadoop 2的集群管理器。
另外,使用Spark的EC2 launch scripts可以轻松地在Amazon EC2上启动一个独立集群。
<3> 提交Spark应用
利用spark-submit脚本,可以向Spark所支持的任意一种集群提交应用。详见:application submission guide
<4> 监控
每一个驱动器(driver)都有其对应的web UI,默认会绑定4040端口(多个并存会按顺序绑定4041、4042…),这个web UI会展示该Spark应用正在运行的任务(task)、执行器(executor)以及所使用的存储信息。只需在浏览器种打开http://<driver-node>:4040即可访问。monitoring guide 详细描述了其他监控选项。
<5> 作业调度
Spark可以在应用程序之间(集群管理器这一层面)和之内(如:同一个SparkContext对象运行了多个计算作业)控制资源分配。job scheduling overview 描述了更详细的信息。
<6> 概念和术语
下表简要说明了集群模式下的一些概念和术语:
术语 含义 Application(应用) Spark上运行的应用。包含了驱动器(driver)进程(一个)和集群上的执行器(executor)进程(多个) Application jar(应用jar包) 包含Spark应用程序的jar包。有时候,用户会想要把应用程序代码及其依赖打到一起,形成一个“uber jar”(包含自身以及所有依赖库的jar包),注意这时候不要把Spark或Hadoop的库打进来,这些库会在运行时加载 Driver program(驱动器) 驱动程序,运行main函数并创建SparkContext的进程。 Cluster manager(集群管理器) 用于在集群上申请资源的 外部服务(如:独立部署的集群管理器、Mesos或者YARN) Deploy mode(部署模式) 用于区分驱动器进程在哪里运行。在”cluster”模式下,驱动器将运行在集群上某个节点;在”client“模式下,驱动器在集群之外的客户端运行。 Worker node(工作节点) 集群上运行应用程序代码的任意一个节点。 Executor(执行器) 在集群工作节点上,为某个应用启动的工作进程;专门用于运行计算任务,并在内存或磁盘上保存数据。每个应用都独享其对应的多个执行器。 Task(任务) 下发给执行器Executor的工作单元。 Job(作业) 一个并行计算作业,由一组任务(Task)组成,并由Spark的行动(action)算子(如:save、collect)触发启动;你会在驱动器日志中看到这个术语。 Stage(步骤) 每个作业(Job)可以划分为更小的任务(Task)集合,这就是步骤(Stage),这些步骤彼此依赖形成一个有向无环图(类似于MapReduce中的map和reduce);你会在驱动器日志中看到这个术语。 RDD 弹性分布式数据集 Operation 作用于RDD的各种操作,分为Transformation和Action DAG 有向无环图,反映RDD的依赖关系 Narrow dependency 窄依赖,子RDD依赖父RDD中固定的数据分区 Wide dependency 宽依赖,子RDD对父RDD中的所有数据分区都有依赖 Caching management 缓存管理,对RDD的中间计算结果进行缓存管理,以加快整体的处理速度
2.2 Spark部署
<1>Local模式部署
Local模式下部署Spark应用程序比较简单,可用于检测Spark是否编译安装成功,需要配置Java环境变量和设置主节点。
主节点设置步骤如下:
1)进入Spark主程序的conf目录,即spark-2.2.0/conf
2)以spark-env.sh.template文件为模板创建spark-env.sh文件
3)修改spark-env.sh配置文件
vim spark-env.sh
export SPARK_MASTER_IP=$YOUR_MASTER_IP
export JAVA_NAME=$YOUR_JAVA_HOME
4)版本验证,在任意目录下运行spark-shell命令即可进入Spark命令行模式。此时会显示版本信息:
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.0
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144)
<2> Standalone模式部署
部署步骤如下
1)修改spark-env.sh配置文件(参考Local部署模式)
vim spark-env.sh
export SPARK_MASTER_IP=$YOUR_MASTER_IP
export JAVA_NAME=$YOUR_JAVA_HOME
2)在Spark目录下创建一个名为conf/slaves的文件。该文件需要包含所有将要启动Spark Workers的机器的hostname(主机名),每行一个
vim slaves
# A Spark Worker will be started on each of the machines listed below.
slave01
slava02
.....
3)发送配置文件Spark-env.sh和Slaves到所有Worker节点,以slave02为例:
scp -r $SPARK_HOME/conf/spark-env.sh slave02:/$SPARK_HOME/conf
scp -r $SPARK_HOME/conf/slaves slave02:$SPARK_HOME/conf
4)配置Master无密钥登录Slaves节点。
1.在Master节点和所有Slave节点上安装openssh-server:
sudo apt-get install openssh-server
2. 建立SSH KEY:
ssh-keygen -t rsa -P ""
3.在Master节点上启用SSH KEY(authorized__keys权限644):
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
sudo /etc/init.d/ssh reload
4. 验证SSH的配置:
ssh localhost
5.将Master节点的authorized_keys发送到所有Slaves节点并登录验证。
5)部署完毕,可以手动启动和脚本启动集群的Master和Worker。
1.手动启动:
可以通过执行下述命令启动Standalone的Master节点:
启动之后。Master命令行会打印出:spark://HOST:PORT,你可以使用该URL信息将Worker与Master连接,./sbin/start-master.sh
或以‘master’参数的形式传递给SparkContext对象。也可以在Master的web UI中找到这个URL,默认访问地址是http://localhost:8080。
支持启动一个或更多的Worker,然后通过下面的指令与Master连接:
./bin/spark-class org.apache.spark.deploy.worker.Worker park://IP:PORT
一旦启动了一个Worker节点,在Master的WebUI中(默认http://localhost:8080),你会看到新增的Worker节点,以及CPU数目、内存大小(减去留给系统的1GB)在列表中呈现。
2.脚本启动集群
使用脚本启动Spark standalone cluster时,你应先在你的SPARK文件夹下创建conf/slaves文件,这个文件包含所有你想要运行Spark workers的机器的hostname,一个一行。如果这个文件不再,脚本默认会使用一台机器(localhost),这是用来测试用的。
当创建了这个文件,就可以通过下面的shell脚本在Master节点上启动或终止你的集群:
SPARK_HOME/sbin
:
sbin/start-master.sh
- 在脚本运行的机器上启动一个Master 实例。
sbin/start-slaves.sh
- 在conf/slaves
文件指定的所有机器上运行一个Slave实例。sbin/start-slave.sh
-在脚本运行的机器上启动一个Slave实例。
sbin/start-all.sh
- 以上面所述的方式启动一个Master实例和多个Slave实例。sbin/stop-master.sh
-停止使用sbin/start-master.sh
脚本启动的Master实例。sbin/stop-slaves.sh
- 停止所有conf/slaves
文件指定的Slava 实例。
sbin/stop-all.sh
-停止当前的Master实例和Slave实例。执行jps命令可以查看当前服务器正在运行的进程,如果是主节点,可以看到Master进程;如果是子进程,可以看到Worker进程。这样就表示Spark在服务器上全部部署完毕。
可以通过设置spark-env.sh中的环境变量进一步配置集群,并复制到所有的Worker机器上以使设置生效,可配值的spark-env.sh中的环境变量如下:
Environment Variable Meaning SPARK_MASTER_HOST
Bind the master to a specific hostname or IP address, for example a public one. SPARK_MASTER_PORT
Start the master on a different port (default: 7077). SPARK_MASTER_WEBUI_PORT
Port for the master web UI (default: 8080). SPARK_MASTER_OPTS
Configuration properties that apply only to the master in the form "-Dx=y" (default: none). See below for a list of possible options. SPARK_LOCAL_DIRS
Directory to use for "scratch" space in Spark, including map output files and RDDs that get stored on disk. This should be on a fast, local disk in your system. It can also be a comma-separated list of multiple directories on different disks. SPARK_WORKER_CORES
Total number of cores to allow Spark applications to use on the machine (default: all available cores). SPARK_WORKER_MEMORY
Total amount of memory to allow Spark applications to use on the machine, e.g. 1000m
,2g
(default: total memory minus 1 GB); note that each application'sindividual memory is configured using itsspark.executor.memory
property.SPARK_WORKER_PORT
Start the Spark worker on a specific port (default: random). SPARK_WORKER_WEBUI_PORT
Port for the worker web UI (default: 8081). SPARK_WORKER_DIR
Directory to run applications in, which will include both logs and scratch space (default: SPARK_HOME/work). SPARK_WORKER_OPTS
Configuration properties that apply only to the worker in the form "-Dx=y" (default: none). See below for a list of possible options. SPARK_DAEMON_MEMORY
Memory to allocate to the Spark master and worker daemons themselves (default: 1g). SPARK_DAEMON_JAVA_OPTS
JVM options for the Spark master and worker daemons themselves in the form "-Dx=y" (default: none). SPARK_PUBLIC_DNS
The public DNS name of the Spark master and workers (default: none).