跟天齐老师学Spark(6)--Spark的常用算子介绍

来源:互联网 发布:淘宝店代理货源怎么找 编辑:程序博客网 时间:2024/04/29 13:17
spark的常用算子介绍:
Resilient(弹性且可复原) Distributed(分布式) Datasets(数据集) (RDDs)

我们以前学的scala的原生方法都是数组或者集合上定义的,它只能操作单机。
而spark中的方法都是定义在RDD上的,它们操作的是集群。

spark的方法有两类操作:
一种是:Transformations,它是lazy的,不会触发任务的执行,是一种转换
(从一种形式变成另一种形式),是延迟加载的;
一种是:Actions,执行出结果,是一种动作,是立即加载(执行)的;

看一下spark 的常用算子:登录spark的官网
http://spark.apache.org/
下面是官方的Spark编程指南:
http://spark.apache.org/docs/1.6.2/programming-guide.html
在指南的列表目录中有 Transformations 和 Actions 。

Diver是客户端,它提交程序到spark集群,而计算的返回结果会再发回给Diver客户端。
Transformations有很多,比如说map方法,filter方法,mapPartitions方法,
sample方法,union方法,intersection方法,distinct方法,groupByKey方法,
reduceByKey方法,aggregateByKey方法,sortByKey方法,join方法,

Transformations 的特点是,它是lazy的,并不会触发任务的执行。

有scala的API:
http://spark.apache.org/docs/1.6.2/api/scala/index.html#org.apache.spark.rdd.RDD
也有java的API:
http://spark.apache.org/docs/1.6.2/api/java/index.html?org/apache/spark/api/java/JavaRDD.html


Actions的方法有:reduce方法,collect方法,count方法,first方法,
take方法,takaSample方法,takeOrdered方法,saveAsTextFile方法,
countByKey方法,foreach方法。

---------------------------------------------------------------------
说一下spark的第一类算子:Transformations
如果要从hdfs中读取数据,或者从关系型数据库中读数据,如果我们的hdfs或者关系型数据库没有启动,
此时使用Transformations类型的算子,就不会报错。因为它只会记录一下它将从哪里读取数据。
Transformations仅仅是一种转换操作,而Action则是一些执行操作。

spark支持从本地文件系统、hdfs、s3、hbase等读取数据。

在Worker中有一个进程叫做"CoarseGrainedExecutorBackend"进程,它负责读取数据、
对数据进行切分、聚合等操作,都是在Executor中完成的。



在Driver端启动了一个spark-shell,然后在这里写任务,比如写一些转换和Action,在写
转换的时候,它会在这个spark-shell中记录我们是怎样转换的,一旦触发Action,Driver端就会把
任务提交到我们的Executor上执行,执行返回的结果会收集到Driver端。每个Executor只负责计算其
中的属于它的数据。

这就是分布式思维,一个大的任务让一台机器去干,它干不了,那么我们就分成很多的小任务,
由多台机器去并行执行。最后将所有的结果收集起来,存到外部存储介质中。

从外部存储介质中将数据读进来然后创建的RDD,还有一个种创建RDD的方法:
//使用spark的并行化方法创建RDD,并指定分区数为2个:
sc.parallelize(Array(1,2,3,4,5,6,7,8,9),2),也能创建一个RDD,
它会将一个集合或者数组转换成RDD,还能指定分区数,这里我们给它指定了分区数为2。

这样它就会生成两个结果文件。就像MapReduce中的一样,如果有两个reduce就
会有两个结果文件一样。

RDD上的这些常用算子一定要练习。

------------------------------------------------
RDD的Action算子:
我们把Spark的客户端叫做Driver。

启动Master;
启动Worker;
Worker向Master注册;
Master向Worker反馈;
Worker向Master发送心跳。

Driver首先会跟Master进行RPC通信(因为我们在shell命令
中指定了--master的位置,所以它会去找Master)。向Master申请资源;

Master启动符合条件的Worker来启动Executor(Master会告诉Worker
启动Executor这个java子进程。Executor进程是由Worker进程启动的。);
Executor会主动跟Driver进行通信(因为Driver会把它的一些信息发送给Master,而Master会把Driver的信息
封装起来,发送给Worker,而Executor就通过Worker知道了Driver的信息,所以就能找到Driver了),

接下来就可以写spark程序了。

可以为数据指定分区的。
一个分区一定属于一台机器,但是一台机器可能有多个分区。
数据的读取和计算都是在Executor中完成的。


rdd的foreachPartition方法可以将数据取出来存到关系型数据库中(后面再介绍)。
0 0