文章目录
一、环境准备二、Spark环境搭建1. Spark部署方式2. 安装spark1) 下载Spark关于版本的选择2)安装Spark上传安装包解压并创建软链接Spark的目录结构配置环境变量配置Hadoop信息修改日志级别3)测试安装注意进入scala交互界面运行代码4)配置pyspark安装python安装pyspark开发包5) 配置Spark伪Standalone模式切换至配置文件目录spark-env.shslaves6) 测试standalone模式standalone启动查看进程web查看测试停止7) 配置Web交互式环境3. 代码提交编写wordcount程序提交代码到local提交代码到Standalone提交代码到YARN三、相关资源一、环境准备
虚拟机安装
虚拟机软件:VMware
操作系统 :Ubuntu1804
参考:/tangyi/article/details/120311293
JDK1.8
Hadoop安装
版本:2.7.7
参考:/tangyi/article/details/121908766
二、Spark环境搭建
1. Spark部署方式
Local模式:单机模式集群模式: Standalone模式:使用Spark自带的简单集群管理器YARN模式:使用YARN作为集群管理器Mesos模式:使用Mesos作为集群管理器Kubernetes模式:实验阶段2. 安装spark
1) 下载Spark
Spark官网的Download界面/downloads.html可选版本较少,比较这里打开的网页,只有三个版本可选。
可以在下载页面的下方进入它的release archives:/dist/spark/ 选择想要的版本。
关于版本的选择
这里以2.4.8版本为例,我们下载的安装文件应该是形如:spark-2.4.8-bin-xxxxxx.tgz的文件,很多人很困惑如何选择这些版本。
之所以会有这么多版本的选择,是因为Spark需要一些Hadoop客户端的依赖包(需要访问HDFS和YARN), 这些版本主要分为两类:
pre-packaged binary,将Hadoop客户端的依赖包编译到所下载的压缩包当中,比如spark-2.4.8-bin-hadoop2.6.tgz 和spark-2.4.8-bin-hadoop2.7.tgz ,
“Hadoop free” binary,需要自己通过配置SPARK_DIST_CLASSPATH
变量,以便可以包含指定版本的Hadoop的相关jar包,比如:spark-2.4.8-bin-without-hadoop-scala-2.12.tgz、spark-2.4.8-bin-without-hadoop.tgz 。
我们这里选择“Hadoop free” binary形式的spark-2.4.8-bin-without-hadoop.tgz进行下载,直接使用浏览器下载过慢,可以使用迅雷加速下载,也可以去后面的网盘资源进行下载。
2)安装Spark
这里约定虚拟机主机名为node1
,用户名为xiaobai
, 安装路径为/home/xiaobai/opt
,如果不是,请自行修改相应配置文件。
上传安装包
将下载好的安装包上传至虚拟机(当然你也可以直接在虚拟机中下载,省得上传文件)
解压并创建软链接
tar -xvf spark-2.4.8-bin-without-hadoop.tgz -C ~/optcd ~/optln -s spark-2.4.8-bin-without-hadoop spark
Spark的目录结构
ls ~/opt/spark
bin: 可执行脚本,比如常用的spark-shell, pyspark等。data:示例程序使用数据jars:依赖的jar包R:R API包yarn:整合yarn相关内容conf:配置文件目录examples:示例程序kubernetes:K8S相关内容licenses:许可文件python:python API包sbin:管理使用的脚本,比如: start-all.sh、start-master.sh等。
配置环境变量
vi ~/.bashrc
修改 .bashrc 文件,在文件末尾添加Spark的PATH路径
export SPARK_HOME=/home/xiaobai/opt/sparkexport PATH=$SPARK_HOME/bin:$PATH
运行下面的命令使配置生效
source ~/.bashrc
配置Hadoop信息
因为我们下载的是“Hadoop free” 版本,所以要配置SPARK_DIST_CLASSPATH
变量才能正常运行。
cd ~/opt/spark/confcp spark-env.sh.template spark-env.shvi spark-env.sh
在文件末尾添加配置如下信息
export SPARK_DIST_CLASSPATH=$(/home/xiaobai/opt/hadoop/bin/hadoop classpath)
修改日志级别
这一步可选,将日志级别调整至WARN级别,不至于看到过多的无效打印信息
cd ~/opt/spark/confcp log4j.properties.template log4j.properties #日志配置文件vi log4j.properties
修改如下配置:
log4j.rootCategory= WARN, console
日志也可以通过代码进行调整,假设SparkContext对象为sc,则可以通过方法setLogLevel进行级别调整
sc.setLogLevel("WARN")
3)测试安装
到此,Spark安装完成,此时便可使用Spark的local模式了。
注意
我们下载的Spark版本是基于scala 2.11.12,这时会报如下错误,但不影响使用.
[ERROR] Failed to construct terminal; falling back to unsupportedjava.lang.NumberFormatException: For input string: "0x100"
可以修改环境变量TERM
的值为xterm-color
解决:
vi ~/.bashrc
在文件末尾添加
export TERM=xterm-color
使配置生效
source ~/.bashrc
进入scala交互界面
使用如下命令进入scala交互界面:
spark-shell
运行代码
var r = sc.parallelize(Array(1,2,3,4))r.map(_*10).collect()
4)配置pyspark
安装python
如果是ubuntu18+版本,系统已经默认安装Python3;在ubuntu16以前,系统默认安装python2
为了避免Python环境带来不必要的麻烦,这里将介绍两种安装Python环境的方式,建议选择安装Anaconda的方式。
所谓的Python环境主要包括Python解释器、Scripts目录(包含比如pip.exe)以及Lib目录(标准库和包安装目录site-pakages),在指定Python环境时,其实主要就是指定运行哪个目录下的Python解释器。
在安装之前,要注意python的版本问题,比如在使用Python3.8版本时,运行pyspark会出现如下错误,本文将安装Python 3.6版本。
安装官方的Python
(1)安装所需依赖
sudo apt-get install -y gcc make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
(2)去官网下载对应版本源代码,这里以3.6.15为例
/downloads/source/
wget /ftp/python/3.6.15/Python-3.6.15.tar.xz
(3)安装Python
tar -xvf Python-3.6.15.tar.xzcd Python-3.6.15./configure --prefix=/opt/python3 --enable-optimizationssudo make && make install
注意,如果在安装过程中出现如下错误
subprocess.CalledProcessError: Command ‘(‘lsb_release’, ‘-a’)’ returned non-zero exit status 1
可以执行以下命令解决
rm -rf /usr/bin/lsb_release
(4)设置环境变量
为了使用刚才安装的Python版本,可以将包含python解释器的目录加入到path路径的最前面,所以在.bashrc
的文件末尾添加如下设置,并使用source ~/.bashrc
使配置生效。
export PATH=/opt/python3/bin:$PATH
安装Anaconda
(1)下载相应版本的Anaconda
可以在网页/archive/上选择相应版本进行下载,这里将下载Anaconda3-5.1.0-Linux-x86_64.sh
,其python对应版本为3.6。
cd ~/softwget /archive/Anaconda3-5.1.0-Linux-x86_64.sh
(2)安装anaconda
bash Anaconda3-5.1.0-Linux-x86_64.sh
然后一路回车,等出现接受许可界面,输入yes
接收许可。
接着可以配置anacoda的安装目录,这里配置的安装目录是:/home/xiaobai/opt/anaconda3
然后配置是否自动配置PATH路径,这里输入的yes
,让其自动配置
最后提示是否安装VSCode,这里输入的no
,拒绝安装。
(3)使配置生效
刚才在安装过程中已经自动配置了PATH路径,可以查看添加的配置内容:
tail ~/.bashrc
source ~/.bashrc
安装pyspark开发包
注意,这里的Pyspark指的是在使用python编程时需要使用的pyspark模块,类似Mysql与pymysql的关系。
可以使用在线安装和手动拷贝中的其中一种安装形式,推荐使用手动拷贝的方式。
在线安装
sudo apt install python3-pip #安装pip3sudo pip install pyspark==2.4.8 -i https://pypi.tuna./simple
手动拷贝
进入python交互界面,查看python的path值
import syssys.path
将~/opt/spark/python/lib下的py4j-0.10.7-src.zip和pyspark.zip解压拷贝到某一path路径,比如:
cd ~/opt/spark/python/libunzip py4j-0.10.7-src.zip -d /usr/local/lib/python3.6/dist-packagesunzip pyspark.zip -d /usr/local/lib/python3.6/dist-packages
5) 配置Spark伪Standalone模式
这里配置Standalone模式,为了方便初学者,这里只配置一台从节点,所以将其称为"伪Standalone模式"
切换至配置文件目录
cd ~/opt/spark/conf
spark-env.sh
vi spark-env.sh
添加如下配置信息
export SPARK_MASTER_HOST=node1#设置主节点地址export SPARK_WORKER_MEMORY=2g #设置节点内存大小,此处为4G。export SPARK_WORKER_CORES=2 #设置节点参与计算的核心数export SPARK_WORKER_INSTANCES=1#设置节点实例数export JAVA_HOME=/home/xiaobai/opt/jdkexport HADOOP_CONF_DIR=/home/xiaobai/opt/hadoop/etc/hadoop
slaves
vi slaves
配置从节点信息
node1
6) 测试standalone模式
standalone启动
~/opt/spark/sbin/start-all.sh
可以使用
start-master.sh
、start-slave.sh
和start-slaves.sh
分别启动Master节点,本机slave节点和所有slave节点此外,还会经常用到historysever,会用到脚本:
start-history-server.sh
,需要在spark-env.sh
中配置SPARK_HISTORY_OPTS
参数:
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://node1:9000/sparklog/ -Dspark.history.fs.cleaner.enabled=true"
查看进程
jps
web查看
node1:8080
测试
pyspark --master spark://node1:7077
运行测试代码
r = sc.parallelize(range(10))r.map(lambda x:x*2).collect()
停止
~/opt/spark/sbin/stop-all.sh
可以使用
stop-master.sh
、stop-slave.sh
和stop-slaves.sh
分别停止Master节点,本机slave节点和所有slave节点
7) 配置Web交互式环境
安装jupyter(如果在安装python时安装的anaconda,则不需要再安装jupyter, 因为anaconda本身包含了jupyter)
sudo pip3 install jupyter -i https://pypi.tuna./simple
启动jupyter进入交互界面
jupyter notebook
或者
jupyter lab
尝试运行代码
from pyspark import SparkConf, SparkContextconf = SparkConf().setMaster('local').setAppName("My App")sc = SparkContext(conf = conf)logFile = "file:///home/xiaobai/opt/spark/README.md"logData = sc.textFile(logFile, 2).cache()numAs = logData.filter(lambda line: 'a' in line).count()numBs = logData.filter(lambda line: 'b' in line).count()print('Lines with a: %s, Lines with b: %s' % (numAs, numBs))
3. 代码提交
编写wordcount程序
vi wordcount.py
编写代码:
from pyspark import SparkConf, SparkContextconf = SparkConf().setAppName("My App")sc = SparkContext(conf = conf)logFile = "file:///home/xiaobai/opt/spark/README.md"logData = sc.textFile(logFile, 2).cache()numAs = logData.filter(lambda line: 'a' in line).count()numBs = logData.filter(lambda line: 'b' in line).count()print('Lines with a: %s, Lines with b: %s' % (numAs, numBs))
提交代码到local
spark-submit wordcount.py
提交代码到Standalone
请确保已开启master和worker
spark-submit --master spark://node1:7077 wordcount.py
提交代码到YARN
spark-submit --master yarn wordcount.py
注意:
因为我们采用的是伪分布式,主机内存可能不够,可能导致如下错误
ERROR TransportClient: Failed to send RPC RPC 6184886792270084293 to /192.168.206.129:56372: java.nio.channels.ClosedChannelException
可以修改Hadoop的yarn-site.xml配置,然后重启YARN即可。
<property><name>yarn.nodemanager.pmem-check-enabled</name><value>false</value></property><property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>
spark-submit常用参数,可以使用help命令查看:
spark-submit --help
常用参数:
Options:--master MASTER_URL spark://host:port, mesos://host:port, yarn,k8s://https://host:port, or local (Default: local[*]).--deploy-mode DEPLOY_MODE Whether to launch the driver program locally ("client") oron one of the worker machines inside the cluster ("cluster"), (Default: client). --class CLASS_NAMEYour application's main class (for Java / Scala apps).--name NAME A name of your application.--jars JARS Comma-separated list of jars to include on the driverand executor classpaths.--packages Comma-separated list of maven coordinates of jars to includeon the driver and executor classpaths. Will search the localmaven repo, then maven central and any additional remoterepositories given by --repositories. The format for thecoordinates should be groupId:artifactId:version
三、相关资源
链接:/s/1u3Qbj2VQ8UbuSuGQOWjWCg 提取码:nuli