第 2 章
介绍了 Apache Spark 的基础知识。我们讨论了转换和动作,以及 Spark 如何惰性执行转换 操作的 DAG 图以优化 DataFrame 上的物理执行计划。我们还讨论了如何将数据组织到分区中, 并为处理更复杂的转换设定多个阶段。在第三章中我们将介绍庞大的 Spark 生态系统,并了解 Spark 中提供的包括流数据处理和机器学习等一些更高级的概念和工具。
第 3 章 Spark 工具集介绍
本章包括以下内容:
使用spark-submit运行应用程序
Dataset:类型安全的结构化数据 API
结构化流处理
机器学习和高级分析
弹性分布式数据集(RDD):Spark的低级API
SparkR
第三方软件包生态系统
spark-submit运行生产应用程序
spark-submit将你的应用程 序代码发送到一个集群并在那里执行。
spark-submit 提供了若干控制选项,你可以指定应用程序需要的资源,以及应用程序的运行方 式,还有运行参数等
Spark 附带的 Scala 示例应用程序 ,在你下载 Spark 的 目录中运行以下命令:
./bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master local \ ./examples/jars/spark-examples_2.11-2.2.0.jar 10
该示例应用程序计算 pi 的值以达到某个精度。在这里,我们告诉 spark-submit 我们想在本地机器上运行,我们想运行哪个类 和 哪个 JAR,以及一些命令行参数。
Dataset:类型安全的结构化数据 API
Dataset用于在 Java 和 Scala 中编写静态类型的代码。
DataFrame 是一个分布式的类型为 Row 的对象集合,它可以存储多种类型的表格数据。Dataset API 让用户可以用 Java / Scala 类定义 DataFrame 中的每条记 录,并将其作为类型对象的集合来操作,类似于 Java ArrayList 或 Scala Seq
例子:
// in Scala
case class Flight(DEST_COUNTRY_NAME: String,
ORIGIN_COUNTRY_NAME: String,
count: BigInt)
val flightsDF = spark.read
.parquet("/data/flight-data/parquet/2010-summary.parquet/")
val flights = flightsDF.as[Flight]
当你在 Dataset 上调用 collect 或 take 时,它将会收集 Dataset 中合适类型的对象,而不是 DataFrame 的 Row 对象。这样可以很容易地保证类型安全,并以分布式和本地方式安全地执行操作,而无需更改代码:
// in Scala
flights
.filter(flight_row => flight_row.ORIGIN_COUNTRY_NAME != "Canada")
.map(flight_row => flight_row)
.take(5)
flights
.take(5)
.filter(flight_row => flight_row.ORIGIN_COUNTRY_NAME != "Canada")
.map(fr => Flight(fr.DEST_COUNTRY_NAME, fr.ORIGIN_COUNTRY_NAME, fr.count + 5))
结构化流处理