Ubuntu 安装 Spark 3.0.1 初体验

更新日期: 2020-10-08 阅读次数: 6116 字数: 1018 分类: spark

官方入门文档

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 8/11, 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 的练习语言。

推荐

tags: JAVA_HOME is not set

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式