Spark-Persist

import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by MC on 2018/6/11.
  * 本文介绍将程序加载到内存
  *
  */
object PersisTest {
  def WordCount(sc : SparkContext): String ={
    val start = System.currentTimeMillis()
    val file = sc.textFile("D://B/c.txt")
//    val rdd1 = file.flatMap(_.split(" ")).map((_,1)).reduceByKey(_ + _).sortByKey().persist().collect()
    val flatMap = file.flatMap(_.split("\\s"))
    val map = flatMap.map((_,1))
  //.persist是将程序久化的内存
    val rsp = map.reduceByKey(_ + _).sortByKey().persist()
    val key = rsp.foreach(println(_))
    val end = System.currentTimeMillis()
    println("--------------"+(end-start)+"--------------")
    key.toString()
    val end1 = System.currentTimeMillis()
    println("--------------"+(end1-end)+"--------------")
    key.toString()
    val end2 = System.currentTimeMillis()
    println("--------------"+(end2-end1)+"--------------")
    key.toString()
  }
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("GroupTopN")
    val sc = new SparkContext(conf)
    var result: String = ""
      result=WordCount(sc)
    println(result)
    sc.stop
  }
}
    //运行结果
//第一次运行计算
//    --------------464--------------
//运行计算并加载到内存
//    --------------757--------------
//直接读取内存
//      --------------15--------------
//运行结果
(Job,1)
(My,3)
(Second,,1)
(So,1)
(Thank,1)
(Third,1)
(a,4)
(an,1)
(and,5)
(architect,1)
(be,2)
(become,1)
(believe,1)
(big,1)
(can,4)
(crazy.,1)
(data,1)
(data,,1)
(dream,1)
(excellent,1)
(family,,1)
(find,1)
(first,1)
(for,1)
(from,1)
(future.,1)
(great,1)


Spark SQL 的性能调优是大数据处理中非常关键的环节,尤其在面对大规模数据集时。以下是一些常见的 Spark SQL 性能调优方法和最佳实践: ### 3.1 数据分区与分布 合理的数据分区策略可以显著提升查询性能。建议将数据按照业务逻辑进行分区,并使用 `partitionBy` 对数据进行重新组织。此外,避免过多的小文件或过大的分区,保持每个分区的大小在合理的范围内(通常建议在 128MB 到 256MB 之间)[^2]。 ### 3.2 使用缓存机制 对于频繁访问的数据表或中间结果,可以使用 `cache()` 或 `persist()` 方法将其缓存到内存中,从而减少磁盘 I/O 操作。根据数据的重要性及使用频率选择不同的存储级别(如 `MEMORY_ONLY`, `MEMORY_AND_DISK` 等)[^2]。 ### 3.3 优化 Join 操作 Join 是最常见的操作之一,但也容易成为性能瓶颈。可以通过以下方式优化: - **选择合适的 Join 类型**:例如 Broadcast Join、Shuffle Hash Join 和 Sort Merge Join,每种类型适用于不同场景。 - **使用 Hint 指定 Join 策略**:通过 SQL 提示(Hint)强制指定特定的 Join 策略,例如 `/*+ BROADCAST(table) */` 来触发 Broadcast Join [^1]。 - **调整 Shuffle 分区数**:通过参数 `spark.sql.shuffle.partitions` 控制 Shuffle 分区数量,以平衡任务并行度和资源消耗。 ### 3.4 合理配置资源 为 Spark 应用程序分配适当的计算资源至关重要。主要包括: - **Executor 数量与核心数**:增加 Executor 数量可以提高并行处理能力,但也要考虑集群的整体负载情况。 - **内存设置**:确保每个 Executor 获得足够的堆内存来处理数据,同时注意避免频繁的垃圾回收(GC)。如果发现 GC 频繁发生,则可能需要调整 JVM 参数或减少对 JVM 对象的依赖 [^4]。 ### 3.5 使用 Structured APIs 尽量采用 DataFrame/Dataset API 替代 RDD,因为它们提供了更高级别的抽象并且能够更好地利用 Catalyst Optimizer 进行查询优化。这些结构化接口还能有效降低内存压力 [^4]。 ### 3.6 监控与诊断 利用 Spark UI 中的 Stage 页面监控作业执行情况,识别慢任务或失败任务的原因。此外,还可以借助工具如 SparkOscope 实现跨栈监控,进一步挖掘潜在的优化点 [^3]。 ### 3.7 查询计划分析 通过 `explain()` 方法查看物理执行计划,了解实际运行时的操作顺序以及是否应用了有效的优化规则。这有助于发现不必要的 Shuffle 或者其他低效操作。 ### 3.8 文件格式选择 选择高效的文件格式也会影响整体性能。Parquet 和 ORC 等列式存储格式通常比 JSON 或 CSV 更适合大规模数据分析,因为它们支持投影下推(Projection Pushdown)和谓词下推(Predicate Pushdown),减少了读取的数据量 。 ### 3.9 动态分区裁剪(Dynamic Partition Pruning) 启用动态分区裁剪功能可以帮助过滤掉不必要的分区,特别是在大表连接小表的情况下效果明显。相关配置项包括 `spark.sql.optimizer.dynamicPartitionPruning.enabled` 和 `spark.sql.optimizer.dynamicPartitionPruning.useStats` [^1]。 ### 3.10 压缩与编码 适当开启压缩算法(如 Snappy, Gzip)可以在一定程度上减少磁盘空间占用并加快数据传输速度。另外,使用字典编码等技术也能提升某些类型的查询效率 。 以上就是关于 Spark SQL 性能调优的一些常用方法和最佳实践。实施这些策略时,请结合具体应用场景灵活运用,并持续跟踪其对系统性能的影响。 ```python # 示例代码 - 设置 Shuffle 分区数量 spark.conf.set("spark.sql.shuffle.partitions", "200") # 示例代码 - 缓存表 df.cache() # 示例代码 - 查看查询计划 df.explain() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值