Spark编程指南-快速开始
本教程简要介绍了如何使用Spark。我们将首先通过Spark的交互式shell(在Python或Scala中)介绍API,然后展示如何使用Java,Scala和Python编写应用程序。
首先,从Spark网站下载Spark的打包版本 。由于我们不会使用HDFS,您可以下载任何版本的Hadoop的软件包。
请注意,在Spark 2.0之前,Spark的主要编程接口是Resilient Distributed Dataset(RDD)。在Spark 2.0之后,RDD被数据集取代,数据集像RDD一样强类型,但在底层有更丰富的优化。仍然支持RDD接口,您可以在RDD编程指南中获得更详细的参考。但是,我们强烈建议您切换到使用数据集,它具有比RDD更好的性能。请参阅SQL编程指南以获取有关数据集的更多信息。
使用Spark Shell进行交互式分析
基础
在Spark包目录下执行 进入Spark Shell
./bin/spark-shell
从源目录中的 README 文件中的文本创建一个新的 RDD
scala> val textFile = spark.read.textFile("README.md")
textFile: org.apache.spark.sql.Dataset[String] = [value: string]
直接从Dataset获取值,或者转换数据集以获取新值
数据集中item的数量
scala> textFile.count()
res0: Long = 126
数据集中第一个item
scala> textFile.first
res2: String = # Apache Spark
有关数据集操作的更多信息
数据集操作和转换可用于更复杂的计算。
Spark可以轻松实现MapReduce wordcount
scala> textFile.flatMap( line => line.split(" ")).groupByKey(identity).count.collect
[Stage 4:==============================> [Stage 4:========================================> [Stage 4:==================================================== res7: Array[(String, Long)] = Array((online,1), (graphs,1), (["Parallel,1), (["Building,1), (thread,1), (documentation,3), (command,,2), (abbreviated,1), (overview,1), (rich,1), (set,2), (-DskipTests,1), (name,1), (page](http://spark.apache.org/documentation.html).,1), (["Specifying,1), (stream,1), (run:,1), (not,1), (programs,2), (tests,2), (./dev/run-tests,1), (will,1), ([run,1), (particular,2), (option,1), (Alternatively,,1), (by,1), (must,1), (using,5), (you,4), (MLlib,1), (DataFrames,,1), (variable,1), (Note,1), (core,1), (more,1), (protocols,1), (guidance,2), (shell:,2), (can,7), (site,,1), (systems.,1), (Maven,1), ([building,1), (configure,1), (for,12), (README,1), (Interactive,2), (how,3), ([Configuration,1), (Hive,2), (system,1), (provides,1), (Hadoop-supported,1), (pre-built,1...
缓存
Spark还支持将数据集提取到群集范围的内存缓存中
独立的应用
可以创建一个包含应用程序代码的 JAR 包,然后使用 spark-submit 脚本来运行我们的程序。
按项目结构放置文件 打包成jar包 上传
结构
SimpleApp.scala
import org.apache.spark.sql.SparkSession
object SimpleApp {
def main(args: Array[String]): Unit = {
val logFile = "/usr/local/spark/README.md"
val spark = SparkSession.builder().appName("Simple Application").getOrCreate()
val logData = spark.read.textFile(logFile)
val numAs = logData.filter(line => line.contains("a")).count()
val numBs = logData.filter(line => line.contains("b")).count()
println(s"Lines with a: $numAs,Lines with b: $numBs")
spark.stop()
}
}
build.sbt
name := "Simple Project"
version := "0.1"
scalaVersion := "2.11"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.0"
上传到虚拟机运行:
./bin/spark-submit --class "SimpleApp" --master local[4] /root/test/Simple\ Project.jar
运行成功
打印出包含文件中a的行数和包含b的行数