第4章 Spark CORE编程
Spark Core是整个项目的基石。它提供了分布式任务调度,调度和基本的I / O功能。Spark使用一个专门的基本的数据结构,该数据结构被称为RDD(弹性分布式数据集),RDD是整个机器的数据分区的逻辑集合。RDD可以通过两种方式来创建;一个是引用外部存储系统的数据集,第二是通过应用在现有RDD上变换(如map, filter, reducer, join))。
该RDD抽象通过语言集成API实现。这简化了编程的复杂性,因为应用程序的方式操纵RDD类似于操纵数据的本地集合。
4.1 Spark Shell
Spark提供一个交互Shell:一个用来交互分析数据的强大工具。它可以使用Scala或Python语言。Spark关键抽象在于RDD(一个分布式items集合)。RDD可以通过Hadoop Input Format(HDFS)或者其他RDD转换创建。
在命令行输入命令:spark-shell,就可以打开SparkShell。在命令行输入命令就可以创建一个简单的RDD:scala>val inputfile = sc.textFile(“input.txt”)。该命令执行结果的输出信息如下:
inputfile: org.apache.spark.rdd.RDD[String] = input.txt MappedRDD[1] at textFile at <console>:12 |
SparkRDD的API引入了一些Transformations和一些actions来操纵RDD。
4.2 RDDTransformations
RDDTransformations返回一个指向新RDD的指针,同时允许创建RDD间的依赖关系。每个RDD在依赖链(依赖的字符串)有计算其数据的功能,并有一个指针(依赖)指向parent RDD。Spark是懒惰的,除非调用一些transformation或action来触发job创建和执行,否则什么都不会被执行。因此,RDD Transformations不是一组数据,而是程序的一个步骤(可能是唯一的步骤),该步骤告诉Spark如何获取数据以及如何使用它。
给出下面RDD Transformations的列表:
4.3 Actions
4.4 用RDD编程
用一个例子的帮助我们看看几个RDD Transformations和Action在RDD编程上的实现。例如:计算出现在文档中的每个字。请看下面的文本输入,并在主目录的保存一个名为input.txt的文件。
input.txt:输入文件。
people are not as beautiful as they look, as they walk or as they talk. they are only as beautiful as they love, as they care as they share. |
按照下面的步骤来执行给定的例子
Step 1:打开Spark-Shell
在命令行输入:spark-shell 进入的Spark shell页面。
Step 2:创建一个RDD
在spark shell页面输入:val inputfile = sc.textFile("input.txt")
Step 3:执行Word 计数Transformations
在命令行输入:
scala> val counts = inputfile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_); |
Step 4:查看当前RDD详细信息和相关依赖
查看当前的RDD,这时可以用如下命令:counts.toDebugString。它显示当前RDD的描述且Debugging的依赖。
Step 5:Transformations缓存
可以使用persist()或cache()方法标记RDD。第一次在action上计算,它将把nodes存在内存中。使用以下命令来存储中间Transformations在内存中:counts.cache()
Step 6:Action应用
Action应用,比如存储中的所有Transformations,结果到一个文本文件中。对于saveAsTextFile("")的方法的参数是输出文件夹的绝对路径。输入如下命令,“output”文件是在当前位置:counts.saveAsTextFile("output")
Step 7:Output检查
打开另一个终端,进入到home路径下,输入如下命令,来检查output文件:
[hadoop@localhost~]$ cd output/
[hadoop@localhost output]$ ls -1
显示output路径下的所有文件: part-00000 part-00001 _SUCCESS
输入如下命令查看part-00000,part-00001文件的内容
$ cat part-00000 (people,1) (are,2) (not,1) (as,8) (beautiful,2) (they, 7) (look,1) |
4.5 UN-Persist存储
在进行非永久存储前,如果想查看这个应用的存储空间,可以在浏览器中输入如下URL:
http://localhost:4040 。在打开的浏览网页中显示,在spark shell运行的应用所消耗的存储空间:
如果想要某个特定的RDD不是持久的占据存储空间,可以在spark shell中输入如下命令,来进行设定:counts.unpersist()。命令执行成功后,Spark shell输出如下提示信息:
15/06/27 00:57:33 INFO ShuffledRDD: Removing RDD 9 from persistence list 15/06/27 00:57:33 INFO BlockManager: Removing RDD 9 15/06/27 00:57:33 INFO BlockManager: Removing block rdd_9_1 15/06/27 00:57:33 INFO MemoryStore: Block rdd_9_1 of size 480 dropped from memory (free 280061810) 15/06/27 00:57:33 INFO BlockManager: Removing block rdd_9_0 15/06/27 00:57:33 INFO MemoryStore: Block rdd_9_0 of size 296 dropped from memory (free 280062106) res7: cou.type = ShuffledRDD[9] at reduceByKey at <console>:14 |
在浏览器输入URL: http://localhost:4040 来校验设置是否成。在打开的浏览网页中显示,所有在spark shell运行的应用所消耗的存储空间: