- 熟悉 Spark 相关概念
什么是 Spark(官网:http://spark.apache.org)
Spark 是一种快速、通用、可扩展的大数据分析引擎,2009 年诞生于加州大 学伯克利分校 AMPLab,2010 年开源,2013 年 6 月成为 Apache 孵化项目,2014 年 2 月成为 Apache 顶级项目。目前,Spark 生态系统已经发展成为一个包含多个 子项目的集合,其中包含 SparkSQL、Spark Streaming、GraphX、MLlib 等子项目, Spark 是基于内存计算的大数据并行计算框架。Spark 基于内存计算,提高了在大 数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将 Spark 部署在大量廉价硬件之上,形成集群。Spark 得到了众多大数据公司的支持, 这些公司包括 Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的 Spark 已应用于凤巢、大搜索、直达 号、百度大数据等业务;阿里利用 GraphX 构建了大规模的图计算和图挖掘系统, 实现了很多生产系统的推荐算法;腾讯 Spark 集群达到 8000 台的规模,是当前 已知的世界上最大的 Spark 集群。
Spark 是一个开源的类似于 Hadoop MapReduce 的通用的并行计算框架,Spark 基于 map reduce 算法实现的分布式计算,拥有 Hadoop MapReduce 所具有的优 点;但不同于 MapReduce 的是 Spark 中的 Job 中间输出和结果可以保存在内存中, 从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需 要迭代的 map reduce 的算法。
Spark 是 MapReduce 的替代方案,而且兼容 HDFS、Hive,可融入 Hadoop 的生态 系统,以弥补 MapReduce 的不足。
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 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,器,并且可以处 理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部 署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。Spark 也可以不依赖于第三方的资源管理和调度器,它实现了 Standalone 作为其内置的资源管理和调度框架,这样进一步降低了 Spark 的使用 门槛,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 还提供了在 EC2 上部署 Standalone 的 Spark 集群的工具。
- 搭建一个 Spark 集群
下载 spark 安装包 下载地址: spark 官网
这里我们使用 spark-2.0.2-bin-hadoop2.7 版本.
下载好之后上传, 解压
tar -zxvf spark-2.0.2-bin-hadoop2.7.tgz
重命名
mv spark-2.0.2-bin-hadoop2.7 spark
修改配置文件
#配置文件目录在 /opt/bigdata/spark/conf
#vi spark-env.sh 修改文件(先把 spark-env.sh.template 重命名 为 spark-env.sh)
#配置java环境变量
export JAVA_HOME=/export/server/jdk1.8.0_65
#指定spark老大Master的IP
#export SPARK_MASTER_HOST=node-1
#指定spark老大Master的端口
export SPARK_MASTER_PORT=7077
#通过zookeeper搭建高可用spark集群
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-1:2181,node-2:2181,node-3:2181 -Dspark.deploy.zookeeper.dir=/spark"
#指定HDFS配置文件目录
export HADOOP_CONF_DIR=/export/server/hadoop-2.7.4/etc/hadoop
参数说明 spark.deploy.recoveryMode:恢复模式(Master 重新启动的模式) 有三种:
(1)ZooKeeper
(2) FileSystem
(3)NONE
spark.deploy.zookeeper.url:ZooKeeper 的 Server 地址 spark.deploy.zookeeper.dir:保存集群元数据信息的文件、目录。 包括 Worker,Driver 和 Application。
注意:在普通模式下启动 spark 集群,只需要在主机上面执行 start-all.sh 就可以了。 在高可用模式下启动 spark 集群,先需要在任意一台节点上启动 start-all.sh 命令。 然后在另外一台节点上单独启动 master。
命令
start-master.sh
#修改文件(先把 slaves.template 重命名为 slaves)
vi slaves
拷贝配置到其他主机
#通过 scp 命令将 spark 的安装目录拷贝到其他机器上
scp -r /export/server/spark hdp-node-02:/export/server/
scp -r /export/server/spark hdp-node-03:/export/server/
配置 spark 环境变量
vi /etc/profile
#添加
export SPARK_HOME=/export/server/spark
export PATH=${
SPARK_HOME}/bin:${
SPARK_HOME}/sbin:$PATH
注意最后 source /etc/profile 刷新配置
高可用部署说明
Spark Standalone 集群是 Master-Slaves 架构的集群模式,和大部分的 Master-Slaves 结构集群一样,存在着 Master 单点故障的问题。如何解决这个 单点故障的问题,Spark 提供了两种方案:
(1)基 于 文 件 系 统 的 单 点 恢 复 (Single-Node Recovery with Local File System)。主要用于开发或测试环境。当 spark 提供目录保存 spark Application 和 worker 的注册信息,并将他们的恢复状态写入该目录中,这时,一旦 Master 发生故障,就可以通过重新启动 Master 进程(sbin/start-master.sh),恢复 已运行的 spark Application 和 worker 的注册信息。
(2)基于 zookeeper 的 Standby Masters(Standby Masters with ZooKeeper)。 用于生产模式。其基本原理是通过 zookeeper 来选举一个 Master,其他 的 Master 处于 Standby 状态。将 spark 集群连接到同一个 ZooKeeper 实例并启 动多个 Master,利用 zookeeper 提供的选举和状态保存功能,可以使一个 Master 被选举成活着的 master,而其他 Master 处于 Standby 状态。如果现任 Master死去,另一个 Master 会通过选举产生,并恢复到旧的 Master 状态,然后恢复调 度。整个恢复过程可能要 1-2 分钟。
#在主节点上启动 spark
spark/sbin/start-all.sh
#在从节点上启动master
start-master.sh
#在主节点上停止 spark 集群
spark/sbin/stop-all.sh
#在从节点上停止master
stop-master.sh
正常启动 spark 集群后,可以通过访问 http://node-01:8080,查看 spark 的 web 界面, 查看相关信息。
Spark 角色介绍
Spark 是基于内存计算的大数据并行计算框架。因为其基于内存计算,比 Hadoop 中 MapReduce 计算框架具有更高的实时性,同时保证了高效容错性和可伸缩性。从 2009 年诞生于 AMPLab 到现在已经成为 Apache 顶级开源项目,并成 功应用于商业集群中,学习 Spark 就需要了解其架构。 Spark 架构图如下:
Spark 架构使用了分布式计算中 master-slave 模型,master 是集群中含 有 master 进程的节点,slave 是集群中含有 worker 进程的节点。
Driver Program :运⾏main 函数并且新建 SparkContext 的程序。
Application:基于 Spark 的应用程序,包含了 driver 程序和集群上的 executor。
Cluster Manager:指的是在集群上获取资源的外部服务。目前有三种类型
(1)Standalone: spark 原生的资源管理,由 Master 负责资源的分配
(2)Apache Mesos:与 hadoop MR 兼容性良好的一种资源调度框架
(3)Hadoop Yarn: 主要是指 Yarn 中的 ResourceManager
Worker Node:集群中任何可以运行 Application 代码的节点,在 Standalone 模式中指的是通过 slaves 文件配置的 Worker 节点,在 Spark on Yarn 模式 下就是 NodeManager 节点
Executor:是在一个 worker node 上为某应⽤启动的⼀个进程,该进程负责 运⾏行任务,并且负责将数据存在内存或者磁盘上。每个应⽤都有各自独立 的 executor。
Task:被送到某个 executor 上的工作单元。
- 编写简单的 Spark 应用程序
执行第一个 spark 程序
#普通模式提交任务
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://node-01:7077 --executor-memory 1G --total-executor-cores 2 examples/jars/spark-examples_2.11-2.0.2.jar 10
该算法是利用蒙特·卡罗算法求圆周率 PI,通过计算机模拟大量的随机数, 最终会计算出比较精确的π。
在高可用模式下,因为涉及到多个 Master,所以对于应用程序的提交就有了 一点变化,因为应用程序需要知道当前的 Master 的 IP 地址和端口。这种 HA 方 案处理这种情况很简单,只需要在SparkContext指向一个Master列表就可以了, 如 spark://host1:port1,host2:port2,host3:port3,应用程序会轮询列表,找 到活着的 Master。
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://node-1:7077,node-2:7077 --executor-memory 1G --total-executor-cores 1 examples/jars/spark-examples_2.11-2.0.2.jar 10
[root@node-1 spark]# bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://node-1:7077,node-2:7077 --executor-memory 1G --total-executor-cores 1 examples/jars/spark-examples_2.11-2.0.2.jar 10
20/09