安装Scala-2.12.8
进入安装路径,获取Scala
cd /home/cz/data/soft
wget https://downloads.lightbend.com/scala/2.12.8/scala-2.12.8.tgz
解压
tar -zxvf scala-2.12.8.tgz
配置环境变量
sudo vim /etc/profile
export SCALA_HOME=/home/cz/data/soft/scala-2.12.8 #你的Scala所在路径
export PATH=:$SCALA_HOME/bin
保存退出、是环境变量生效
source /etc/profile
验证是否安装成功
scala -version
如下,说明安装成功
安装Spark-2.4.0
进入需要安装的目录下,下载Spark,解压,这里选择清华大学镜像源
cd /home/cz/data/soft
wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz
更改文件名
mv spark-2.4.0-bin-hadoop2.7 spark-2.4.0
配置环境变量
sudo vim /etc/profile
export SCALA_HOME=/home/cz/data/soft/spark-2.4.0#你的Spark所在路径
export PATH=:$SCALA_HOME/bin
配置Spark
修改Spark目录下的conf目录下的配置文件
拷贝配置文件副本
cp spark-env.sh.template spark-env.sh
sudo vim spark-env.sh
添加如下内容
# Java 所在目录
export JAVA_HOME=/home/cz/data/soft/jdk1.8
# Scala所在目录
export SCALA_HOME=/home/cz/data/soft/scala-2.12.8
# Hadoop所在目录
export HADOOP_HOME=/home/cz/data/soft/hadoop
# Hadoop配置文件的目录
export HADOOP_CONF_DIR=/home/cz/data/soft/hadoop/etc/hadoop
# Spark临时文件目录
SPARK_LOCAL_DIRS=/home/cz/data/soft/spark-2.4.0/tmp
# 本机IP地址
SPARK_LOCAL_IP=localhost
启动Spark,进入Spark目录的sbin目录下,执行启动命令
./start-all.sh
打印如下信息
在浏览器地址栏输入
localhost:8080
Spark启动成功
Spark入门练习
运行自带用例,bin目录下执行 run-example SparkPi
使用Spark Shell 进行交互式分析
先启动hadoop
启动spark
启动Spark Shell
spark-shell
Spark 的主要抽象是一个称为 Dataset 的分布式的 item 集合。Datasets 可以从 Hadoop 的 InputFormats(例如 HDFS文件)或者通过其它的 Datasets 转换来创建。让我们从 Spark 源目录中的 README 文件来创建一个新的 Dataset:
val textFile = spark.read.textFile("file:///home/cz/data/soft/spark-2.4.0/README.md")
执行一些简单的actions(动作), 或者 transform(转换)
textFile.count()
textFile.first()
调用 filter
以返回一个新的 Dataset, 它是文件中的 items 的一个子集。
val linesWithSpark = textFile.filter(line => line.contains("Spark"))
链式操作 transformation(转换)和 action(动作)
textFile.filter(line => line.contains("Spark")).count()
基于Python的交互式分析
./bin/pyspark
textFile = spark.read.text("file:///home/cz/data/soft/spark-2.4.0/README.md")
textFile.count()
textFile.first()
linesWithSpark = textFile.filter(textFile.value.contains("Spark"))
Dataset actions(操作)和 transformations(转换)可以用于更复杂的计算。例如, 统计出现次数最多的行
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
第一个 map 操作创建一个新的 Dataset, 将一行数据 map 为一个整型值。在 Dataset 上调用 reduce
来找到最大的行计数。参数 map
与 reduce
是 Scala 函数(closures), 并且可以使用 Scala/Java 库的任何语言特性。例如, 我们可以很容易地调用函数声明, 我们将定义一个 max 函数来使代码更易于理解
import java.lang.Math
textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))
Spark 可以很容易实现 MapReduce
val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count()
在这里, 我们调用了 flatMap
以 transform 一个 lines 的 Dataset 为一个 words 的 Dataset, 然后结合 groupByKey
和 count
来计算文件中每个单词的 counts 作为一个 (String, Long) 的 Dataset pairs。要在 shell 中收集 word counts, 我们可以调用 collect
wordCounts.collect()
python方式
textFile = spark.read.text("file:///home/cz/data/soft/spark-2.4.0/README.md")
from pyspark.sql.functions import *
textFile.select(size(split(textFile.value, "\s+")).name("numWords")).agg(max(col("numWords"))).collect()
wordCounts = textFile.select(explode(split(textFile.value, "\s+")).alias("word")).groupBy("word").count()
Spark 还支持 Pulling(拉取)数据集到一个群集范围的内存缓存中。例如当查询一个小的 “hot” 数据集或运行一个像 PageRANK 这样的迭代算法时, 在数据被重复访问时是非常高效的。举一个简单的例子, 让我们标记我们的 linesWithSpark
数据集到缓存中
linesWithSpark.cache()
linesWithSpark.count()
linesWithSpark.count()