课程表

Spark 基础

Spark RDDs

Spark Streaming

Spark SQL

GraphX编程指南

工具箱
速查手册

Spark Shell

当前位置:免费教程 » 数据库/运维 » Spark

使用 Spark Shell

基础

Spark 的 shell 作为一个强大的交互式数据分析工具,提供了一个简单的方式来学习 API。它可以使用 Scala(在 Java 虚拟机上运行现有的 Java 库的一个很好方式) 或 Python。在 Spark 目录里使用下面的方式开始运行:

  1. ./bin/spark-shell

Spark 最主要的抽象是叫Resilient Distributed Dataset(RDD) 的弹性分布式集合。RDDs 可以使用 Hadoop InputFormats(例如 HDFS 文件)创建,也可以从其他的 RDDs 转换。让我们在 Spark 源代码目录从 README 文本文件中创建一个新的 RDD。

  1. scala> val textFile = sc.textFile("README.md")
  2. textFile: spark.RDD[String] = spark.MappedRDD@2ee9b6e3

RDD 的 actions 从 RDD 中返回值,transformations 可以转换成一个新 RDD 并返回它的引用。让我们开始使用几个操作:

  1. scala> textFile.count() // RDD 的数据条数
  2. res0: Long = 126
  3. scala> textFile.first() // RDD 的第一行数据
  4. res1: String = # Apache Spark

现在让我们使用一个 transformation,我们将使用 filter 在这个文件里返回一个包含子数据集的新 RDD。

  1. scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
  2. linesWithSpark: spark.RDD[String] = spark.FilteredRDD@7dd4af09

我们可以把 actions 和 transformations 链接在一起:

  1. scala> textFile.filter(line => line.contains("Spark")).count() // 有多少行包括 "Spark"?
  2. res3: Long = 15

更多 RDD 操作

RDD actions 和 transformations 能被用在更多的复杂计算中。比方说,我们想要找到一行中最多的单词数量:

  1. scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
  2. res4: Long = 15

首先将行映射成一个整型数值产生一个新 RDD。 在这个新的 RDD 上调用 reduce 找到行中最大的个数。 mapreduce 的参数是 Scala 的函数串(闭包),并且可以使用任何语言特性或者 Scala/Java 类库。例如,我们可以很方便地调用其他的函数声明。 我们使用 Math.max() 函数让代码更容易理解:

  1. scala> import java.lang.Math
  2. import java.lang.Math
  3. scala> textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))
  4. res5: Int = 15

Hadoop 流行的一个通用的数据流模式是 MapReduce。Spark 能很容易地实现 MapReduce:

  1. scala> val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
  2. wordCounts: spark.RDD[(String, Int)] = spark.ShuffledAggregatedRDD@71f027b8

这里,我们结合 [flatMap](), [map]() 和 [reduceByKey]() 来计算文件里每个单词出现的数量,它的结果是包含一组(String, Int) 键值对的 RDD。我们可以使用 [collect] 操作在我们的 shell 中收集单词的数量:

  1. scala> wordCounts.collect()
  2. res6: Array[(String, Int)] = Array((means,1), (under,2), (this,3), (Because,1), (Python,2), (agree,1), (cluster.,1), ...)

缓存

Spark 支持把数据集拉到集群内的内存缓存中。当要重复访问时这是非常有用的,例如当我们在一个小的热(hot)数据集中查询,或者运行一个像网页搜索排序这样的重复算法。作为一个简单的例子,让我们把 linesWithSpark 数据集标记在缓存中:

  1. scala> linesWithSpark.cache()
  2. res7: spark.RDD[String] = spark.FilteredRDD@17e51082
  3. scala> linesWithSpark.count()
  4. res8: Long = 15
  5. scala> linesWithSpark.count()
  6. res9: Long = 15

缓存 100 行的文本文件来研究 Spark 这看起来很傻。真正让人感兴趣的部分是我们可以在非常大型的数据集中使用同样的函数,甚至在 10 个或者 100 个节点中交叉计算。你同样可以使用 bin/spark-shell 连接到一个 cluster 来替换掉编程指南中的方法进行交互操作。

Spark 运行程序

祝贺你成功运行你的第一个 Spark 应用程序!

  • 要深入了解 API,可以从Spark编程指南开始,或者从其他的组件开始,例如:Spark Streaming。
  • 要让程序运行在集群(cluster)上,前往部署概论
  • 最后,Spark 在 examples 文件目录里包含了 Scala, JavaPython 的几个简单的例子:
  1. # For Scala and Java, use run-example:
  2. ./bin/run-example SparkPi
  3. # For Python examples, use spark-submit directly:
  4. ./bin/spark-submit examples/src/main/python/pi.py
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号