第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)_RDD程序

大数据学习笔记-------------------(4)_Spark Core编程_02

4.3 Actions

  大数据学习笔记-------------------(4)_Spark Action_03

大数据学习笔记-------------------(4)_Spark Transformation_04

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运行的应用所消耗的存储空间:

     大数据学习笔记-------------------(4)_Spark Action_05

    如果想要某个特定的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运行的应用所消耗的存储空间:

   大数据学习笔记-------------------(4)_Spark Transformation_06