SparkCore提供Spark最基础与最核心的功能
1:SparkContext:
通常而言,Driver Application的执行与输出都是通过SparkContext来完成的。在正式提交Application之前,首先需要初始化SparkContext。SparkContext隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、测量系统、文件服务、Web服务等内容,应用程序开发者只需要使用SparkContext提供的API完成功能开发。SparkContext内置的DAGScheduler负责创建Job,将DAG中的RDD划分到不同的Stage,提交Stage等功能。内置的TaskScheduler负责资源的申请,任务的提交及请求集群对任务的调度等工作。
2.存储体系:
Spark优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,这极大地减少了磁盘IO,提升了任务执行的效率,使得Spark适用于实时计算、流式计算等场景。此外,Spark还提供了以内存为中心的高容错的分布式文件系统Tachyon供用户进行选择。Tachyon能够为Spark提供可靠的内存级的文件共享服务。
3.计算引擎:
计算引擎由SparkContext中的DAGScheduler、RDD以及具体节点上的Executor负责执行的Map和Reduce任务组成。DAGScheduler和RDD虽然位于SparkContext内部,但是在任务正式提交与执行之前会将Job中的RDD组织成有向无环图(DAG),并对Stage进行划分,决定了任务执行阶段任务的数量、迭代计算、shuffle等过程。
4.部署模式:
由于单节点不足以提供足够的存储和计算能力,所以作为大数据处理的Spark在SparkContext的TaskScheduler组件中提供了对Standalone部署模式的实现和Yarn、Mesos等分布式资源管理系统的支持。通过使用Standalone、Yarn、Mesos等部署模式为Task分配计算资源,提高任务的并发执行效率。
group:根据key值相同进行分组操作
object Tao {
def main(args: Array[String]): Unit = {
val spark = new SparkContext(new SparkConf()
.setAppName("word")
.setMaster("local")
)
val data1 = spark.textFile("data/taobao_persona.csv")
val data2 = spark.textFile("data/address.csv")
f1(data1)
}
//group():分组 key相同将val放在一起
//groupByKey()
//淘宝商品购买量占有查看量的百分比 转化率
/*
首先需要得到商品的操作数 10个人操作还是几个人操作
然后算出浏览人数和购买的人数 然后相除
* */
def f1(data:RDD[String])={
val dataRDD = data
.map(x => {
val ts = x.split(",")
(ts(0),ts(1),ts(2))
})
//同样商品id全取出来
.groupBy(
(x) => x._2
//(商品ID,CompactBuffer((用户ID,商品ID,操作编号)))
).mapValues(
x => {
val a = x.count(//本质上还是普通的scala代码
//计算商品浏览次数
active => {
active._3 == "1"
}
)
val b = x.count(
active => {
active._3 == "4"
}
)
(b.toDouble / a.toDouble)
}
).sortBy(_._2,false)
dataRDD.foreach(println(_)) //所有操作key相同都会转换成迭代器的类型存入值
//数据计算结果保存 可以保存到本地 或者Mysql或Hive 或者文档中
dataRDD.saveAsTextFile("data/out/tao")//保存到data目录下out/tao 分区存放
}
}