官方入门文档
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 聊聊, 查看更多联系方式