搭建Spark环境
介绍
如果用Scala编程的话可以直接在IDEA中创建Maven使用。
Local版本:可以理解为单机版。
Standalone版本:可以理解为由Spark自己管理的集群。
Yarn版本:由Yarn管理的版本。
- 工作环境肯定是需要集群的。
- Spark主要是负责计算的,所以工作场景一定是Yarn版本更好
Yarn版本搭建
这里直接一步到位安装Yarn版本
下载安装包
去官网下载安装包。
我选择的是Spark3.4.0版本,下载直达链接:https://dlcdn.apache.org/spark/spark-3.4.0/spark-3.4.0-bin-hadoop3.tgz
上传到服务器
上传到/usr/local
目录下,方式可参考Hadoop集群搭建。
解压文件
如果上传到服务器后文件的后缀为.tgz
则:
1 | tar -zxf spark-3.4.0-bin-hadoop3.tgz |
如果是.tar
后缀则:
1 | tar -xf spark-3.4.0-bin-hadoop3.tar |
修改配置
修改hadoop配置文件:yarn-site.xml(我的位置在:
/usr/local/ha/hadoop/etc/hadoop/yarn-site.xml
如果没有配置Hadoop1高可用集群则是/usr/local/hadoop/etc/hadoop/yarn-site.xml
)在其中添加配置:
1
2
3
4
5
6
7
8
9
10<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是 true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是 true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>修改后分发改文件:
1
xsync /usr/local/ha/hadoop/etc/hadoop
修改conf/spark-env.sh(我的位置在:
/usr/local/spark/conf
下)进入目录下,默认文件为
spark-env.sh.template
没有spark-env.sh
拷贝一个:
1
cp spark-env.sh.template spark-env.sh
然后在该文件中添加(注意:不是无脑复制,注意看自己的路径):
1
2
3export JAVA_HOME=$JAVA_HOME
YARN_CONF_DIR=/usr/local/ha/hadoop/etc/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native配置log4j.properties 文件(可跳过)
修改:
rootLogger.level = info
为rootLogger.level = warn
如果版本不一样则:
log4j.rootCategory=INFO, console
改为:log4j.rootCategory=WARN, console
启动
先启动Hadoop再启动Spark。
启动Spark命令为:
1 | hadoop103@hadoop103:/usr/local/spark$ sbin/start-master.sh |
启动后访问: http://hadoop103:8080 。结果如下:
测试
1 | hadoop103@hadoop103:/usr/local/spark/bin$ ./run-example SparkPi 2>&1 | grep "Pi is roughly" |
运行结果:
配置环境变量
这里只是为了启动方便才配置,如果懒的话可以不用配置。
1 | vim ~/.bashrc |
添加:
1 | # spark |
保存退出后:
1 | source ~/.bashrc |
Spark-Yarn 集群
在
/usr/local/spark/conf
创建文件:workers原本文件名为
workers.template
拷贝改名或者新建(后续不在提醒新建)都可以(旧版本的Spark可能叫slavers)写入内容:
1
2
3hadoop103
hadoop104
hadoop105修改spark-env.sh
添加内容:
1
2export SPARK_MASTER_HOST=hadoop103
export SPARK_MASTER_PORT=7077配置spark-defaults.conf文件(可跳过)
写入:
1
2
3
4
5
6# 开启spark的日期记录功能
spark.eventLog.enabled true
# 设置spark日志记录的路径
spark.eventLog.dir hdfs://myhacluster/spark/spark_logs/
# 设置spark日志是否启动压缩
spark.eventLog.compress true注意,如果没有使用Hadoop高可用集群,其中的
myhacluster
改为主机名,例如:hadoop103
在HDFS上创建
sparklog
目录:1
hadoop fs -mkdir -p hdfs://myhacluster/spark/spark_logs
配置log4j.properties 文件(可跳过)
修改:
rootLogger.level = info
为rootLogger.level = warn
如果版本不一样则:
log4j.rootCategory=INFO, console
改为:log4j.rootCategory=WARN, console
分发spark目录
1 | hadoop103@hadoop103:/usr/local$ xsync spark/ |
启动集群
1 | hadoop103@hadoop103:/usr/local$ $SPARK_HOME/sbin/start-all.sh |
说明:因为Hadoop集群的启动命令也是start-all.sh
所以需要特别指定路径。
测试
结果如下:
启动shell客户端:
1 | spark-shell |
这里启动的是scala的shell客户端,用命令
pyspark
,可以使用python操作spark。两者语法有不同。
效果如下:
利用 pyspark 启动的效果:
简单使用一下:
利用 pyspark 启动的效果:
测试提交:
1 | spark-submit --class org.apache.spark.examples.SparkPi --master yarn /usr/local/spark/examples/jars/spark-examples_2.12-3.4.0.jar 10 |
效果:
效果:
可以看到最新的一次调度是Spark Pi。所以搭建成功。
Jupyter notebook连接Spark
安装Jupyter notebook
我是在我的Mac主机上安装的Jupyter notebook,你可以可以尝试Mac安装,Windows安装或者Linux中安装。
Mac安装教程:安装Jupyter并配置主题代码提示等
建议直接在Linux中安装(使用更方便)
在Linux中安装Jupyter Notebook
安装Python
1
sudo aptitude install python3
输入:
python3 -V
检查:安装pip
1
sudo aptitude install python3-pip
输入:
pip -V
检验:安装Jupyter Notebook
1
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
启动Jupyter Notebook
server版Ubuntu配置(桌面版不用)
生成配置文件
1
jupyter notebook --generate-config
生成密码
1
ipython
然后分别输入:
1
2
3from notebook.auth import passwd
passwd()之后按两次回车,就会输出一个字符串,复制下来,如图:
然后输入
exit()
退出修改 jupyter_notebook_config.py 文件(上面生成的)
1
cd ~/.jupyter
1
vim jupyter_notebook_config.py
在最后添加:
1
2
3
4
5c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False # 启动Jupyter Notebook之后是否打开浏览器
c.NotebookApp.password='argon2:$argon2id$v=19$m=10240,t=10,p=8$4S64fF2IGvHHdz10H65HvQ$jL1QYcWiKeqJB7GL091LU9UKiThagu+BWT/Hjfq3vr0'
c.NotebookApp.port = 8888 #端口号, 可以不一样
c.NotebookApp.allow_remote_access = True #是否允许远程访问启动Jupyter Notebook
1
jupyter notebook
在哪个目录下输入命令则在哪个目录下打开
美化或拓展
Mac(其它系统跳过)
这个很复杂,不如直接在Linux中直接装Jupyter Notebook了
下载 Livy 的安装包( 直达连接 ),上传到Linux中并解压到指定目录,例如
/usr/local/livy
。在
/usr/local/livy/conf
目c录下,复制livy.conf.template
为livy.conf
,并修改其中的配置项,例如:livy.spark.master = yarn
livy.spark.deployMode = cluster
livy.server.port = 8998
在
/usr/local/livy/conf
目录下,复制livy-env.sh.template
为livy-env.sh
,并修改其中的环境变量,例如:export SPARK_HOME=/usr/local/spark
export HADOOP_CONF_DIR=/usr/local/ha/hadoop/etc/hadoop
在
/usr/local/livy/conf
目录下,复制spark-blacklist.conf.template
为spark-blacklist.conf
,并添加不允许用户覆盖的 Spark 配置选项,例如:spark.master
spark.submit.deployMode
在虚拟机中启动 Livy 服务,执行
/usr/local/livy/bin/livy-server start
,并查看日志文件/usr/local/livy/logs
确认是否启动成功。在 Mac 主机上安装 Jupyter Notebook 和 sparkmagic,执行
pip install jupyter sparkmagic
。在 Mac 主机上修改
$HOME/.sparkmagic/config.json
文件,指定 Livy 服务的 url 和其他选项,例如:1
2
3
4
5
6
7
8
9
10
11{
"kernel_python_credentials" : {
"url": "http://hadoop103:8998"
},
"kernel_scala_credentials" : {
"url": "http://hadoop104:8998"
},
"kernel_r_credentials": {
"url": "http://hadoop105:8998"
}
}在 Mac 主机上添加 sparkmagic kernel,执行以下命令:
1
2
3
4PYTHON3_KERNEL_DIR="$(jupyter kernelspec list | grep -w "python3" | awk '{print $2}')"
KERNELS_FOLDER="$(dirname "${PYTHON3_KERNEL_DIR}")"
SITE_PACKAGES="$(pip show sparkmagic|grep -w "Location" | awk '{print $2}')"
cp -r ${SITE_PACKAGES}/sparkmagic/kernels/pysparkkernel ${KERNELS_FOLDER}在 Mac 主机上启动 Jupyter Notebook,执行
jupyter notebook
,并在浏览器中打开网页。在 Jupyter Notebook 中新建一个 Python 3 文件,并选择 pysparkkernel 作为内核。
在 Jupyter Notebook 中编写和运行 Spark 代码,例如:
1
2
3
4
5
6
7
8
9import findspark
findspark.init("/usr/local/spark")
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("test").getOrCreate()
spark.stop()如果没有报错就是成功。
做一个更复杂的计算Pi值的案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import findspark
findspark.init("/usr/local/spark")
import pyspark
from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
conf = SparkConf()
conf.setMaster("yarn")
conf.setAppName("Pi")
spark = SparkSession.builder.config(conf=conf).getOrCreate()
sc = spark.sparkContext
num_samples = 1000000
def inside(p):
x, y = random.random(), random.random()
return x*x + y*y < 1
count = sc.parallelize(range(0, num_samples)).filter(inside).count()
pi = 4 * count / num_samples
print("Pi is roughly %f" % pi)
spark.stop()
测试使用
先根据上述步骤安装Jupyter Notebook。然后输入命令打开。
直接创建Python3文件。
然后尝试如下代码:
1 | import findspark |
此时运行如果有报错:WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
则执行如下操作:
在HDFS上创建spark_jars目录
1
hadoop fs -mkdir -p hdfs://myhacluster/spark/spark_jars
切换到Spark主目录下(我的是
/usr/local/spark
)1
hadoop fs -put jars/* hdfs://myhacluster/spark/spark_jars/
这一步是把所有的Spark自带jar包上传到HDFS上。
配置 spark-default.conf (我的在
/usr/local/spark/conf
下)添加:
1
2# 设置spark的原生jar目录
spark.yarn.jars hdfs://myhacluster/spark/spark_jars/*重启Spark和Jupyter Notebook
最终效果如下: