【Spark1.6官方翻译】Spark快速入门
来源:互联网 发布:网络安全法案例 编辑:程序博客网 时间:2024/05/19 13:28
英文标题:Quick Start
英文原址:http://spark.apache.org/docs/latest/quick-start.html
Spark Version:1.6.0
- 使用Spark Shell进行交互分析
- 基础使用
- 复杂的RDD操作
- 缓存Caching
- Spark应用程序
- 深入Spark
- 使用Spark Shell进行交互分析
1. 使用Spark Shell进行交互分析
1. 基础使用
Spark Shell提供了建议的学习API的方式,是一个进行交互式数据分析的强大工具,它提供了Scala和Python的交互环境。
- scala
./bin/spark-shell
- python
./bin/pyspark
Spark的主要抽象是一个叫弹性分布式数据集(Resilient Distributed Dataset,RDD)的数据集合,RDD可以由Hadoop的输入格式(例如HDFS文件)创建或者由其他RDD转换而来。下例RDD由一个文件格式创建而来:
scala> val textFile = sc.textFile("/data/README.md")textFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:27
RDD有动作-actions(返回值)和转换-transformations(返回指向新RDD的指针)两种操作:
- 动作举例
scala> val textFile.count() //此RDD中项-items的数量res0: Long = 95scala> textFile.first() //此RDD的第一个项res1: String = # Apache Spark
- 转换举例
scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))linesWithSpark: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:29
同时可以将动作和转换串起来执行:
scala> textFile.filter(line => line.contains("Spark")).count //多少行包含单词‘Spark’res2: Long = 17
2. 复杂的RDD操作
RDD的动作和转换可以用来进行更复杂的计算。
- 示例任务:找出README.md中包含单词数最多的行的单词数量
scala> textFile.map(line => line.split(" ").size).reduce((a,b) => if(a > b) a else b)res3: Int = 14
首先将每一行映射(map)成一个整型值(创建了一个新的RDD),然后在此RDD上调用reduce找单词数量最大的。map和reduce的参数是Scala中函数,可以使用任意语言特征或Scala/Java库。例如,可以轻松的调用其他地方声明的函数,如下使用了Java中的Math.max()函数达到上述代码同样的效果:
scala> import java.lang.Mathimport java.lang.Mathscala> textFile.map(line => line.split(" ").size).reduce((a,b) => Math.max(a,b))res4: Int = 14
一个比较通用的数据计算模型是MapReduce,Spark可以轻松的执行MapReduce,如下:
scala> val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey((a,b) => a+b)wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[8] at reduceByKey at <console>:30
此处结合了flatMap,map,reduceByKey几个不同的转换计算文件中每一个单词的数量,得到一个(String,Int)对的RDD。接下来使用collection动作收集和呈现单词技术的结果:
scala> wordCounts.collect()res5: Array[(String, Int)] = Array((package,1), (this,1), (engine,1), (version,1), (file,1), (documentation,,1), (MASTER,1), (example,3), (are,1), (systems.,1), (params,1), (scala>,1), (DataFrames,,1), (provides,1), (refer,2)...
3. 缓存(Caching)
Spark支持将数据集拉到集群的内存缓存中,当数据集被频繁的访问(如热点数据集或云心个交互式的算法例如PageRank)时,这个特性特别重要。请看示例:
scala> linesWithSpark.cache()res6: linesWithSpark.type = MapPartitionsRDD[2] at filter at <console>:29scala> linesWithSpark.count()res7: Long = 17scala> linesWithSpark.count()res8: Long = 17
示例中,将linesWithSpark这个RDD进行缓存(虽然看上去将一个100行左右的文件进行缓存很可笑,但是此操作同样可以应用于非常大的数据集之上,即使数据集跨上百个节点同样可以),然后对它进行了2次count操作。从http://localhost:4040/jobs/ 的作业完成来看,缓存之后第一次计算仍然需要0.1s,但是第二次计算由于已经缓存成功,所以所需时长为16ms。
2. Spark应用程序
假设我们希望使用Spark API写一个自包含的应用程序,下面示例使用Scala(sbt编译)实现(Java(Maven编译)、Python请跳转至官方处查看)。
- scala
/* SimpleApp.scala */import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._import org.apache.spark.SparkConfobject SimpleApp { def main(args: Array[String]) { val logFile = "/data/README.md" // Should be some file on your system val conf = new SparkConf().setAppName("Simple Application") val sc = new SparkContext(conf) val logData = sc.textFile(logFile, 2).cache() val numAs = logData.filter(line => line.contains("a")).count() val numBs = logData.filter(line => line.contains("b")).count() println("Lines with a: %s, Lines with b: %s".format(numAs, numBs)) }}
应用程序必须顶一个一个main方法,而不是直接继承scala.App,因为scala.App的子类可能会运行错误。示例程序只计算了在README.md中包含字母a和b的总行数,此外,与上述的Spark-Shell示例不同之处在于,在应用程序中需要自行初始化SparkContext,在Spark Shell中已经初始化为sc。
给SparkContext构造器传递一个SparkConf对象作为参数,这个SparkConf对象包含了应用程序的一些信息,此程序基于Spark API,程序的运行目录结构中将包含一个simple.sbt文件用户解释Spark的依赖:
name := "Simple Project"version := "1.0"scalaVersion := "2.10.5"libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
接下来,需要根据当前的目录结构部署SimpleApp.scala和simple.sbt,以使sbt正常运行,然后可以将此程序打包成JAR包,使用spark-submit脚本进行提交运行。
# Your directory layout should look like this$ find .../simple.sbt./src./src/main./src/main/scala./src/main/scala/SimpleApp.scala# Package a jar containing your application$ sbt package...[info] Packaging {..}/{..}/target/scala-2.10/simple-project_2.10-1.0.jar# Use spark-submit to run your application$ YOUR_SPARK_HOME/bin/spark-submit \ --class "SimpleApp" \ --master local[4] \ target/scala-2.10/simple-project_2.10-1.0.jar...Lines with a: 46, Lines with b: 23
3. 深入Spark
- API的深入学习,查看“Spark编程指南”
- 在集群上运行应用程序,查看“部署概述”
- Spark示例(examples目录下,包括Scala、Java、Python、R),可运行如下:
# For Scala and Java, use run-example:./bin/run-example SparkPi# For Python examples, use spark-submit directly:./bin/spark-submit examples/src/main/python/pi.py# For R examples, use spark-submit directly:./bin/spark-submit examples/src/main/r/dataframe.R
- 【Spark1.6官方翻译】Spark快速入门
- 【Spark1.3官方翻译】 Spark Submit提交应用程序
- 【Spark1.3官方翻译】Spark集群模式概览
- Spark1.6.0官方文档翻译01--Spark Overview
- Spark1.6.0官方文档翻译02--spark-submit script
- Spark1.4.1 快速入门
- spark1.6.2 快速入门
- Spark官方文档-快速入门
- Spark学习2 【翻译】快速入门
- tinyxml:快速入门----一个官方带说明示例的翻译
- Gensim官方教程翻译(一)——快速入门
- Kafka官方文档翻译(二)快速入门
- matlab官方文档翻译之MATLAB 快速入门
- Gensim官方教程翻译——快速入门
- spark官方文档翻译收藏
- Spark编程指南--官方翻译
- Spark1.1.1官网文档翻译4Spark编程指南
- Spark1.1.1官网文档翻译2快速开始
- java 生成sqliteDB文件
- 跨平台统一时间格式
- Shortest Path Dijkstra 资料
- 文字+音频交互设计与技术实现
- NoClassDefFoundError when Espresso Tests are run
- 【Spark1.6官方翻译】Spark快速入门
- 数据结构实验之链表四:有序链表的归并
- Java设计模式(六)----适配器模式
- Java 获取http请求头内容
- C++ 类与对象
- Core SpotLight
- 使用Fiddler——模拟Http请求及对android应用抓包
- Git——Git相关基础知识
- linux下使用split 来分割大文件