总览(Overview)
从系统的高层讲,每一个Spark应用程序都包含着一个驱动程序,驱动程序执行用户的main方法和执行在集群上的不同的parallel操作。Spark提供的一个主要的抽象是RDD(弹性分布式集合, resilient distributed dataset)。RDD是多个可在集群中分片的元素的集合。因此,它们可以被并行操作。RDD的创建可以是由HDFS中的一个文件开始创建(或者任何其他hadoop支持的文件系统),或者由在驱动程序中的Scala集合创建,然后转换这个集合。使用者也可以让RDD驻留在内存中,这样可以使RDD更有效的进行并行操作。最后,RDD可以从结点故障中自动的恢复。
Spark中的第二抽象是在并行操作中使用的共享广播变量。默认情况下,当Spark在不同的结点中运行一个作为一组任务的方法时,在每个任务的方法中都会有每个变量的拷贝。有时,某些变量需要在各个任务中共享,或者需要在驱动程序和任务之间共享。Spark支持两种类型的共享变量,共享广播变量(在所有结点的内存中缓存),累加器(变量只能被”加”,例如计数和求和)
这篇guide将展示在各个spark所支持语言中这些特色。如果你使用Spark交互式shell程序,这将变得很容易。bin/spark-shell来启动Scala shell,bin/pyspark来启动python shell。
和Scala相连接
Spark 2.2.0 默认是分布式的,和Scala 2.11相匹配。为了用scala编写应用程序,你需要使用兼容的scala版本(例如,2.11.X)
为了编写Spark应用程序,你可以添加通过maven中心仓库添加maven依赖:
groupId = org.apache.spark
artifactId = spark-core_2.11
version = 2.2.0
另外,如果你希望使用HDFS集群,则你需要添加hadoop-client依赖(对应你的hdfs版本):
groupId = org.apache.hadoop
artifactId = hadoop-client
version = <your-hdfs-version>
最后,你需要引入一些Spark class,加入下面的两行代码:
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
Spark的初始化
在一个Spark程序中,首先要做的是创建一个SparkContext对象。这个对象向Spark参数了如何利用集群。为了创建SparkContext对象,你首先需要创建SparkConf对象,该对象包含着你的应用信息:
val conf = new SparkConf().setAppName(appName).setMaster(master)
new SparkContext(conf)
参数appname是你的应用程序名称。参数maser是Spark,Mesos 或者YARN集群的URL,或者一个特殊的”local”来执行本地调试。在实际中,当在集群中运行时,你并不想在程序中硬编码master,而是采用spark-submi