介绍

如果用Scala编程的话可以直接在IDEA中创建Maven使用。

Local版本:可以理解为单机版。

Standalone版本:可以理解为由Spark自己管理的集群。

Yarn版本:由Yarn管理的版本。

  1. 工作环境肯定是需要集群的。
  2. 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

修改配置

  1. 修改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
  1. 修改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
    3
    export JAVA_HOME=$JAVA_HOME
    YARN_CONF_DIR=/usr/local/ha/hadoop/etc/hadoop
    export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
  2. 配置log4j.properties 文件(可跳过)

    修改:rootLogger.level = inforootLogger.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 。结果如下:

截屏2023-06-20 12.53.12

测试

1
hadoop103@hadoop103:/usr/local/spark/bin$ ./run-example SparkPi 2>&1 | grep "Pi is roughly"

运行结果:

截屏2023-06-20 14.09.25

配置环境变量

这里只是为了启动方便才配置,如果懒的话可以不用配置。

1
vim ~/.bashrc

添加:

1
2
3
4
# spark
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
export PATH=$PATH:$SPARK_HOME/sbin

保存退出后:

1
source ~/.bashrc

Spark-Yarn 集群

  1. /usr/local/spark/conf创建文件:workers

    原本文件名为workers.template拷贝改名或者新建(后续不在提醒新建)都可以(旧版本的Spark可能叫slavers)

    写入内容:

    1
    2
    3
    hadoop103
    hadoop104
    hadoop105
  2. 修改spark-env.sh

    添加内容:

    1
    2
    export SPARK_MASTER_HOST=hadoop103
    export SPARK_MASTER_PORT=7077
  3. 配置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
  4. 配置log4j.properties 文件(可跳过)

    修改:rootLogger.level = inforootLogger.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所以需要特别指定路径。

测试

访问: http://hadoop103:8080

结果如下:

截屏2023-06-20 15.08.40

启动shell客户端:

1
spark-shell

这里启动的是scala的shell客户端,用命令pyspark,可以使用python操作spark。两者语法有不同。

效果如下:

截屏2023-06-20 14.56.57

利用 pyspark 启动的效果:

简单使用一下:

截屏2023-06-20 14.58.42

利用 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

效果:

截屏2023-06-20 15.07.37

再查看http://hadoop104:8088

效果:

截屏2023-06-20 15.09.55

可以看到最新的一次调度是Spark Pi。所以搭建成功。

Jupyter notebook连接Spark

安装Jupyter notebook

我是在我的Mac主机上安装的Jupyter notebook,你可以可以尝试Mac安装,Windows安装或者Linux中安装。

Mac安装教程:安装Jupyter并配置主题代码提示等

建议直接在Linux中安装(使用更方便)

在Linux中安装Jupyter Notebook

  1. 安装Python

    1
    sudo aptitude install python3

    输入:python3 -V检查:

    截屏2023-06-20 17.12.17

  2. 安装pip

    1
    sudo aptitude install python3-pip

    输入:pip -V检验:

    截屏2023-06-20 17.14.58

  3. 安装Jupyter Notebook

    1
    pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
  4. 启动Jupyter Notebook

    截屏2023-06-20 17.35.18

  5. server版Ubuntu配置(桌面版不用)

    1. 生成配置文件

      1
      jupyter notebook --generate-config

      截屏2023-06-20 17.37.22

    2. 生成密码

      1
      ipython

      然后分别输入:

      1
      2
      3
      from notebook.auth import passwd

      passwd()

      之后按两次回车,就会输出一个字符串,复制下来,如图:

      截屏2023-06-20 17.39.31

      然后输入exit()退出

    3. 修改 jupyter_notebook_config.py 文件(上面生成的)

      1
      cd ~/.jupyter
      1
      vim jupyter_notebook_config.py

      在最后添加:

      1
      2
      3
      4
      5
      c.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 #是否允许远程访问
    4. 启动Jupyter Notebook

      1
      jupyter notebook

      在哪个目录下输入命令则在哪个目录下打开

    5. 美化或拓展

      可参看 安装Jupyter并配置主题代码提示等

Mac(其它系统跳过)

这个很复杂,不如直接在Linux中直接装Jupyter Notebook了

  1. 下载 Livy 的安装包( 直达连接 ),上传到Linux中并解压到指定目录,例如 /usr/local/livy

  2. /usr/local/livy/conf 目c录下,复制 livy.conf.templatelivy.conf,并修改其中的配置项,例如:

    • livy.spark.master = yarn
    • livy.spark.deployMode = cluster
    • livy.server.port = 8998
  3. /usr/local/livy/conf 目录下,复制 livy-env.sh.templatelivy-env.sh,并修改其中的环境变量,例如:

    • export SPARK_HOME=/usr/local/spark
    • export HADOOP_CONF_DIR=/usr/local/ha/hadoop/etc/hadoop
  4. /usr/local/livy/conf 目录下,复制 spark-blacklist.conf.templatespark-blacklist.conf,并添加不允许用户覆盖的 Spark 配置选项,例如:

    • spark.master
    • spark.submit.deployMode
  5. 在虚拟机中启动 Livy 服务,执行 /usr/local/livy/bin/livy-server start,并查看日志文件 /usr/local/livy/logs 确认是否启动成功。

  6. 在 Mac 主机上安装 Jupyter Notebook 和 sparkmagic,执行 pip install jupyter sparkmagic

  7. 在 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"
    }
    }
  8. 在 Mac 主机上添加 sparkmagic kernel,执行以下命令:

    1
    2
    3
    4
    PYTHON3_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}
  9. 在 Mac 主机上启动 Jupyter Notebook,执行 jupyter notebook,并在浏览器中打开网页。

  10. 在 Jupyter Notebook 中新建一个 Python 3 文件,并选择 pysparkkernel 作为内核。

  11. 在 Jupyter Notebook 中编写和运行 Spark 代码,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import 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
    27
    import 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
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
27
28
29
import findspark

findspark.init('/usr/local/spark')

import pyspark
from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
import random

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()

此时运行如果有报错:WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.则执行如下操作:

  1. 在HDFS上创建spark_jars目录

    1
    hadoop fs -mkdir -p hdfs://myhacluster/spark/spark_jars
  2. 切换到Spark主目录下(我的是/usr/local/spark

    1
    hadoop fs -put jars/* hdfs://myhacluster/spark/spark_jars/

    这一步是把所有的Spark自带jar包上传到HDFS上。

  3. 配置 spark-default.conf (我的在/usr/local/spark/conf下)

    添加:

    1
    2
    # 设置spark的原生jar目录
    spark.yarn.jars hdfs://myhacluster/spark/spark_jars/*
  4. 重启Spark和Jupyter Notebook

最终效果如下:

截屏2023-06-20 19.47.12