写出Spark任务提交命令
spark-submit
--class 类全限定名
--master spark://spark:7077 (端口)
--executor-memory 512m (运行内存)
--total-excutor-cores 2 (执行任务线程数量)
列出至少5个用于聚合类的算子
reduceBykey 根据相同key进行分组聚合
groupBykey 根据相同key进行分组聚合
reduce
combinebykey
fold
foldByKey
groupByKey和Reducebykey的区别
1.groupByKey
(hello,1) (hello,3)
(hello,2) (mimi,2)
(hello,3) (bing,2)
hello,compactBuffer(1,2,3,3)
mimi,compactBuffer(2)
bing,compactBuffer(2)
2.reduceByKey
(hello,1) (hello,3)
(hello,2) (mimi,2)
(hello,3) (bing,2)
(hello,6) (hello,3)
(mimi,2)
(bing,2)
hello,compactBuffer(9)
mimi,compactBuffer(2)
bing,compactBuffer(2)
reduceByKey先内部进行聚合,再全局聚合,这样会在全局聚合时减少网络IO 所以能用reduceByKey的尽量使用reduceByKey
工作中尽量避免使用哪些算子
尽量减少使用容易发生Shuffle类的算子,
比如:ReduceByKey,join,distinct,Repartion算子,
尽量使用map类的非shuffle算子,减少性能开销
简述RDD的概念
RDD(Resilient Distributed Dataset) 叫做弹性分布式数据集,
是spark最基本的数据抽象,不可变,可分区,里面的元素可并行计算的集合
RDD是一个抽象的集合,里面包含描述信息,分布式数据集,
不可变(一旦创建里面的数据不可以改变),
可分区(每个分区对应一个block块,分区数量对应block块的数量)
里面的元素可以并行计算的集合(可以同时对多个节点上的RDD进行操作)
RDD的5大属性
1.分片(处理数据量大时要对数据进行切分,分片里面没有数据)最小2个分区
2.真正执行的时候计算函数获取对应每个分区上的数据进行计算
3.RDD具有依赖关系(可以做一些转换操作)
4.分区器
1.Hash分区(根据Key的hash值进行分区)
2.根据范围进行分区
5.最优位置,决定取哪一个RDD进行计算(一般取比较近的节点上的数据)
两种创建RDD的方式
1.通过现有数据集创建(对现有rdd集合做一些转换操作)
2.通过数据集进行创建(sc.parallelize)
3.数据展示到控制台
1.a.collect
Spark和hive的对比
1.Spark基于内存运行,效率高,运行快
2.hive调优相对于spark较为简单
算子
1.map算子(对RDD每一个元素进行遍历)
val a = sc.parallelize(List("tom","a","han","haha"))
val b = a.map(_.length)
val c = a.zip(b) //拉链操作“tom” ,3
c.collect
2.filter算子 (对数据进行过滤)
val a = sc.parallelize(1 to 10)
val b = a.filter((x:Int)=>x>50)
b.collect
3.flatMap算子
val a = sc.parallelize(1 to 10,4)//4代表分片数
val b =a.flatMap(1 to _)//每个元素都变成集合
b.collect
4.MapPartitions
一个task仅仅会执行一次function,将数据分区后就会减少function的执行次数,效率较高
缺点:会发生内存溢出
5.sortBy算子(排序)