Ubuntu 安装 Spark 3.0.1 初体验

文章目录

    官方入门文档

    https://spark.apache.org/docs/latest/

    Spark 下载地址

    https://spark.apache.org/downloads.html

    需要注意,默认这个页面的 jquery 文件地址被墙了,需要自行解决。

    我选择 Spark 3.0.1 版本 pre build for apache hadoop 2.7。

    网站会自动推荐一个下载地址,可以看到默认选择的是国内的北京外国语大学的下载源:

    wget https://mirrors.bfsu.edu.cn/apache/spark/spark-3.0.1/spark-3.0.1-bin-hadoop2.7.tgz
    

    下载。文件非常大,有 210M 之巨。

    > ls -lah
    total 210M
    -rw-rw-rw- 1 zhongwei zhongwei 210M Aug 28 17:25 spark-3.0.1-bin-hadoop2.7.tgz
    

    解压

    tar zxvf spark-3.0.1-bin-hadoop2.7.tgz
    

    目录结构

    > cd spark-3.0.1-bin-hadoop2.7
    > tree -L 1
    .
    ├── LICENSE
    ├── NOTICE
    ├── R
    ├── README.md
    ├── RELEASE
    ├── bin
    ├── conf
    ├── data
    ├── examples
    ├── jars
    ├── kubernetes
    ├── licenses
    ├── python
    ├── sbin
    └── yarn
    
    11 directories, 4 files
    

    Spark Shell 使用前需要先安装 JRE

    > ./bin/spark-shell
    JAVA_HOME is not set
    > ./bin/pyspark
    JAVA_HOME is not set
    

    可见,即便是 python 版本的 spark shell 也依赖于 Java。

    Spark 3.0.1 对 Java 版本的要求

    It’s easy to run locally on one machine — all you need is to have java installed on your system PATH, or the JAVA_HOME environment variable pointing to a Java installation.Spark runs on Java 811, Scala 2.12, Python 2.7+/3.4+ and R 3.5+. Java 8 prior to version 8u92 support is deprecated as of Spark 3.0.0. Python 2 and Python 3 prior to version 3.6 support is deprecated as of Spark 3.0.0. For the Scala API, Spark 3.0.1 uses Scala 2.12. You will need to use a compatible Scala version (2.12.x).

    从 Spark 官网文档 https://spark.apache.org/docs/latest/ 可知,Spark 3.0.1 依赖于 Java 8u92 版本以上。

    Ubuntu 安装 Java 8

    在我的 Ubuntu 上还没有安装 Java 环境:

    > javac
    Command 'javac' not found, but can be installed with:
    sudo apt install openjdk-11-jdk-headless  # version 11.0.8+10-0ubuntu1~20.04, or
    sudo apt install default-jdk              # version 2:1.11-72
    sudo apt install openjdk-8-jdk-headless   # version 8u265-b01-0ubuntu2~20.04
    sudo apt install openjdk-13-jdk-headless  # version 13.0.3+3-1ubuntu2
    sudo apt install openjdk-14-jdk-headless  # version 14.0.1+7-1ubuntu1
    sudo apt install ecj                      # version 3.16.0-1
    

    直接 apt 安装:

    sudo apt install openjdk-8-jdk-headless
    

    安装后,确认安装完成:

    > java -version
    openjdk version "1.8.0_265"
    OpenJDK Runtime Environment (build 1.8.0_265-8u265-b01-0ubuntu2~20.04-b01)
    OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
    

    体验一下 Spark Shell, “Hello World”

    > ./bin/spark-shell
    20/10/08 12:27:26 WARN Utils: Your hostname, PCMICRO-27VTFD1 resolves to a loopback address: 127.0.1.1; using 192.168.0.109 instead (on interface eth0)
    20/10/08 12:27:26 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
    20/10/08 12:27:26 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
    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://192.168.0.109:4040
    Spark context available as 'sc' (master = local[*], app id = local-1602131252287).
    Spark session available as 'spark'.
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_\   version 3.0.1
          /_/
    
    Using Scala version 2.12.10 (OpenJDK 64-Bit Server VM, Java 1.8.0_265)
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala>
    

    启动成功。

    参照官网的快速入门示例 https://spark.apache.org/docs/latest/quick-start.html

    执行:

    scala> val textFile = spark.read.textFile("README.md")
    textFile: org.apache.spark.sql.Dataset[String] = [value: string]
    
    scala> textFile.count()
    res0: Long = 108
    

    108 是什么?打开 README.md 可以看到这个文件一共 108 行。

    scala> textFile.filter(line => line.contains("Spark")).count()
    res3: Long = 19
    

    语法一目了然,不用注释都知道是什么意思。赞!

    Scala V.S. Python V.S. Java

    具体该使用那个语言作为 spark 的 api 操作语言,一直是困扰我的一个问题。

    • scala 是官方推荐的语言
    • python 是我相对喜欢的语言
    • java 是团队都会的语言

    对比 Scala 版和 Python 版的同一行功能语句:

    scala> textFile.filter(line => line.contains("Spark")).count()
    python> textFile.filter(textFile.value.contains("Spark")).count()
    

    从可读性上看,其实 scala 更好。

    而官方并没有给出 java shell 的示例,估计也没有 java 的 shell 版本,所以选择 scala 应该是更好的选择。

    但是,从 Java 版的 self contained application 版本的代码看:

    long numBs = logData.filter(s -> s.contains("b")).count();
    

    java 版的可读性也不错。同时 java 还有以下优势:

    • java 用途更广。例如,SpringBoot、Android 开发。Scala 相对局限。
    • java 的资料更全一些
    • java 会的人更多,也方便项目维护和交接
    • 虽然 shell 是调试的一大优势,但是不能使用 vim snippet,这种优势就不是很明显

    所以我还是决定使用 Java 作为 Spark 的练习语言。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式