Spark安装
概述
Apache Spark™ is a unified analytics engine for large-scale data processing.
Spark是一个使用大数据处理的统一分析引擎(计算)
官网地址:http://spark.apache.org/
Lightning-fast unified analytics engine (Spark快如闪电统一分析引擎)
快如闪电
- Spark是基于内存式计算引擎。不同于Hadoop框架中MapReduce,在计算时将任务分为粗粒度MapTask和ReduceTask,Shuffle通常比较耗时,因为MapTask映射结果需要溢写到磁盘,ReduceTask需要通过网络拉取负责计算的分区数据。
- Spark计算任务可以划分细粒度Stage(阶段),每一个Stage都支持分布式并行计算。不同于MapReduce
- Spark在计算时,每一个阶段的计算中间结果都支持Cache(缓存),利用缓存进行结果复用和故障恢复
- Spark在底层进行大量优化,包括查询优化、物理引擎、内存管理等
统一
Spark框架提供了大数据处理的所有主流方案
- 批处理 Batch Processing(Spark RDD 弹性分布式数据集),代替MR
- 流处理 Stream Processing(Spark Streaming 和 Spark Structured Streaming),代替Storm
- 交互式查询支持, 类似于Hive(Spark SQL),代替Hive
- 机器学习 Machine Learning(Spark MLLib)
- 图形计算 NOSQL(Spark GraphX)
- 其它Spark第三方生态库
分析引擎
Spark作用类似于MapReduce,是一个分布式并行计算引擎
大数据需要解决三个问题:数据采集、存储、计算(Spark解决)
特点
- 高性能:Spark提供了一个先进的计算模型:DAG(Dirtected Acycle Graph有向无环图,计算任务),可以将计算任务划分多个Stage,每一个Stage都支持分布式并行计算。Spark底层进行了大量优化(内存管理、网络传输、数据序列化、物理引擎、任务管理等)
- 易用性:Spark应用可以基于多种编程语言开发(Scala【推荐】、Java、Python、R、SQL),提供了大概80个操作方法(高阶函数)可以极大简化大数据应用的开发
- 通用性:Spark拥有一个强大生态库,可以解决大数据的批、流、SQL、Graph、ML、AI、BI等一系列问题
- 运行环境:Spark应用可以运行在多种集群中环境中,如Yarn、Mesos、K8S、Cloud,或者运行Spark自带资源管理调度系统(Standalone),local模式,常用于测试开发
集群环境搭建
Standalone模式
Standalone模式(又称为独立模式集群),本质是一种类似于Hadoop Yarn资源管理和调度系统,主要对分布式集群中计算资源(内存、CPU、网络、IO等一系列硬件)。Spark应用需要运行在Standalone集群中,进行并行计算
准备工作
CentOS7【内存:4G以上】
Hadoop版本2.9.2
Spark版本2.4.4
- 安装CentOS7
- 关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
- 修改主机名
[root@localhost ~]# vi /etc/hostname
SparkOnStandalone
- 配置网络
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
IPADDR=192.168.126.100 # 要根据VMNet8调整IP地址
NETMASK=255.255.255.0
ONBOOT=yes
[root@localhost ~]# systemctl restart network
- 配置主机名IP映射
[root@localhost ~]# vi /etc/hosts
192.168.126.100 SparkOnStandalone
[root@localhost ~]# ping SparkOnStandalone
PING SparkOnStandalone (192.168.126.100) 56(84) bytes of data.
64 bytes from SparkOnStandalone (192.168.126.100): icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from SparkOnStandalone (192.168.126.100): icmp_seq=2 ttl=64 time=0.039 ms
- 关闭虚拟机配置双网卡
- 安装文本编辑器vim
[root@SparkOnStandalone ~]# yum install -y vim
安装Hadoop HDFS
- 安装JDK
[root@SparkOnStandalone ~]# rpm -ivh jdk-8u171-linux-x64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_171-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
- 配置SSH免密登陆
[root@SparkOnStandalone ~]# ssh-keygen -t rsa
// 按四次回车 产生公私玥文件
[root@SparkOnStandalone ~]# ll -a .ssh/
总用量 8
drwx------. 2 root root 38 11月 22 11:22 .
dr-xr-x---. 3 root root 247 11月 22 11:22 ..
-rw-------. 1 root root 1679 11月 22 11:22 id_rsa
-rw-r--r--. 1 root root 404 11月 22 11:22 id_rsa.pub
// 将当前主机的公钥文件中的内容拷贝指定主机的授权列表中
[root@SparkOnStandalone ~]# ssh-copy-id SparkOnStandalone
[root@SparkOnStandalone ~]# ll -a .ssh/
总用量 16
drwx------. 2 root root 80 11月 22 11:23 .
dr-xr-x---. 3 root root 247 11月 22 11:22 ..
-rw-------. 1 root root 404 11月 22 11:23 authorized_keys
-rw-------. 1 root root 1679 11月 22 11:22 id_rsa
-rw-r--r--. 1 root root 404 11月 22 11:22 id_rsa.pub
-rw-r--r--. 1 root root 195 11月 22 11:23 known_hosts
// 测试SSH免密登陆,如无需密码登陆 SSH免密登陆配置成功 如需要密码 重试配置
[root@SparkOnStandalone ~]# ssh SparkOnStandalone
Last login: Fri Nov 22 11:17:58 2019 from 192.168.126.1
- 安装Hadoop
[root@SparkOnStandalone ~]# tar -zxf hadoop-2.9.2.tar.gz -C /usr
[root@SparkOnStandalone usr]# cd /usr/hadoop-2.9.2/
[root@SparkOnStandalone hadoop-2.9.2]# ll
总用量 128
drwxr-xr-x. 2 501 dialout 194 11月 13 2018 bin
drwxr-xr-x. 3 501 dialout 20 11月 13 2018 etc
drwxr-xr-x. 2 501 dialout 106 11月 13 2018 include
drwxr-xr-x. 3 501 dialout 20 11月 13 2018 lib
drwxr-xr-x. 2 501 dialout 239 11月 13 2018 libexec
-rw-r--r--. 1 501 dialout 106210 11月 13 2018 LICENSE.txt
-rw-r--r--. 1 501 dialout 15917 11月 13 2018 NOTICE.txt
-rw-r--r--. 1 501 dialout 1366 11月 13 2018 README.txt
drwxr-xr-x. 3 501 dialout 4096 11月 13 2018 sbin
drwxr-xr-x. 4 501 dialout 31 11月 13 2018 share
- 对HDFS进行配置
- core-site.xml
[root@SparkOnStandalone hadoop-2.9.2]# vi etc/hadoop/core-site.xml
<!--nn访问入口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://SparkOnStandalone:9000</value>
</property>
<!--hdfs工作基础目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.9.2/hadoop-${user.name}</value>
</property>
- hdfs-site.xml
[root@SparkOnStandalone hadoop-2.9.2]# vi etc/hadoop/hdfs-site.xml
<!--block副本因子-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--配置Sencondary namenode所在物理主机-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>SparkOnStandalone:50090</value>
</property>
<!--设置datanode最大文件操作数-->
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
<!--设置datanode并行处理能力-->
<property>
<name>dfs.datanode.handler.count</name>
<value>6</value>
</property>
- slaves
[root@SparkOnStandalone hadoop-2.9.2]# vi etc/hadoop/slaves
SparkOnStandalone
- 配置Hadoop&JDK环境变量
[root@SparkOnStandalone ~]# vim /root/.bashrc
HADOOP_HOME=/usr/hadoop-2.9.2
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
CLASSPATH=.
export HADOOP_HOME
export JAVA_HOME
export PATH
export CLASSPATH
[root@SparkOnStandalone ~]# source /root/.bashrc
- 启动Hadoop HDFS服务
# namenode在第一次启动时需要格式化
[root@SparkOnStandalone ~]# hdfs namenode -format
# 启动HDFS服务
[root@SparkOnStandalone ~]# start-dfs.sh
[root@SparkOnStandalone ~]# jps
11554 DataNode
11750 SecondaryNameNode
11433 NameNode
11998 Jps
# 或者访问: http://192.168.126.100:50070
安装Spark
- 解压缩安装
[root@SparkOnStandalone ~]# tar -zxf spark-2.4.4-bin-without-hadoop.tgz -C /usr
[root@SparkOnStandalone spark-2.4.4-bin-without-hadoop]# cd /usr
[root@SparkOnStandalone usr]# mv spark-2.4.4-bin-without-hadoop/ spark-2.4.4
[root@SparkOnStandalone usr]# cd spark-2.4.4/
[root@SparkOnStandalone spark-2.4.4]# ll
总用量 100
drwxr-xr-x. 2 1000 1000 4096 8月 28 05:52 bin # Spark操作指令
drwxr-xr-x. 2 1000 1000 230 8月 28 05:52 conf # 配置文件
drwxr-xr-x. 5 1000 1000 50 8月 28 05:52 data # 数据
drwxr-xr-x. 4 1000 1000 29 8月 28 05:52 examples # 示例代码
drwxr-xr-x. 2 1000 1000 8192 8月 28 05:52 jars # 运行所需类库
drwxr-xr-x. 4 1000 1000 38 8月 28 05:52 kubernetes # spark k8s容器支持
-rw-r--r--. 1 1000 1000 21316 8月 28 05:52 LICENSE
drwxr-xr-x. 2 1000 1000 4096 8月 28 05:52 licenses
-rw-r--r--. 1 1000 1000 42919 8月 28 05:52 NOTICE
drwxr-xr-x. 7 1000 1000 275 8月 28 05:52 python # spark python支持
drwxr-xr-x. 3 1000 1000 17 8月 28 05:52 R # r语言支持
-rw-r--r--. 1 1000 1000 3952 8月 28 05:52 README.md
-rw-r--r--. 1 1000 1000 142 8月 28 05:52 RELEASE
drwxr-xr-x. 2 1000 1000 4096 8月 28 05:52 sbin # spark系统管理相关的指令
drwxr-xr-x. 2 1000 1000 42 8月 28 05:52 yarn # spark对yarn集群集成整合目录
- 修改Spark配置文件
[root@SparkOnStandalone spark-2.4.4]# cd conf/
[root@SparkOnStandalone conf]# cp spark-defaults.conf.template spark-defaults.conf
[root@SparkOnStandalone conf]# cp spark-env.sh.template spark-env.sh
[root@SparkOnStandalone conf]# vim spark-env.sh
SPARK_WORKER_INSTANCES=1
SPARK_MASTER_HOST=SparkOnStandalone
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=4
SPARK_WORKER_MEMORY=2g
LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
SPARK_DIST_CLASSPATH=$(hadoop classpath)
export SPARK_MASTER_HOST
export SPARK_MASTER_PORT
export SPARK_WORKER_CORES
export SPARK_WORKER_MEMORY
export LD_LIBRARY_PATH
export SPARK_DIST_CLASSPATH
export SPARK_WORKER_INSTANCES
[root@SparkOnStandalone conf]# cp slaves.template slaves
[root@SparkOnStandalone conf]# vim slaves
SparkOnStandalone
- 启动Spark服务
[root@SparkOnStandalone spark-2.4.4]# sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/spark-2.4.4/logs/spark-root-org.apache.spark.deploy.master.Master-1-SparkOnStandalone.out
SparkOnStandalone: starting org.apache.spark.deploy.worker.Worker, logging to /usr/spark-2.4.4/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-SparkOnStandalone.out
# 验证方式一
[root@SparkOnStandalone spark-2.4.4]# jps
11554 DataNode
11750 SecondaryNameNode
19447 Jps
11433 NameNode
19179 Master # 独立模式集群 主服务
19291 Worker # 从服务
# 验证方式二
http://192.168.126.100:8080/

- spark-shell 指令窗口,可以运行Spark应用
重要参数:
–master : 表示spark shell连接那种类型的集群环境
–total-executor-cores num 表示计算任务的JVM进程所需要占用的核心数量
--master MASTER_URL spark://host:port, mesos://host:port, yarn,
k8s://https://host:port, or local (Default: local[*]).
--total-executor-cores num
[root@SparkOnStandalone spark-2.4.4]# bin/spark-shell --master spark://SparkOnStandalone:7077 --total-executor-cores 2
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://SparkOnStandalone:4040
Spark context available as 'sc' (master = spark://SparkOnStandalone:7077, app id = app-20191122120954-0000).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.
scala> 1+1
// spark应用 统计单词出现的次数
scala> :paste
// Entering paste mode (ctrl-D to finish)
sc
.textFile("hdfs://SparkOnStandalone:9000/text.txt")
.flatMap(_.split(" "))
.map((_,1))
.groupByKey()
.map(t => (t._1,t._2.size))
.saveAsTextFile("hdfs://SparkOnStandalone:9000/result")
// Exiting paste mode, now interpreting.
注意:Spark Shell会自动初始化两个核心对象SparkContext和Spark Session
计算结果:
[root@SparkOnStandalone ~]# hdfs dfs -cat /result/*
(Kafka,1)
(Hello,4)
(Hadoop,3)
Yarn模式
SparkOnYarn, Yarn是 Hadoop框架提供的一个分布式资源管理和调度系统
- ResourceManager
- NodeManager
克隆虚拟机
对克隆机进行微调
# 修改主机名
[root@SparkOnYarn ~]# vim /etc/hostname
SparkOnYarn
# 修改ens33网卡的IP地址
[root@SparkOnYarn ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
192.168.126.101
# 修改主机名映射
192.168.126.101 SparkOnYarn
# 修改Hadoop core-site.xml\hdfs-site.xml\slaves主机名配置
[root@SparkOnYarn ~]# vim /usr/hadoop-2.9.2/etc/hadoop/core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://SparkOnYarn:9000</value>
</property>
[root@SparkOnYarn ~]# vim /usr/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>SparkOnYarn:50090</value>
</property>
[root@SparkOnYarn ~]# vim /usr/hadoop-2.9.2/etc/hadoop/slaves
SparkOnYarn
# SSH免密登陆重新配置
[root@SparkOnYarn ~]# rm -rf .ssh/
[root@SparkOnYarn ~]# ssh-keygen -t rsa
[root@SparkOnYarn ~]# ssh-copy-id SparkOnYarn
# 删除克隆机上HDFS的历史数据
[root@SparkOnYarn ~]# rm -rf /usr/hadoop-2.9.2/hadoop-root/*
# 重新格式化HDFS
[root@SparkOnYarn ~]# hdfs namenode -format
# 启动HDFS的服务
[root@SparkOnYarn ~]# start-dfs.sh
- 安装Yarn集群
[root@SparkOnYarn ~]# vim /usr/hadoop-2.9.2/etc/hadoop/yarn-site.xml
<!--配置MapReduce计算框架的核心实现Shuffle-洗牌-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--配置资源管理器所在的目标主机-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>SparkOnYarn</value>
</property>
<!--关闭物理内存检查-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--关闭虚拟内存检查-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
[root@SparkOnYarn ~]# cp /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml.template /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml
[root@SparkOnYarn ~]# vim /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 启动Yarn集群
[root@SparkOnYarn ~]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/hadoop-2.9.2/logs/yarn-root-resourcemanager-SparkOnYarn.out
SparkOnYarn: starting nodemanager, logging to /usr/hadoop-2.9.2/logs/yarn-root-nodemanager-SparkOnYarn.out
[root@SparkOnYarn ~]# jps
8945 NodeManager
5811 DataNode
8807 ResourceManager
6008 SecondaryNameNode
5657 NameNode
9164 Jps
- Spark&Yarn整合
[root@SparkOnYarn spark-2.4.4]# vim conf/spark-env.sh
HADOOP_CONF_DIR=/usr/hadoop-2.9.2/etc/hadoop
YARN_CONF_DIR=/usr/hadoop-2.9.2/etc/hadoop
SPARK_EXECUTOR_CORES=4
SPARK_EXECUTOR_MEMORY=1g
SPARK_DRIVER_MEMORY=1g
LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
SPARK_DIST_CLASSPATH=$(hadoop classpath)
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs:///spark-logs"
export HADOOP_CONF_DIR
export YARN_CONF_DIR
export SPARK_EXECUTOR_CORES
export SPARK_DRIVER_MEMORY
export SPARK_EXECUTOR_MEMORY
export LD_LIBRARY_PATH
export SPARK_DIST_CLASSPATH
# 开启historyserver optional
export SPARK_HISTORY_OPTS
[root@SparkOnYarn spark-2.4.4]# vim conf/spark-defaults.conf
# 开启spark history server日志记录功能
spark.eventLog.enabled=true
spark.eventLog.dir=hdfs:///spark-logs
[root@SparkOnYarn ~]# hdfs dfs -mkdir /spark-logs
[root@SparkOnYarn ~]# /usr/spark-2.4.4/sbin/start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /usr/spark-2.4.4/logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-SparkOnYarn.out
[root@SparkOnYarn ~]# jps
8945 NodeManager
5811 DataNode
11811 HistoryServer
8807 ResourceManager
6008 SecondaryNameNode
11880 Jps
5657 NameNode
- 测试运行
- SparkShell
[root@SparkOnYarn spark-2.4.4]# bin/spark-shell --help
--master yarn
--total-executor-cores NUM 【不适用于Yarn】
--executor-cores NUM 每一个计算进程Cores数量
--num-executors NUM 计算进程数量
[root@SparkOnYarn spark-2.4.4]# bin/spark-shell --master yarn --executor-cores 2 --num-executors 2
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
19/11/22 17:11:09 WARN yarn.Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Spark context Web UI available at http://SparkOnYarn:4040
Spark context available as 'sc' (master = yarn, app id = application_1574413099567_0001).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
sc
.textFile("hdfs://SparkOnYarn:9000/text.txt")
.flatMap(_.split(" "))
.map((_,1))
.groupByKey()
.map(t => (t._1,t._2.size))
.saveAsTextFile("hdfs://SparkOnYarn:9000/result")
// Exiting paste mode, now interpreting.
- 远程提交运行
修改WordCount应用代码
import org.apache.spark.{SparkConf, SparkContext}
/**
* spark版本的单词统计
*/
object WordCountApplicationOnYarn {
def main(args: Array[String]): Unit = {
//1. 创建SparkContext,上下文对象提供spark应用运行环境信息
val conf = new SparkConf()
.setAppName("WordCount Apps")
.setMaster("yarn") // yarn集群模式
val sc = new SparkContext(conf)
//2. 编写DAG计算任务 有向无环图(某逻辑开发 --》 多重计算 --》最终输出)
val rdd = sc.textFile("hdfs://SparkOnYarn:9000/text.txt")
val result = rdd
.flatMap(line => line.split(" "))
.map(word => (word, 1L)) // (Hello,1L)
.groupByKey()
.map(t2 => (t2._1, t2._2.size))
result.saveAsTextFile("hdfs://SparkOnYarn:9000/result2")
//3. 释放资源
sc.stop()
}
}
- 重新打包
- 重新发布
[root@SparkOnYarn spark-2.4.4]# bin/spark-submit --master yarn --class com.baizhi.WordCountApplicationOnYarn --executor-cores 2 --num-executors 2 /root/spark-day1-1.0-SNAPSHOT.jar
本文详细介绍了Apache Spark的安装过程,包括概述Spark的特点和作用,重点讲解了如何在Standalone模式下搭建集群环境,以及在Yarn模式下整合Spark。文章覆盖了从安装CentOS7、配置Hadoop到启动Spark服务的完整步骤,并提到了Spark在不同运行环境下的配置参数。
882

被折叠的 条评论
为什么被折叠?



