Spark
文章平均质量分 68
墨玉浮白
这个作者很懒,什么都没留下…
展开
-
Spark自定义累加器
如果需求不仅仅是简单的对i累加,而是操作对象,那就得自定义累加器。首先定义好样例类case class PersonInfo(var personNum: Int, var ageSum: Int)自定义的累加器,需要继承AccumulatorV2,泛型分别表示进来的和出去的类。需要重写6个方法:isZero:每个partition内的累加器是否有初始值copy:复制累加器,Driver端到各个partitionreset:每个partition内,对象的初始值add:每个partition原创 2021-04-27 10:41:34 · 718 阅读 · 0 评论 -
Worker启动Executor源码
给Executor划分好资源后,Worker就要按此来启动Executor了。资源划分完毕后,会返回每个Executor实得多少core的数组,然后就是循环可用的Worker节点,给Executor划分资源。val assignedCores = scheduleExecutorsOnWorkers(app, usableWorkers, spreadOutApps)// Now that we've decided how many cores to allocate on each worker,原创 2021-04-26 12:36:56 · 123 阅读 · 0 评论 -
Spark Application资源调度源码
master的receive方法接收到RegisterApplication类型的消息,就要给application划分资源了。 //Driver 端提交过来的要注册Application case RegisterApplication(description, driver) => // TODO Prevent repeated registrations from some driver //如果Master状态是standby 忽略不提交任务原创 2021-04-25 15:18:33 · 86 阅读 · 0 评论 -
Spark任务提交源码
SparkSubmit的main方法执行,首先要设置一些参数://设置参数val appArgs = new SparkSubmitArguments(args)接着会进行模式匹配,匹配到submit,调用submit方法,做了两件事: //以下方法prepareSubmitEnvironment 返回四元组,重点注意childMainClass类 这里以standalone-cluster为例 // childMainClass:未来启动Driver的main class是谁原创 2021-04-25 04:08:24 · 170 阅读 · 0 评论 -
Spark Worker启动源码
worker的启动流程和master的启动流程相同,区别就是在worker启动完成后,要向Master注册、汇报资源。在Worker的onStart()方法中会调用registerWithMaster()方法来向Master注册: private def registerWithMaster() { // onDisconnected may be triggered multiple times, so don't attempt registration // if there ar原创 2021-04-24 11:40:08 · 115 阅读 · 0 评论 -
Spark Master启动源码分析
文章目录一、RPC通信环境二、注册EndPoint底层使用netty通信,先准备出RpcEnv环境来做通信架构,创建:收消息结构、处理消息结构。RpcEnv会处于一直启动的状态,不死不灭。Master启动的时候,会把通信地址(也叫通信邮箱,EndPoint)注册到RpcEnv中。别人想跟Master通信,只需要发送到RpcEnv中,Master的EndPoint刚刚才向RpcEnv注册,于是RpcEnv接收到别人的通信请求,并立刻发送消息给Master。首先,RpcEnv要先创建自己的Rpc环境和En原创 2021-04-24 10:56:19 · 110 阅读 · 0 评论 -
Spark任务提交流程
文章目录1.Standalone-Client2.Standalone-cluster3.Yarn-Client模式4.Yarn-Cluster1.Standalone-Client[root@node4 bin]# ./spark-submit --master spark://node1:7077 --class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 1001.Cl原创 2021-04-21 09:09:14 · 2256 阅读 · 3 评论 -
用Spark实现简单的单词统计
用Scala实现RDD(可以简单理解为是一个list集合,里面放的就是读到的一行一行的数据)是spark中非常核心的内容,只有通过SparkContext才能创建出来RDD。package com.husky.sparkimport org.apache.spark.rdd.RDDimport org.apache.spark.{SparkConf, SparkContext}object SparkWordCount { def main(args: Array[String]): Un原创 2021-04-18 20:48:25 · 1719 阅读 · 0 评论 -
Spark Shuffle两种Manager
文章目录前言hashShuffleManager1.普通机制缺陷2.合并机制-优化sortShuffleManager1.普通机制2.byPass机制总结:前言reduceByKey会将上一个RDD中的每一个key对应的所有value聚合成一个value,然后生成一个新的RDD,元素类型是<key,value>对的形式,这样每一个key对应一个聚合起来的value。聚合之前,每一个...原创 2019-07-28 09:49:58 · 397 阅读 · 0 评论 -
SparkStreaming读取Socket数据
SparkStreaming是7*24h不间断运行,底层操作的是DStream。读取Socket数据过程1.SparkStreaming启动后,首先启动一个job,这个job有一个task一直接收数据。2.task每隔一段时间(batchInterval)就把接收来的数据封装到batch中。生成的每个batch又被封装到一个RDD中,这个RDD又被封装到DStream中。SparkStrea...原创 2019-07-31 08:42:54 · 1314 阅读 · 1 评论 -
SparkStreaming和Storm的区别
SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展、高吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka(Kafka和SparkStreaming是黄金组合), Flume, Twitter, ZeroMQ或者TCP sockets,并且可以使用高级功能的复杂算子来处理流数据。例如:map,reduce,join,window 。最终,处理后的数据可以存...原创 2019-07-31 08:16:10 · 801 阅读 · 0 评论 -
Spark 开窗函数
row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,HiveContext默认情况下在本地无法创建。在MySql8之后也增加了开窗函数。开窗函数格式:row_number() over (partitin by XXX order by XXX)...原创 2019-07-31 08:04:22 · 873 阅读 · 0 评论 -
Spark UDAF用户自定义聚合函数
UDAF的特点就是:N:1,目的就是为了做聚合(group by)UserDefinedAggregateFunction是用户自定义聚合函数要继承的抽象类,传参---->initialize初始化、update(RDD分区内部的合并)、merge(分区之间总结果之间的合并)class MyUDAF extends UserDefinedAggregateFunction{ over...原创 2019-07-30 21:55:25 · 614 阅读 · 0 评论 -
数据算法——Spark二次排序
1.Scala实现:/** * 二次排序:超过2个(特征) * 对比MR天气案例,自定义一个key(包含读到的一行数字),对key进行内部比较。 */object SecondSort { def main(args: Array[String]): Unit = { val session = SparkSession.builder().appName("secon...原创 2019-07-23 20:28:43 · 193 阅读 · 0 评论 -
数据算法——Spark的TopN实现
1.scala实现:/** * TOPN:维持一个定长数组,先塞满,然后把剩下的逐个对应数组中的元素, * 有大的就把小的弹出去,大的加进来,并移动位置来重新排序 */object TopN { def main(args: Array[String]): Unit = { val session = SparkSession.builder().master("loc...原创 2019-07-23 20:31:50 · 1698 阅读 · 0 评论 -
Spark广播变量
把list定义为broadCastList变量,当Executor用到了这个变量,每个Executor的BlockManager会管理broadCastList。以后如果Executor端用到了这个变量,Driver端发送Task的时候就没必要携带这个变量了。task抵达Executor后,首先去blockManager中寻找有无广播变量,有就直接用了。极大的节省了内存。注:一定要注意广播变量...原创 2019-07-23 21:08:29 · 557 阅读 · 0 评论 -
Spark累加器
i+=1在Excutor端执行,var i = 0和println(i)在Driver端执行。collect算子虽然能够回收结果,但是并不代表它啥都能回收。所以打印出来的依旧是Driver端定义的i。错误代码://打印出来的总是0val session = SparkSession.builder().appName("broadcast").master("local").getOrCre...原创 2019-07-23 21:33:42 · 386 阅读 · 0 评论 -
Spark读取json格式文件
一、普通json格式val session = SparkSession.builder().appName("sql").master("local").getOrCreate()val df = session.read.format("json").load("./data/json")二、读取嵌套的json格式文件/** * 格式: * {"name":"zhangs...原创 2019-07-30 19:39:50 · 10618 阅读 · 0 评论 -
Spark读取普通RDD加载为DataFrame
一、反射将对象中的属性自动映射为Datafram的列,对象中属性的类型自动映射为Dataframe中schema分别对应id、name、age、score val spark = SparkSession.builder().master("local").appName("reflect").getOrCreate() import spark.implicits._ //...原创 2019-07-30 21:00:05 · 301 阅读 · 0 评论 -
Spark读取Parquet格式的数据为Dataframe
SaveMode指定文件保存时的模式:OverWrite 覆盖Append 追加ErrorIfExists 如果存在就报错Ignore 如果存在就忽略 val spark = SparkSession.builder().master("local").appName("schema").getOrCreate() val dataFrame = spark.read.jso...原创 2019-07-30 21:09:05 · 1159 阅读 · 0 评论 -
Spark读取MySQL中的数据为DataFrame
Spark读取JDBC中的数据(以MySQL为例)为DataFrame,有两种方式。//聚合的时候默认分区是200,可以在此设置val spark = SparkSession.builder().master("local").appName("schema") .config("spark.sql.shuffle.partitions",1).getOrCreate()方式...原创 2019-07-30 21:30:06 · 1410 阅读 · 0 评论 -
Spark读取Hive中的数据加载为DataFrame
读取Hive中的数据,必须开启enableHiveSupport。 val spark = SparkSession.builder() .appName("hive") .enableHiveSupport() .getOrCreate() //创建student_infos和student_scores表并从本地加载进来数据 spark.s...原创 2019-07-30 21:33:12 · 2178 阅读 · 0 评论 -
Spark UDF用户自定义函数
自定义一个函数实现查询字符串长度。首先创建测试的DataFrame: val spark = SparkSession.builder().master("local").appName("UDF").getOrCreate() val nameList: List[String] = List[String]("zhangsan", "lisi", "wangwu", "zhaoliu...原创 2019-07-30 21:45:28 · 583 阅读 · 0 评论 -
Spark-Scala算子
一、Transformations算子1.map-一对一特点就是一对一,进来一个,出去一个lines.map(one=>{ one+"#" }).foreach(println)2.flatMap-一对多进来一个,出去一堆。比如读取一行数据:hello world ,出去的就是hello和world两个单词。匿名函数定义了其中的逻辑:将读取到的数据按照空格切分...原创 2019-07-18 23:58:40 · 645 阅读 · 0 评论