大数据学习第五天

1. 总结spark学习过的知识点

(1)Spark的基本工作原理

(2)Spark核心概念

(3)Spark核心编程:转换与行动因子

注意:spark的版本是1.3,接下来会逐渐更新到2.4.

 

 

2. 详细介绍

(1)Spark的基本工作原理

1、分布式

2、主要基于内存(少数情况基于磁盘)

3、迭代式计算

 

(2)Spark核心概念

1、RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集。

2、RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作。(分布式数据集)

3、RDD通常通过Hadoop上的文件,即HDFS文件或者Hive表,来进行创建;有时也可以通过应用程序中的集合来创建。

4、RDD最重要的特性就是,提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己的数据来源重新计算该partition。这一切对使用者是透明的。

5、RDD的数据默认情况下存放在内存中的,但是在内存资源不足时,Spark会自动将RDD数据写入磁盘。(弹性)

 

Spark开发的工作主要有那些?

1、核心开发:离线批处理 / 延迟性的交互式数据处理

2、SQL查询:底层都是RDD和计算操作

3、实时计算:底层都是RDD和计算操作

 

(3)Spark核心编程:转换与行动因子

1、一个小栗子

(1)用Java开发wordcount程序,具体代码见idea

  1.1 配置maven环境

  1.2 如何进行本地测试

  1.3 如何使用spark-submit提交到spark集群进行执行(spark-submit常用参数说明,spark-submit其实就类似于hadoop的hadoop jar命令)

 

(2)用Scala开发wordcount程序

  2.1 下载scala ide for eclipse

  2.2 在Java Build Path中,添加spark依赖包(如果与scala ide for eclipse原生的scala版本发生冲突,则移除原生的scala / 重新配置scala compiler)

  2.3 用export导出scala spark工程

 

(3)用spark-shell开发wordcount程序

  3.1 常用于简单的测试

 

2.spark架构原理

 Driver        Master         Worker       Executor       Task

我的理解driver就是提交spark任务的机器,向master注册有任务需要执行,master分配任务下去给各个worker,各个worker拿到对应的task,并交由executor启动多个线程来执行task,并反注册给driver,有结果的时候通知driver。(注册和反注册)

 

3. 创建RDD

进行Spark核心编程时,首先要做的第一件事,就是创建一个初始的RDD。该RDD中,通常就代表和包含了Spark应用程序的输入源数据。然后在创建了初始的RDD之后,才可以通过Spark Core提供的transformation算子,对该RDD进行转换,来获取其他的RDD。

Spark Core提供了三种创建RDD的方式,包括:使用程序中的集合创建RDD;使用本地文件创建RDD;使用HDFS文件创建RDD。

个人经验认为:
1、使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的spark应用的流程。
2、使用本地文件创建RDD,主要用于临时性地处理一些存储了大量数据的文件。
3、使用HDFS文件创建RDD,应该是最常用的生产环境处理方式,主要可以针对HDFS上存储的大数据,进行离线批处理操作。

Spark的textFile()除了可以针对上述几种普通的文件创建RDD之外,还有一些特列的方法来创建RDD:

 

1、SparkContext.wholeTextFiles()方法,可以针对一个目录中的大量小文件,返回<filename, fileContent>组成的pair,作为一个PairRDD,而不是普通的RDD。普通的textFile()返回的RDD中,每个元素就是文件中的一行文本。

2、SparkContext.sequenceFile[K, V]()方法,可以针对SequenceFile创建RDD,K和V泛型类型就是SequenceFile的key和value的类型。K和V要求必须是Hadoop的序列化类型,比如IntWritable、Text等。

3、SparkContext.hadoopRDD()方法,对于Hadoop的自定义输入类型,可以创建RDD。该方法接收JobConf、InputFormatClass、Key和Value的Class。

4、SparkContext.objectFile()方法,可以针对之前调用RDD.saveAsObjectFile()创建的对象序列化的文件,反序列化文件中的数据,并创建一个RDD。

 

4. 操作RDD(transformation和action案例实战)

Spark支持两种RDD操作:transformation和action。transformation操作会针对已有的RDD创建一个新的RDD;而action则主要是对RDD进行最后的操作,比如遍历、reduce、保存到文件等,并可以返回结果给Driver程序。

 

例如,map就是一种transformation操作,它用于将已有RDD的每个元素传入一个自定义的函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。而reduce就是一种action操作,它用于对RDD中的所有元素进行聚合操作,并获取一个最终的结果,然后返回给Driver程序。

 

transformation的特点就是lazy特性。lazy特性指的是,如果一个spark应用中只定义了transformation操作,那么即使你执行该应用,这些操作也不会执行。也就是说,transformation是不会触发spark程序的执行的,它们只是记录了对RDD所做的操作,但是不会自发的执行。只有当transformation之后,接着执行了一个action操作,那么所有的transformation才会执行。Spark通过这种lazy特性,来进行底层的spark应用执行的优化,避免产生过多中间结果。

 

action操作执行,会触发一个spark job的运行,从而触发这个action之前所有的transformation的执行。这是action的特性。

操作

介绍

map

将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD

filter

对RDD中每个元素进行判断,如果返回true则保留,返回false则剔除。

flatMap

与map类似,但是对每个元素都可以返回一个或多个新元素。

gropuByKey

根据key进行分组,每个key对应一个Iterable<value>

reduceByKey

对每个key对应的value进行reduce操作。

sortByKey

对每个key对应的value进行排序操作。

join

对两个包含<key,value>对的RDD进行join操作,每个key join上的pair,都会传入自定义函数进行处理。

cogroup

同join,但是是每个key对应的Iterable<value>都会传入自定义函数进行处理。

 

操作

介绍

reduce

将RDD中的所有元素进行聚合操作。第一个和第二个元素聚合,值与第三个元素聚合,值与第四个元素聚合,以此类推。

collect

将RDD中所有元素获取到本地客户端。

count

获取RDD元素总数。

take(n)

获取RDD中前n个元素。

saveAsTextFile

将RDD元素保存到文件中,对每个元素调用toString方法

countByKey

对每个key对应的值进行count计数。

foreach

遍历RDD中的每个元素。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值