Spark 性能调优——分布式计算

前言


分布式计算的精髓,在于如何把抽象的计算流图,转化为实实在在的分布式计算任务,然后以并行计算的方式交付执行。今天这一讲,我们就来聊一聊,Spark 是如何实现分布式计算的。分布式计算的实现,离不开两个关键要素,一个是进程模型,另一个是分布式的环境部署。接下来,我们先去探讨 Spark 的进程模型,然后再来介绍 Spark 都有哪些分布式部署方式。

触发计算流程图


函数


Scala 复制代码
##统计单词的次数

import org.apache.spark.rdd.RDD
 
// 这里的下划线"_"是占位符,代表数据文件的根目录,hdfs的目录地址
val rootPath: String = "/user/hadoop/wikiOfSpark.txt"
val file: String = s"${rootPath}"
 
// 读取文件内容
val lineRDD: RDD[String] = spark.sparkContext.textFile(file)
 
// 以行为单位做分词
val wordRDD: RDD[String] = lineRDD.flatMap(line => line.split(" "))
val cleanWordRDD: RDD[String] = wordRDD.filter(word => !word.equals(""))
 
// 把RDD元素转换为(Key,Value)的形式
val kvRDD: RDD[(String, Int)] = cleanWordRDD.map(word => (word, 1))
// 按照单词做分组计数
val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)
 
// 打印词频最高的5个词汇
wordCounts.map{case (k, v) => (v, k)}.sortByKey(false).take(5)


##########################
//统计相邻单词共现的次数


假设,我们再次改变 Word Count 的计算逻辑,由原来统计单词的计数,改为统计相邻单词共现的次数。

import org.apache.spark.rdd.RDD
 
// 这里的下划线"_"是占位符,代表数据文件的根目录,hdfs的目录地址
val rootPath: String = "/user/hadoop/wikiOfSpark.txt"
val file: String = s"${rootPath}"
 
// 读取文件内容
val lineRDD: RDD[String] = spark.sparkContext.textFile(file)

// 以行为单位提取相邻单词
val wordPairRDD: RDD[String] = lineRDD.flatMap( line => {
  // 将行转换为单词数组
  val words: Array[String] = line.split(" ")
  // 将单个单词数组,转换为相邻单词数组
  for (i <- 0 until words.length - 1) yield words(i) + "-" + words(i+1)
})

val cleanWordRDD: RDD[String] = wordPairRDD.filter(word => !word.equals(""))
 
// 把RDD元素转换为(Key,Value)的形式
val kvRDD: RDD[(String, Int)] = cleanWordRDD.map(word => (word, 1))
// 按照单词做分组计数
val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)
 
// 打印词频最高的5个词汇
wordCounts.map{case (k, v) => (v, k)}.sortByKey(false).take(5)



##对原来单词的计数,改为对单词的哈希值计数,在这种情况下。我们代码实现需要做哪些改动。

import org.apache.spark.rdd.RDD
import java.security.MessageDigest
 
// 这里的下划线"_"是占位符,代表数据文件的根目录,hdfs的目录地址
val rootPath: String = "/user/hadoop/wikiOfSpark.txt"
val file: String = s"${rootPath}"
 
// 读取文件内容
val lineRDD: RDD[String] = spark.sparkContext.textFile(file)
 
// 以行为单位做分词
val wordRDD: RDD[String] = lineRDD.flatMap(line => line.split(" "))
val cleanWordRDD: RDD[String] = wordRDD.filter(word => !word.equals(""))
// 把普通RDD转换为Paired RDD

 
val kvRDD: RDD[(String, Int)] = cleanWordRDD.map{ word =>
  // 获取MD5对象实例
  val md5 = MessageDigest.getInstance("MD5")
  // 使用MD5计算哈希值
  val hash = md5.digest(word.getBytes).mkString
  // 返回哈希值与数字1的Pair
  (hash, 1)
}
// 按照单词做分组计数
val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)
 
// 打印词频最高的5个词汇
wordCounts.map{case (k, v) => (v, k)}.sortByKey(false).take(5)
Scala 复制代码
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
// 创建表
case class SiteViews(site_id: String, date: String, page_view: Int)
val siteViews = Seq(
    SiteViews("a", "2021-05-20", 10),
    SiteViews("a", "2021-05-21", 11),
    SiteViews("a", "2021-05-22", 12),
    SiteViews("a", "2021-05-23", 12),
    SiteViews("a", "2021-05-24", 13),
    SiteViews("a", "2021-05-25", 14),
    SiteViews("a", "2021-05-26", 15),
    SiteViews("b", "2021-05-20", 21),
    SiteViews("b", "2021-05-21", 22),
    SiteViews("b", "2021-05-22", 22),
    SiteViews("b", "2021-05-23", 22),
    SiteViews("b", "2021-05-24", 23),
    SiteViews("b", "2021-05-25", 23),
    SiteViews("b", "2021-05-26", 25)
).toDF() 
// 
Window.partitionBy("column name"|column)
// orderBy的语法
Window.orderBy("column name"|column) 
相关推荐
数据库学啊35 分钟前
分布式数据库架构设计指南:TDengine如何支持10亿级数据点的水平扩展
数据库·分布式·时序数据库·数据库架构·tdengine
yumgpkpm2 小时前
CMP(类ClouderaCDP7.3(404次编译) )完全支持华为鲲鹏Aarch64(ARM)使用 AI 优化库存水平、配送路线的具体案例及说明
大数据·人工智能·hive·hadoop·机器学习·zookeeper·cloudera
~kiss~2 小时前
spark-SQL学习
sql·学习·spark
临风赏月3 小时前
Hudi、Iceberg、Delta Lake、Paimon四种数据湖的建表核心语法
大数据
mit6.8243 小时前
[VT-Refine] 强化学习工作流 | 分布式-近端策略优化(DPPO)
分布式·算法
Damon小智4 小时前
HarmonyOS 5 开发实践:分布式任务调度与设备协同架构
分布式·架构·harmonyos
极客数模5 小时前
【浅析赛题,一等奖水平】思路模型数据相关资料!2025 年“大湾区杯”粤港澳金融数学建模竞赛B 题 稳定币的综合评价与发展分析~
大数据·算法·数学建模·金融·数据挖掘·图论·1024程序员节
临风赏月5 小时前
Hudi、Iceberg、Delta Lake、Paimon 建表语法与场景示例
大数据
凯子坚持 c5 小时前
【星光不负 码向未来 | 万字解析:基于ArkUI声明式UI与分布式数据服务构建生产级跨设备音乐播放器】
分布式·ui
luoganttcc6 小时前
加快高水平科技自立自强,引领发展新质生产力 <十五五 规划节选>
大数据·人工智能·科技