
spark
spark原理与使用
永不落后于人
永远相信美好的事情即将发生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spark的shuffle过程
Spark的shuffle分为老版本的HashShuffle(现在已经弃用)和新版本的SortShuffle。Shuffle过程发生在宽依赖切分Stage的过程中,前一个Stage称作ShuffleMap Stage,后一个Stage称作Result Stage。HashShuffle原理未经优化的HashShuffle1.Map Task将数据写入buffer缓冲区,待缓冲区达到阈值时开始溢写文件,文件数量取决于(等于)Reduce Task的数量。Reduce Task的数量取决于(等于)上一个原创 2021-07-06 17:16:40 · 1146 阅读 · 1 评论 -
Spark任务提交流程
提交一个Spark应用程序,首先通过Client向ResourceManager请求启动一个Application,同时检查是否有足够的资源满足Application的需求,如果资源条件满足,则准备ApplicationMaster的启动上下文,交给ResourceManager,并循环监控Application状态。 &nbs.原创 2021-04-03 14:41:56 · 286 阅读 · 1 评论 -
Spark yarn模式运行机制
yarn-client模式 在YARN Client模式下,Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLauche原创 2021-04-03 13:26:58 · 276 阅读 · 0 评论 -
Spark中Driver和Executor的作用
Driver Spark的驱动器节点,负责运行Spark程序中的main方法,执行实际的代码。Driver在Spark作业时主要负责:将用户程序转化为作业(job)。负责Executor之间的任务(task)调度。监控Executor的执行状态。通过UI展示运行情况。Executor Executor是S原创 2021-04-03 13:13:15 · 5073 阅读 · 0 评论 -
Spark Streaming优雅的关闭如何使用
实现思路使用标记,当达到特定条件时,关闭连接。创建新线程,监控标记变化。代码 def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]") val ssc = new StreamingContext(conf,Seconds(3)) //接收数据原创 2021-03-31 14:47:59 · 327 阅读 · 0 评论 -
Spark SQL操作Spark Streaming
操作思路先获取每个批次DStream中的RDD将RDD转为DataFrame代码 def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]") val ssc = new StreamingContext(conf,Seconds(3)) //接收数据原创 2021-03-31 14:45:16 · 214 阅读 · 0 评论 -
Spark Streaming有状态转换之window的使用
有状态转换和无状态转换的区别Spark Streaming中,如果该操作可以同时对不同批次的数据进行处理,就是有状态转换。如果该操作只能对每个批次中的数据依次进行处理,不同批次之间的数据不进行运算,就是无状态转换。window的功能可以跨批次处理窗口内的数据。用于监控某个时间段内数据流量的变化。代码window使用需要指定窗口大小和步长。窗口大小和步长只能时采集周期的整数倍。 def main(args: Array[String]): Unit = { val con原创 2021-03-31 14:42:50 · 237 阅读 · 0 评论 -
Spark Streaming有状态转换之updateStateByKey的使用
有状态转换和无状态转换的区别Spark Streaming中,如果该操作可以同时对不同批次的数据进行处理,就是有状态转换。如果该操作只能对每个批次中的数据依次进行处理,不同批次之间的数据不进行运算,就是无状态转换。updateStateByKey的功能对相同的key继续聚合,updateStateByKey可以跨批次处理数据,可以聚合之前周期的所有数据。比如累加wordcount。代码状态信息保存在checkpoint目录中,需要指定checkpoint目录。聚合后需要更新状态信息。原创 2021-03-31 14:38:42 · 466 阅读 · 0 评论 -
Spark Streaming无状态转换操作之transform的使用
有状态转换和无状态转换的区别Spark Streaming中,如果该操作可以同时对不同批次的数据进行处理,就是有状态转换。如果该操作只能对每个批次中的数据依次进行处理,不同批次之间的数据不进行运算,就是无状态转换。transform功能可以对每个批次中的DStream封装的RDD进行操作,可以直接使用RDD的算子。代码 def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().set原创 2021-03-31 14:24:31 · 458 阅读 · 0 评论 -
SparkStreaming消费kafka中的数据(0.10版本kafka)
自动维护offsetkafka0.10版本,topic的offset会维护在kafka的一个系统主题中:也就是__consumer_offsets中。代码import org.apache.kafka.clients.consumer.{ConsumerConfig, ConsumerRecord}import org.apache.kafka.common.serialization.StringDeserializerimport org.apache.spark.SparkConfim原创 2021-03-31 10:41:41 · 264 阅读 · 0 评论 -
Spark Streaming消费kafka的数据(0.8版本kafka)
导入依赖<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-8_2.11</artifactId> <version>2.1.1</version></dependency>Receiver连接方式在kafka-0.8的版本,offset维护在zookeeper原创 2021-03-30 15:47:22 · 425 阅读 · 0 评论 -
Spark连接kafka的两种方式对比
receiver方式receiver方式需要一个Executor用来采集数据,采集数据后发送到其他Executor来处理。存在的问题:生产和消费数据的速度不一致。如果采集数据的Executor速度大于计算数据的Executor的速度,那么很容易造成计算数据的Executor所在节点内存溢出。direct方式由计算数据的Executor主动消费数据,速度可以自己控制。...原创 2021-03-30 13:05:29 · 233 阅读 · 0 评论 -
Spark Streaming自定义数据源
需求 定义数据源,实现监控某个端口号,获取该端口号内容。代码实现继承Receiver,实现onStart()和onStop()方法。object SparkStreaming02_CustomerReceiver { def main(args: Array[String]): Unit = { //创建配置对象 val conf: SparkConf = new SparkConf原创 2021-03-30 12:19:35 · 485 阅读 · 0 评论 -
Spark Streaming版WordCount实现
导入依赖<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.1.1</version></dependency>代码实现 def main(args: Array[String]): Unit = { //配置文件对象原创 2021-03-30 11:32:01 · 611 阅读 · 0 评论 -
Spark SQL案例练习
需求:区域热门商品Top3需求说明这里的热门商品是从点击量的维度来看的。计算各个区域前三大热门商品,并备注上每个商品在主要城市中的分布比例,超过两个城市用其他显示(如下图)。数据准备数据下载链接:https://pan.baidu.com/s/1TuSGlD53Vc8rnH2UhC8TCg提取码:tvmi建表CREATE TABLE `user_visit_action`( `date` string, `user_id` bigint, `session_id` str原创 2021-03-29 16:15:24 · 557 阅读 · 0 评论 -
IDEA中Spark SQL操作Hive
1.添加依赖<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2.11</artifactId> <version>2.1.1</version></dependency><dependency> <groupId>org.apache.hive</gr原创 2021-03-28 22:26:34 · 416 阅读 · 0 评论 -
Spark SQL向MySQL读写数据
读数据方式一val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]")val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()spark.read .option("driver", "com.mysql.jdbc.Driver") .optio原创 2021-03-28 22:20:20 · 276 阅读 · 0 评论 -
Spark SQL加载数据和保存数据通用方式
加载数据spark.read.format("…")[.option("…")].load("…")format("…"):指定加载的数据类型,包括"csv"、“jdbc”、“json”、“orc”、“parquet"和"textFile”。load("…"):在"csv"、“jdbc”、“json”、“orc”、"parquet"和"textFile"格式下需要传入加载数据的路径。默认加载的是parquet类型的文件。option("…"):在"jdbc"格式下需要传入JDBC相应参数,url原创 2021-03-28 18:07:48 · 386 阅读 · 0 评论 -
Spark SQL自定义UDF|UDAF
自定义UDF(一进一出)需求:为查询出的每个name前加上Hidef main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]") val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()原创 2021-03-26 17:24:58 · 341 阅读 · 0 评论 -
SparkCore实战练习
1.数据准备 本项目的数据是采集电商网站的用户行为数据,主要包含用户的4种行为:搜索、点击、下单和支付。数据格式数据采用_分割字段。每一行表示用户的一个行为,所以每一行只能是四种行为中的一种。如果搜索关键字是null,表示这次不是搜索。如果点击的品类id和产品id是-1表示这次不是点击。下单行为来说一次可以下单多个产品,所以品类id和产品id都是多个,id之间使用逗号,分割。如果本次不是下单行为,原创 2021-03-25 13:43:37 · 910 阅读 · 1 评论 -
SparkCore面试题
1.编写WordCount(读取一个本地文件),并打包到集群运行,说明需要添加的主要参数。代码 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName) val sc = new SparkContext(conf) val resRDD: RDD[(String, Int)] = sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduce原创 2021-03-24 13:25:30 · 427 阅读 · 0 评论 -
Spark广播变量的作用和使用
广播变量的作用广播变量:分布式只读变量。如果Executor端需要访问Driver端的某个变量,spark会向Executor端每个task都发送一个此变量的副本。如果此变量很大,就会占用大量的Executor节点的内存。利用广播变量,spark只会给一个Executor节点发送一个变量。广播变量的使用需求 一个List和一个RDD实现类似join算子的效果。object Spark08_Broa原创 2021-03-23 18:01:59 · 4166 阅读 · 1 评论 -
Spark累加器的作用和使用
累加器作用累加器:分布式只写变量(Executor端的task不能互相访问累加器的值)。累加器对信息进行聚合。向Spark传递函数时,通常可以使用Driver端定义的变量,但是在Executor端使用此变量时,每个task中使用的都是此变量的副本。如果变量的值发生了变化,Driver端的变量值却不会改变。我们可以通过累加器实现分片处理,同时更新变量值。使用默认累加器需求 不经过shuffle,实现词原创 2021-03-23 17:54:57 · 3512 阅读 · 0 评论 -
Spark core使用JDBC连接MySQL
添加依赖<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version></dependency>读取MySQL数据 val conf: SparkConf = new SparkConf().setAppName(thi原创 2021-03-23 14:26:38 · 568 阅读 · 0 评论 -
cache和checkpoint的区别及使用
cache缓存的说明RDD通过调用cache方法将前面的计算结果缓存到内存或磁盘,默认缓存到JVM内存中。如果后面的计算还有需要此RDD的计算结果,可以直接从缓存中获取,而不用重新计算。cache缓存不会切断原有血缘关系,只会增加血缘关系。cache不会立即执行,当第一次遇到action算子时才会真正执行。cache缓存不管存储到内存还是存储到磁盘,都会随着程序执行结束而销毁。cache缓存的使用 val conf: SparkConf = new SparkConf().setAppNa原创 2021-03-23 13:15:22 · 835 阅读 · 0 评论 -
Spark的Stage任务划分
首先了解几个阶段Spark集群一个spark集群可以并发运行多个spark应用。Spark应用一个spark应用由一个driver(写逻辑代码)和多个executor线程组成。spark程序在driver端执行,发送指令到executor所在节点。当启动sparkContext的时候,一个driver就被启动了,同时多个executor也被启动。executor不能跨节点,但是一个节点可以有多个executor。RDD会跨越多个executor进行并行计算,一个executor可以处理RDD原创 2021-03-22 17:52:38 · 1305 阅读 · 0 评论 -
Spark宽窄依赖的划分规则
宽依赖父RDD一个分区中的数据,交给子RDD一个分区来处理。窄依赖父RDD一个分区中的数据,交给子RDD多个分区来处理。如何辨别宽依赖和窄依赖?一般来说,发生shuffle的操作都属于宽依赖。比如:sortBy()、reduceByKey()、groupByKey()、join()和调用rePartition()函数的任何操作。...原创 2021-03-22 15:06:51 · 370 阅读 · 2 评论 -
Spark RDD中的数据所属类型为什么要序列化?
Spark中,算子的执行都是在Executor端执行的,其他的操作都在Driver端完成(比如数据的加载),数据要从Driver端发送到Executor端,会发生跨线程或者跨节点的传输,所以要对数据所属类型做序列化操作。如何判断是否实现了序列化? 在作业提交之前,会有一段代码:val原创 2021-03-22 13:53:50 · 415 阅读 · 0 评论 -
Spark常用action行动算子
行动算子与转换算子的区别行动算子会提交job,触发作业的执行,转换算子是懒加载的,只有调用行动算子后才会真正执行。reduce函数签名说明reduce算子会将RDD中的数据做聚合操作,先聚合分区内元素,再聚合分区间元素。代码示例val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4))// reduce聚合val res: Int = rdd.reduce(_+_)collect函数签名说明collect算子可以将RDD中的元素原创 2021-03-22 10:52:32 · 1388 阅读 · 0 评论 -
Spark RDD求TopN案例
需求求每个省份广告点击次数top3数据数据说明:时间戳,省份,城市,用户,广告。1516609143867 6 7 64 161516609143869 9 4 75 181516609143869 1 7 87 121516609143869 2 8 92 91516609143869 6 7 84 241516609143869 1 8 95 51516609143869 8 1 90 291516609143869 3 3 36 161516609143869 3 3 54原创 2021-03-22 08:58:13 · 617 阅读 · 0 评论 -
combineByKey的使用
说明对RDD中的数据进行初始化后进行分区内和分区间的合并。函数签名createCombiner:对数据进行初始化,并将数据作为参数,可以对数据进行转换操作,分区内每种key调用一次。mergeValue:分区内合并,将key相同的元素V合并到刚刚经过转换的C上。mergeCombiners:分区间合并,将key相同的两个C合为一个C。执行过程代码示例 val conf: SparkConf = new SparkConf().setAppName(this.getClass.ge原创 2021-03-21 19:45:35 · 739 阅读 · 1 评论 -
foldByKey的使用
说明分区内和分区间计算规则相同的aggregateByKey。函数签名zeroValue:初始值,依次与分区内的数据做迭代。func:(V,V) => V:分区内和分区间的计算逻辑。代码示例 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf) val rdd:原创 2021-03-21 18:40:51 · 521 阅读 · 0 评论 -
aggregateByKey的使用
说明可以指定分区内和分区间不同逻辑的聚合操作。函数签名zeroValue:初始值,用于和RDD分区内的数据依次迭代。seqOp:(U,V) => U:分区内的计算规则,初始值根据此规则依次与分区内的数据进行迭代。combOp:(U,U) => U:分区间的计算规则,用于合并分区内的数据。代码示例 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("loc原创 2021-03-21 18:35:42 · 343 阅读 · 0 评论 -
spark按照key分区:partitionBy
说明RDD中的元素按照key指定的分区规则进行分区。RDD中的元素必须是键值对类型。如果原有的partitionRDD和现有的partitionRDD一致的话就不进行分区,否则会发生shuffle。函数签名代码示例(默认分区器) val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf)原创 2021-03-21 18:24:21 · 2460 阅读 · 0 评论 -
重新分区算子coalesce和repartition
coalesce说明包括shuffle和不发生shuffle两种方式。主要用于缩减分区,大数据集过滤后,提高小数据集的执行效率。函数签名代码示例 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf) val rdd: RDD[Int] = sc.makeRDD(1 to 1原创 2021-03-21 18:15:24 · 609 阅读 · 0 评论 -
去重算子:distinct
说明将RDD中的元素去重,并返回到新的RDD中。新RDD分区数量默认和旧的RDD一致。此过程会发生shuffle。函数签名代码实现 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf) /*val rdd: RDD[Int] = sc.makeRDD(List(1, 3, 5,原创 2021-03-21 18:04:04 · 416 阅读 · 0 评论 -
随机抽样算子:sample和takeSample
sample算子说明sample算子可以从大量的数据集中抽样,但是不能控制抽样的数目。函数签名代码示例 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf) val rdd: RDD[Int] = sc.makeRDD(1 to 10) //有放回抽样 //val原创 2021-03-21 17:56:49 · 925 阅读 · 0 评论 -
将分区内的元素转为数组:glom算子
说明glom算子将RDD分区中的元素转换为数组,并返回到新的RDD中。分区内的元素和元素的类型并不发生改变。函数签名代码实现 val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]") val sc = new SparkContext(conf) val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5,原创 2021-03-21 10:29:32 · 152 阅读 · 0 评论 -
Spark扁平化flatMap算子的使用
说明与map算子类似,将RDD中的元素按照指定函数,映射为新的元素并返回到新的RDD中。不同的是flatMap的函数返回的是集合,将集合中的元素依次取出放入新的RDD中。分区中的数据不会发生变化。函数签名代码实现val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")val sc = new SparkContext(conf)val rdd: RDD[Lis原创 2021-03-21 10:15:17 · 1081 阅读 · 0 评论 -
Spark map、mapPartitions、mapPartitionsWithIndex算子的区别和使用
map将RDD中的元素按照指定的函数规则一 一映射,形成新的RDD。函数签名代码示例val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")val sc = new SparkContext(conf)val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5),2)val newRDD: RDD[Int] = rdd.原创 2021-03-21 09:53:24 · 308 阅读 · 0 评论