Spark基础

本文介绍了Apache Spark的核心组件,包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX及集群管理等,并深入探讨了RDD(弹性分布式数据集)的概念、特性及其在Spark中的应用。
Spark 的组件
Spark Core
包括Spark的基本功能,包含任务调度,内存管理,容错机制。
内部定义了RDDs(弹性分布式数据集)。
提供了很多APIs来创建和操作这些RDDs。
为其它场景提供了底层的服务


Spark SQL:
是Spark处理结构化数据的库,就像Hive SQL,Mysql一样。
应用场景,企业中用来做报表统计


Spark Streaming:
是实时数据流处理组件,类似Storm
Spark Streaming提供了API来操作实时流数据
应用场景,企业中用来从Kafka接收数据做实时统计


MLlib:
一个包含通用机器学习功能的包,Machine learning lib。
包含分类,聚类,回归等,还包括模型评估,和数据导入
MLlib提供的上面这些方法,都支持集群上的横向拓展。
应用场景:机器学习


GraphX
是处理图的库(例如社交网络图),并进行图的并行计算。
像Spark Streaming,Spark SQL一样,它也继承了RDD API。
它提供了各种图的操作,和常用的图算法,例如PangeRank算法。


Cluster Managers:
就是集群管理,Spark自带一个集群管理是单独调度器。
常见集群管理包括Hadoop YARN,Apache Mesos


紧密继承的优点:
Spark底层优化了,给予Spark底层的组件,也得到了相应的优化。
紧密继承,节省了各个组件组合使用时的部署,测试等时间。
向Spark增加新的组件时,其它组件,可立刻享用新组件的功能。


RDDs介绍

RDDs:Resilient distributed datasets(弹性分布式数据集,简写RDDs)
这些RDDs,并行的分布在整个集群中。
RDDs是Spark分发数据和计算的基础抽象类


scala>val lines = sc.textFile("/home/maixia/soft/helloSpark.txt")


scala>lines.count()//能够统计出helloSpark.txt的行数
res0:Long = 3




一个RDD代表着一个不可改变的分布式集合对象
Spark中,所有的计算都是通过RDDs的创建,转换,操作完成的。
一个RDD内部由许多partitions(分片)组成


分片:每个分片包括一部分数据,partitions可在集群不同节点上计算
分片是Spark并行处理的单元,Spark顺序地,并行地处理分片


RDDs的创建方法:
(1)把一个存在的集合传给SparkContext的parallelize()方法,测试用
val rdd = sc.parallelize(Array(1,2,2,4),4)
第1个参数:待并行化处理的集合,第2个参数:分区个数
scala>val rdd = sc.parallelize(Array(1,2,2,4),4)


scala>rdd.count()
res0:Long = 4


scala>rdd.foreach(print)
1224
scala>rdd.foreach(println)
2
1
2
4
scala>rdd.foreach(println)
1
2
2
4


(2)加载外部数据集
val rddText = sc.textFile("helloSpark.txt")

spark程序示例(wordCount)
object WordCount{
    def main(args:Array[String]){
        val conf = new SparkConf().setAppName("wordCount")
        val sc = new SparkContext(conf)
        val input = sc.textFile("/home/maixia/soft/helloSpark.txt")
        val lines = input.flatMap(line=>line.split(" "))
        val count = lines.map(word=>(word,1)).reduceByKey{case (x,y)=>x+y}
        val output = count.saveAsTextFile("/home/maixia/soft/helloSparkRes")
    }
}

rdd可支持distinct、union(并集)、intersection(交集)、subtract(差集)等操作


rdd.distinct()
rdd1.union(rdd2)
rdd1.intersection(rdd2)
rdd1.subtract(rdd2)  //rdd1有而rdd2没有的。


rdd几个常用的Action
图截自慕课网:https://www.imooc.com/video/14399


RDDs的特性
1、RDDs的血统关系
图截自慕课网:https://www.imooc.com/video/14399


2、延迟计算
Spark对RDDs的计算是,他们第一次使用action操作的时候,这种方式在处理大数据的时候特别有用,可以减少数据的传输
Spark内部记录metadata表名transformations操作已经被响应了
加载数据也是延迟计算,数据只有在必要的时候才会被加载进去


3、RDD.persist():
持久化。默认每次在RDDs上面进行action操作时,Spark都重新计算RDDs,如果想重复利用一个RDD,可以使用RDD.persist()
unpersist()方法从缓存中移除
例子-persist()
图截自慕课网:https://www.imooc.com/video/14399



KeyValue对RDD的Transformations(example:{(1,2),(3,4),(3,6)})


 

KeyValue对RDDs

combineByKey():
(createCombiner(),mergeValue(),mergeCombiners,partitioner)
最常用的基于key的聚合函数,返回的类型可以与输入类型不一样
许多基于key的聚合函数都用到了它,像groupByKey()


常见的RDD API 

http://blog.youkuaiyun.com/jewes/article/details/39896301

遍历partition中的元素,元素的key,要么之前见过的,要么不是。
如果是新元素,使用我们提供的createCombiner()函数
如果是这个partition中已存在的key,就会使用mergeValue()函数
合计每个partition的结果的时候,使用mergeCombiners()函数 
combineByKey():
例子,求平均值
scala>scores.foreach(println)
(jake,80.0)
(jake,90.0)
(jake,85.0)
(mike,85.0)
(mike,92.0)
(mike,90.0)


scala>val score2 = scores.combineByKey(
        score=>(1,score),
        (c1:(Int,Double),newScore)=>(c1._1+1,c1._2+newScore),
        (c1:(Int,Double),c2:(Int,Double))=>(c1._1+c2._1),c1._2 + c2._2)
    )

scala>score2.foreach(println)
(jake,(3,255.0))
(mike,(3,267.0))

scala>val average = scores2.map{case(name,(num,score))=>(name,score/num)}

scala>average.foreach(println)
(mike,89.0)
(jake,85.0)



### Spark基础性能测试的方法与工具 #### 测试方法概述 Spark性能测试通常涉及多个方面,包括但不限于任务执行时间、资源利用率(CPU、内存)、数据读写速度等。为了全面评估Spark应用的表现,可以采用以下几种常见的测试方法: 1. **基准测试** 使用标准化的数据集和查询集合来衡量系统的性能。这种方法可以帮助识别不同配置下Spark的行为差异[^1]。 2. **压力测试** 在高并发环境下运行大量作业,观察系统瓶颈并调整参数以优化性能[^4]。 3. **微基准测试** 针对特定操作(如shuffle、join)单独进行测量,从而深入了解这些组件的工作效率[^2]。 #### 推荐使用的工具及其功能介绍 - **Spark SQL Perf** 这是一个由Databricks开发的开源项目,专注于SQL层面的性能评测。它包含了多种预设好的查询模板,适用于不同的业务场景需求分析。例如,在电商领域中常用的订单统计类问题都可以找到对应的实现方案[^1]。 - **TPC-DS Query Benchmark** TPC-DS是一套行业标准用于评价大数据平台事务处理能力的标准之一。对于希望按照国际通用指标来进行对比的企业来说非常有用。需要注意的是,默认情况下该模块是以单机模式启动的,因此实际部署前需参照文档完成必要的改造工作[^2]。 ```python from pyspark.sql import SparkSession def create_spark_session(): """ 创建自定义配置项后的Spark会话实例 Returns: _type_: 返回初始化完毕的对象实体 """ builder = ( SparkSession.builder.appName("Customized Test Env") .config("spark.executor.cores", "4") .config("spark.executor.memory", "8g") .config("spark.dynamicAllocation.enabled", "true") ) return builder.getOrCreate() ``` - **spark-bench** 它提供了完整的端到端解决方案,涵盖了HDFS I/O吞吐量检测至复杂机器学习模型训练等多个维度的内容覆盖范围广度大。此外还附带详细的指导手册便于初学者快速入门[^3]。 #### 最佳实践建议 当开展任何形式的性能实验之前,请务必做好充分准备: - 明确目标:清楚知道希望通过此次试验获得哪些方面的改进方向; - 数据选取合理化:确保所选样本具有代表性且规模适中以便于后续解读结果; - 参数调节循序渐进:每次只改变单一变量以免造成混淆难以判断因果关系; - 记录详尽日志信息:方便后期追溯整个过程中的每一个细节变化情况;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值