Spark安装

本文详细介绍了Apache Spark的安装过程,包括概述Spark的特点和作用,重点讲解了如何在Standalone模式下搭建集群环境,以及在Yarn模式下整合Spark。文章覆盖了从安装CentOS7、配置Hadoop到启动Spark服务的完整步骤,并提到了Spark在不同运行环境下的配置参数。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值