内部:
groupByKey/reduceByKey
-a.groupByKey
combineByKeyWith
底层都是调用到类似
def combineByKeyWithClassTag[C](
//聚合的临时变量,将聚合的数据存放到哪里或者转换成什么格式
//针对每个分区进行,次分区中key第一次出现
createCombiner: V => C,
mergeValue: (C, V) => C,
mergeCombiners: (C, C) => C,
partitioner: Partitioner,
mapSideCombine: Boolean = true,
serializer: Serializer = null)(implicit ct: ClassTag[C]): RDD[(K, C)] = self.withScope {}
aggregateByKey
combineByKey(
createCombiner是 从分区开始对数据进行操作
mergeValue 是 1操作之后 如何进行合并 一般需要添加一些针对数据的操作
mergeCombiners 是在最后聚合时的合并方式
)
对于Top key 问题而言这个就是具体实现 在分区的时候就进行了排序 take操作
例子:
part-01
aa 78
bb 98
aa 80
cc 98
aa 69
cc 87
bb 97
aa: Int -> ListBuffer(78, 80, 69)
bb: Int -> ListBuffer(98, 97)
bb: Int -> ListBuffer(98, 87)
part-02
cc 86
aa 97
bb 78
bb 34
cc 85
bb 92
cc 72
bb 32
bb 23
aa: Int -> ListBuffer(97 )
bb: Int -> ListBuffer(78, 34, 92)
bb: Int -> ListBuffer(86, 85, 72)
装逼必备。。。。。。需要整理!
Spark优化
1.开发的优化 combineByKey
选择合适的RDD API
比如:
-a combineByKey /aggregateByKey
就不是使用groupByKey/reduceByKey
-b foreachPartition 不要使用foreach
结果RDD保存到JDBC/Redis/Hbase中
-c map/ mapPartition
-d 缓存/持久化
某个RDD被使用多次
某个RDD来之不易
2.资源优化
bin/spark-submit
-a Driver
Memory/CPU CORE
-b Excutors
Number/pre-Memory/pre-CPU CORE
-c Shuffle Excutors的内存划分
3.其他
性能提升
内存分配使用
Spark默认使用的是Java的序列化
企业中需要使用另外的方式:
比如 序列化:
conf1
.set(
"spark.serializer"
,
"org.apache.spark.serializer.KryoSerializer"
)
conf1
.registerKryoClasses(
Array
(
classOf
[ImmutableBytesWritable],
classOf
[Result]))
需要设置需要系列化的类, Kryo的性能要使用
分区到Driver 就需要序列化操作,shuffle也会产生序列化
所以需要注册到 registerKryoClasses中
因为每次都要使用 所以可以在default文件中直接启用此序列化
================================================================================
SparkSQL
Hive 但是比hive强大
a SQLContext:sqlContext
万事万物皆可读
例如: hive-table textFile json jdbc
parquet/orc tsv/csv (xml MongoDB/redis/hbase) 有人写好了api
https://github.com 上搜spark hbase
b DataFrame/Dataset
将数据写为了这种形式,借鉴了python和R
c
sqlContext.read
.textFile()
.jdbc()
.json()
.parquet()
.orc()
//读来之后就是一个dataframe
//可以使用SQL
sqlContext.sql(".........")
//使用链式
//写数据
dataframe.
SparkCore
Mapreduce
-a SparkContext:sc
sc.textFile("")
SparkSQL 天然支持读取Hive表中的数据
-a 将hive-site.xml文件放入${SPARK_HOME}/conf下
cp ... ....
或者 创建软连接
ln -s path/hive-site.xml sparkhome/conf/
-b 连接数据库
需要驱动包
mysql驱动包需要放入spark application classpath
1.方式一
--jars
说明:
有时候不生效
2. 方式二
设置SPARK_CLASSPATH
在 spark-env.sh中
设置
SPARK CLASS PATH 备注中有
针对hive表中的emp表数据进行分析
-1 SQL
sqlContext.sql("").show
-2 API DSL
阿里天池