Spark系统知识之二
1.Spark前言
Spark一个分布式计算系统,可以替代MR编程模型
1.流计算 批处理 SparkSQL
2.只要学习spark一中语言,就可以搞定其所有的知识
3.spark全方位的软件站
4.spark同时可以读取hdfs中的数据
5.spark同时也可以和HBASE,hive等交流
6.spark现在已经完全超过hadoop了
7.hadoop与spark相比的缺陷:
01,表达能力有限, 有些任务是无法转换成map/reduce
02,磁盘IO开销很大, map的任务先写入磁盘,然后reduce再读磁盘,导致IO开销很大
03,延迟很高 所有map任务完成之后,才能开始reduce的计算,导致延迟很高
8.spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型。Spark提供了内存计算,可以将中间结果放到内存中。对于迭代效率更高
9.Spark与Flink之间的区别
spark框架使用scala语言实现的,spark是基于数据片集合RDD进行小批量处理,采用了微批处理模型。
flink是java开发的,Flink是一行一行处理,基于操作符的连续流。
2.Spark安装
配置高可用的Spark集群
01.首先安装zk集群
02.在spark-env.sh中加入一个选项
spark-shell通过一个交互式的命令行,编写spark应用程序
bin/spark-shell –
sparkSubmit 即是一个driver program
3.what is RDD
RDD的专业论文介绍 – 加州伯克利大学
并行计算+容错+内存读取
1.RDD:Resilient Distributed Datasets
2.Transformation(延迟加载)与Action的区别
val rdd1 = sc.textFile(“hdfs://……”)
并没有触发读的任务,即transformation但是没有action
textFile是lazy的,rdd1.action才触发任务,接着报错
3.val rdd2 = rdd1.map(_.split(” “)) map方法同样是lazy的transformation
4.rdd2.collect 这个时候才是真正的执行操作
5.rdd3.saveAsTextFile(“hdfs://……”) 也是action状态
6.rdd是没有数据的,只有在真正运行的时候才会产生数据,这样的话就会减少内存空间的占用
7.直接把数据写回源数据集,executor—>写入到DataNode中
8. val arr = Array(1,2,3,4,5)
val rdd1 = sc.parallize(arr)
val rdd2 = rdd1.filter(_ % 2==0)
val rdd3 = rdd2.map(_ * 10)
rdd1,rdd2,rdd3都只会记录转换过程,但是不会记录结果
rdd3.collect 将结果返回给Driver中
rdd3.saveAsTextFile(hdfs://……)
rdd1.partitions.length查看分区的长度
9.先collect,再写到本地。如果没有collect过程就写入本地,将会出现意想不到的结果
10.val rdd = sc.parallelize(List(1,2,3,4,5,6,7,8),2)
指定了只有两个分区
rdd1.partitions.length
rdd1.saveAsTextFile(“hdfs://localhost:9000/result1”)
11.如果rdd从hdfs中读取数据,默认情况下,会根据切片来分配分区,
12.rightOuterJoin,leftOuterJoin,join操作只有在map条件下才可以使用
13.reduceByKey,groupByKey内部的实现过程
4.Action类的方法
1.reduce()
rdd.count
rdd.top(2) 最大的两个值
rdd.take
rdd.first 取第一个值
rdd.takeOrdered(3)