Ubuntu 安装 Spark 3.0.1 初体验

更新日期: 2020-10-08 阅读次数: 178 字数: 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 的练习语言。

推荐

领取阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊, 查看更多联系方式。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。同时也欢迎关注我的微信公众号“大象工具”: 大象工具微信公众号

tags: JAVA_HOME is not set

相关文章

爱评论不评论

近期节日

2020年10月31日 世界勤俭日
2020年11月01日 万圣节
2020年11月07日 立冬
2020年11月08日 中国记者日
2020年11月10日 世界青年节
2020年11月11日 光棍节
2020年11月14日 世界糖尿病日
2020年11月17日 国际大学生节
2020年11月20日 国际儿童日
2020年11月21日 世界问候日
2020年11月22日 小雪
2020年11月26日 感恩节
查看更多节日