- 博客(75)
- 资源 (1)
- 收藏
- 关注
原创 spark存储管理源码分析系列之BlockInfoManager
BlockId定义了块的唯一标识,BlockInfo是块信息的管理,本节将介绍块信息管理器BlockInfoManager,BlockInfoManager对Block的锁管理,采用了共享锁与排他锁,其中读锁是共享锁,写锁是排他锁。BlockInfoManager属性BlockInfoManager的成员属性有以下几个:infos:存储BlockId -> BlockInfo对应关系,包含了MemoryStore以及DiskStore管理的Block。writeLocksByTask:每.
2020-10-14 11:28:40
297
原创 spark存储管理源码分析系列之Block
Spark中的Cache, Shuffle-output, 以及Broadcast的实现都是基于BlockManager来实现,BlockManager提供了数据存储[内存/文件存储]接口。BlockManager是通过Block来组织和管理数据的,块的唯一标识是BlockId;BlockManager控制块数据的写入和读取,数据的表达方式是ManagerBuffer;另外BlockManager需要对Block元信息进行管理,元信息的维护是通过BlockInfo来进行的,本节我们就来看一下这三部分的实现.
2020-10-13 14:08:07
809
2
原创 [LeetCode]146. LRU Cache
LRU介绍LRU是Least Recently Used 近期最少使用算法。 内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。利用一个双向链表<c++ list>和一个HashMap<c++ unordered_map>来快速定位数据:set数据时候,需要先看是否已经有key对应元素,如果有,则需要更改value值,由于LRU,所以需要把这个元素放到链表的表头,可以先删
2020-09-30 16:57:08
93
原创 spark内存管理源码分析系列之执行内存管理器TaskMemoryManager
Spark中Task的执行内存是通过TaskMemoryManger统一管理的,不论是ShuffleMapTask还是ResultTask,Spark都会生成一个专用的TaskMemoryManger对象,然后通过TaskContext将TaskMemoryManger对象共享给该task attempt的所有memory consumers。 TaskMemoryManger自建了一套内存页管理机制,并统一对ON_HEAP和OFF_HEAP内存进行编址,分配和释放。概述TaskMemoryMang.
2020-09-29 11:38:58
820
原创 spark源码分析之Broadcast
Broadcast简介&使用在Spark程序中,经常会遇到算子函数中使用较大的外部变量的场景。由于在算子函数中使用到外部变量时,默认情况下,Spark会将该变量复制多个副本,通过网络传输到task中,此时每个task都有一个变量副本。如果变量本身比较大的话[比如100M,甚至1G],那么大量的变量副本在网络中传输的性能开销,以及在各个节点的Executor中占用过多内存导致的频繁GC,都会极大地影响性能。因此对于上述情况,如果使用的外部变量比较大,Spark提供的广播功能,对该变量进行广播,会提升
2020-09-27 14:04:14
1048
原创 leetcode总结之前缀和应用
560. Subarray Sum Equals K题目描述很简单,算出一共有几个和为 k 的子数组。最简单的想法,固定一个位置,找从这个位置往后的所有连续子数组的和,如果和为k则结果加1,最后返回结果,复杂度O(N^2),数据量大时候会TLE。class Solution {public: int subarraySum(vector<int>& nums, int k) { int result = 0; for (int i =
2020-09-25 11:29:23
248
原创 spark内存管理源码分析系列之详解UnifiedMemoryManager
上一讲我们介绍了MemoryManager以及具体的实现类StaticMemoryManager,知道了StaticMemoryManager的优势和缺点,本节我们继续介绍具体实现类UnifiedMemoryManager,它实现相对StaticMemoryManager内部实现会复杂点,不过用户使用会更省心些,它可以在存储内存和执行内存之间进行互相借用内存,让用户可以在不具备内存调参经验情况下也能很好的降低OOM的风险。UnifiedMemoryManagerUnifiedMemoryManage.
2020-09-24 16:24:43
596
原创 spark内存管理源码分析系列之MemoryManager
上一篇我们分析了执行内存池和存储内存池,它们是内存的抽象,负责记录内存的使用情况,不负责直接的内存管理。Spark 为存储内存和执行内存的管理提供了统一的接口MemoryManager,同一个 Executor 内的任务都调用这个接口的方法来申请或释放内存。Spark1.6前,采用的静态内存管理机制,存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可以应用程序启动前进行配置,在Spark 3.0中Spark移除了StaticMemoryManager,详见SPARK-2.
2020-09-22 13:49:32
628
原创 spark内存管理源码分析系列之详解内存池
内存池是Spark内存的抽象,它记录了总内存大小,已使用内存大小,剩余内存大小,提供给MemoryManager进行分配/回收内存。它包括两个实现类:ExecutionMemoryPool和StorageMemoryPool,分别对应execution memory和storage memory。当需要新的内存时,spark通过memoryPool来判断内存是否充足。需要注意的是memoryPool以及子类方法只是用来标记内存使用情况,而不实际分配/回收内存。
2020-09-21 00:02:07
517
原创 spark内存管理源码分析系列之内存管理概述
Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文介绍了Spark的内存框架以及介绍了Spark的哪些模块使用到了内存管理功能,Driver端内存管理比较简单,所以后续的分析都专注于Executor端的内存管理。
2020-09-20 17:49:59
316
原创 Hive执行计划分析之group by执行计划分析
基础数据我们使用电商网站用户行为数据进行测试,数据格式如下:-- 用户行为数据CREATE TABLE `tmp.log_user_behavior`( `user_id` string COMMENT '用户id', `item_id` string COMMENT '商品id', `category_id` string COMMENT '商品分类id', `behavior` string COMMENT '行为', `ts` date COMMENT '行为发生时间')P
2020-09-01 09:58:23
948
1
原创 mr实现join的功能--Reduce端Join
大数据处理中绕不开的是两个甚至多个表的Join操作,由于要进行Shuffle操作,所以比较耗费时间,本文介绍了传统的Reduce端Join方法,具体实现可以看我的github基础数据有两张表,分别是用户信息数据以及用户页面的日志数据,建表语句如下所示:-- 用户行为数据CREATE TABLE `tmp.log_user_behavior`( `user_id` string COMMENT '用户id', `item_id` string COMMENT '商品id', `cate.
2020-08-31 19:58:25
317
原创 mr实现join的功能--Map端Join
大数据处理中绕不开的是两个甚至多个表的Join操作,由于要进行Shuffle操作,所以比较耗费时间,本文介绍了针对大小表Join的优化方法Map-Join,利用Hadoop提供的DistributedCache来进行缓存小表文件,然后再Mapper中直接进行Join,从而避免了Shuffle操作,加速了Join,具体实现可以看我的github基础数据有两张表,分别是用户信息数据以及用户页面的日志数据,建表语句如下所示:-- 用户行为数据CREATE TABLE `tmp.log_user_beh.
2020-08-31 17:57:16
658
原创 一文讲懂Hive窗口函数
窗口函数是可以在本行内做运算,得到多行<前几行,后几行等>的结果。 通用的窗口函数可以用下面的语法来概括:Function() Over (Partition By Column1,Column2,Order By Column3 [Rows between .. and ..])Over关键字: 表示前面的函数是分析函数,不是普通的集合函数Partition By: 分组子句,表示分析函数的计算范围,进行分组Order By: 排序子句,表示分组后,组内的排序方式Rows /Ra
2020-07-08 18:52:14
380
原创 Spark Shuffle源码分析系列之Shuffle介绍&演进过程
Shuffle是什么在spark源码分析之stage生成中,我们讲到Spark在DAGSchduler阶段会将一个Job划分为多个Stage,在上游Stage做map工作,下游Stage做reduce工作,其本质上还是MapReduce计算框架。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce输入中,这期间涉及到序列化反序列化、跨节点网络IO以及磁盘读写IO等,所以说Shuffle是整个应用程序运行过程中非常昂贵的一个阶段,理解Spark Shuffle原理有助于优化
2020-05-13 09:46:02
777
原创 Hive实战-建表相关操作
内部表&外部表在Hive创建表的语法中有一个关键字是EXTERNAL,该关键字表示表的类型,在Hive中一共有两种类型的表:MANAGED_TABLE(内部表)和EXTERNAL_TABLE(外部表)。如果没有加EXTERNAL关键字,则创建表都是管理表,两种表有以下的区别:在导入数据到外部表,数据并没有移动到自己的数据仓库目录下(如果指定了location的话),也就是说外部表中的数据并不是由Hive自己来管理的,而内部表则不一样,是由数据仓库来管理的;在删除表的时候,Hive将会把属于表
2020-05-08 18:54:05
1527
原创 xgboost实战--python&spark训练预测
xgboost介绍xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案。在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sungrid Engine等各个平台上面运...
2020-04-27 10:49:36
3446
8
原创 Spark数据处理实战之聚合
spark dataset/dataframe经常会用到聚合函数进行指标的聚合计算,本文详细讲解了聚合函数,聚合算子,方便使用者清晰的认识如何进行聚合操作。聚合函数org.apache.spark.sql.functions._ 所有的聚合函数都可以通过两种方式调用,以Column为参数或者以columnName为参数,例如avg(Column e)和avg(String col...
2020-04-27 10:23:21
1347
原创 Spark数据处理实战之列空值&新增列处理
在spark dataset/dataframe操作过程中,我们经常会遇到对于一个列值的一些判断情况,是否为NULL,创建一个新列等,本文讲解了常用的增加列的方法,并且对于列空值判断,填充处理以及查询的api做了详细的描述和实例讲解,阅读完可以掌握列的处理相关方法。增加列Spark dataframe提供了withColumn函数来进行添加列或者替换列<指定的列名字跟之前的一样时候&...
2020-04-27 10:11:25
4786
原创 MAC单机hadoop环境搭建&Wordcount实现
单机Hadoop环境搭建下载hadoop源码,我这里下载的是2.10.0版本添加hadoop环境变量,打开~/.zshrc# hadoopexport HADOOP_HOME=/Users/lidongmeng/software/hadoop-2.10.0export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin添加完后就可以测试...
2020-04-13 18:58:36
635
原创 Hadoop源码分析之文件拆分
InputFormat介绍当我们编写MapReduce程序的时候,都会进行输入格式的设置,方便hadoop可以根据设置得文件格式正确的读取数据进行处理,一般设置代码如下:job.setInputFormatClass(KeyVakueTextInputFormat.class)通过上面的代码来保证输入的文件是按照我们想要的格式被读取,所有的输入格式都继承于InputFormat,这是一个抽...
2020-04-09 18:01:36
932
原创 flink实战--ProcessFunction
想象这样一种情景,我们想在算子或者函数中获取数据流中Watermark的时间戳,或者在时间上前后穿梭,我们该如何办?ProcessFunction系列函数给我们提供了这样子的能力,它们是Flink体系中最底层的API,提供了对数据流更细粒度的操作权限。Flink SQL是基于这些函数实现的,一些需要高度个性化的业务场景也需要使用这些函数。这个系列函数主要包括KeyedProcessFunctio...
2020-04-01 10:54:06
1966
原创 flink实战--MAC-flink环境搭建&wordcount实现
flink环境搭建java环境这里我使用的是jdk 1.8,下载jdk,自行设置环境变量。$: java -versionjava version "1.8.0_221"Java(TM) SE Runtime Environment (build 1.8.0_221-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mix...
2020-03-15 14:48:23
1031
原创 Zookeeper实战-使用Curator实现Leader选举
分布式系统中,对于一个复杂的任务,我们经常会选举一个Master节点,借助zk我们可以轻易的实现此项任务,在kafka以及spark的standalone模式下都是使用zk来实现Master选举,本文先从原理方面介绍为什么zk可以实现Master选举,然后利用curator的api进行Master选举实战。zk进行Master选举原理zookeeper的节点有两种类型: 持久节点和临时节点...
2020-03-08 20:15:45
1574
1
原创 Zookeeper实战-使用Curator开发
Curator是Netflix公司开源的一套Zookeeper客户端框架,是Apache的顶级项目,是全世界范围内使用最广泛的Zookeeper客户端之一。“Guava is to Java what Curator is to ZooKeeper”,可见Curator之重要,本文对Curator的创建,查看,更改,删除等操作进行详细的描述并配以案例,后续利用Curator来实现zookeepe...
2020-03-08 16:57:56
299
原创 Zookeeper实战-使用原生api开发
zookeeper 提供了java api来进行node的创建、删除、数据的获取设置、子节点的状态的观察、权限的设置。并且zookeeper客户端提供了异步操作,并有监听机制,更为方便的提供对zookeeper数据的监听和维护,本文通过几个例子来进行java api的学习和使用。依赖引入java api要引入mvn依赖,这里采用3.4.8,如下所示:<dependency>...
2020-02-29 18:50:02
713
原创 Zookeeper实战—Zookeeper单机环境搭建&命令使用
zookeeper介绍Zookeeper作为一个协调管理者被用在分布式系统中。当设计一个分布式系统时,一般需要设计和开发一些协调服务:名称服务— 名称服务是将一个名称映射到与该名称有关联的一些信息的服务。电话目录是将人的名字映射到其电话号码的一个名称服务。同样,DNS 服务也是一个名称服务,它将一个域名映射到一个 IP 地址。在分布式系统中,您可能想跟踪哪些服务器或服务在运行,并通过名称查看...
2020-02-27 20:27:35
253
原创 kafka源码分析之环境搭建
kafka作为常用的消息中间件,在各大企业得到广泛应用,笔者从今天开始将陆续对kafka 0.10.1进行源码分析。工欲善其事必先利其器,在阅读Kafka源码之前,首先第一步得搭建源码阅读环境,选择合适的工具可以使我们的学习效率更好,在这里我选用Intellij Idea 作为源码阅读环境的IDEA环境。环境依赖jdk下载jdk 1.8,设置JAVA_HOMEjava -version...
2020-02-24 15:06:55
538
原创 Spark core数据读取&存储实战
前言spark sql[spark 1.0.0]出现之前,数据的读取是通过sparkContext得到的是RDD,数据的存储是通过不同类型RDD的saveXXX方法存储的,Spark的整个生态系统与Hadoop是完全兼容的,所以对于Hadoop所支持的文件类型或者数据类型,Spark也同样支持。另外,由于Hadoop的API有新旧两个版本,所以Spark为了能够兼容Hadoop所有的版本,也提供...
2019-11-21 18:35:31
503
原创 Spark 2.x读取&存储数据实战
前言Spark是基于Hadoop生态圈二次构建的,它支持多种输入输出源,spark可以通过Hadoop MapReduce 所使用的InputFormat 和 OutPutFormat 接口访问数据,而大部分常见的文件格式与存储系统(S3, HDFS, Cassandra, HBase 等)都支持这种接口。数据读取与存储在spark 2.x之前是通过sqlContext/hiveConte...
2019-11-20 10:43:40
925
原创 一文让你了解DataSet处理Sql的各种实战技巧
概述项目中经常会用到sql相关操作,如果利用createTempView建立临时表,纯写sql方式实现是一种常用的方法,但是如何利用原生的算子进行sql的各种操作,经常摸不着头脑,本来基于spark 2.1.1进行原生算子进行sql常见操作的实战。数据构造原始数据原始数据包含五个字段,通过toDF指定column名字进行改名操作,最后我们建立了一个临时表,作为后文的sql语言和算子进行同样...
2019-11-06 17:48:51
2826
原创 Spark-Row实战&源码分析
前言spark在操作dataset/dataframe时候,经常需要对每一行数据进行处理,像map/mapPartition/foreach/ foreachParition等,那么我们在拿到一行数据时候,如何从中拿取出我们想要的列,然后进行相关业务操作,经常摸不着头脑,本文基于spark 2.1.1分析了一行数据的表达,以及详细的讲解了各种操作拿取行中相应列数据的方法。Row实战操作根据a...
2019-11-06 11:05:19
1539
原创 Spark DAGScheduler源码分析系列之三: Job提交&Stage划分&提交
概述 spark主程序中当遇到action算子的时候,就会提交一个job。一个job通常包含一个或多个stage,各个Stage之间存在着依赖关系,下游的Stage依赖于上游的Stage,Stage划分过程是从最后一个Stage开始往前执行的,最后一个Stage的类型是ResultStage。ResultStage可以使用指定的函数对RDD中的分区进行计算并得到最终结果。 本文...
2019-10-25 12:02:26
438
原创 Spark源码分析系列之RDD基础:Dependency
概述 RDD实现了基于Lineage的容错机制,不同RDD的依赖关系构成了计算链,当某个RDD出现错误时候,可以通过依赖关系进行重算。那么spark的依赖关系是如何划分的,以及是如何进行依赖关系记录的,本文通过分析源码一探究竟。Dependency及其划分 spark中定义在org.apache.spark.Dependency中,是个抽象类,只包含一个rdd,是它依赖的...
2019-10-21 10:16:55
485
原创 Spark源码分析系列之RDD基础:Partition
概述 RDD中最重要的一项是partition,RDD的五个要素里面有两个牵扯到partition,如下所示,研究partition不仅要研究Partition的定义,还要研究不同RDD的如下两个方法。// 对特定分配的分区进行操作def compute(split: Partition, context: TaskContext): Iterator[T]// 获取所有的part...
2019-10-17 17:22:48
496
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅