- 博客(487)
- 资源 (9)
- 收藏
- 关注

原创 大白话实战Seata
每个微服务连的都是自己的数据库,如果我们做一个购买业务,我要做的就是创建一个订单,并且把这个商品的库存扣了,然后去账户扣减余额,所以这个购买业务会调用三个微服务。上面是一段jdbc完成事务的代码,第一步是从数据源里获取连接,这个连接就是连向了某个数据库,第二步给这个连接设置非自动提交,也就是进入手动提交模式,接下来写我们的业务逻辑,写完后调用提交方法,如果业务执行期间出现异常,可以统一回滚,通过这段代码发现,我们以前的事务是在一条连接里面做的所有事情,它才可以一起提交和一起回滚,这个是我们本地事务的根源。
2025-02-22 16:36:06
623

原创 大白话实战Gateway
虽然SpringCloud里面内置了非常多的断言规则,但是它也不能囊括我们业务的所有规则,这个时候我们可以自己写一个断言工厂,通过配置的方式使用起来。假设我们有个需求,只有vip的用户才能转到必应去搜索,那怎么判断vip呢,我希望它自己从请求参数中拿到user并且user=aaa,它才是vip。q=haha?} };} };import org。
2025-02-20 23:29:55
1234

原创 大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。
2025-02-18 21:05:42
978

原创 大白话实战OpenFeign
避免这种问题的最简单的处理方式就是加入限时等待,比如只等待商品服务10s,如果没有超过,自然就返回正确结果,否则就中断调用。可以看出默认是从不进行重试。响应拦截器用的不多,我们就用请求拦截器为例进行测试,我们希望订单服务给商品服务发送请求之前,用请求拦截器给这次请求里面放一个业务扩展字段,比如X-Token,在业务上代表一个一次性令牌,后边的值可以是一个uuid,把这组k-v放到本次请求的请求头上,最后商品服务收到这个请求,就可以从请求头上拿到X-Token的数据,接下来我们来实现这个需求。
2025-02-15 21:48:06
850

原创 大白话演绎SpringCloud架构进化过程
同理,数据库服务器也可以复制多台副本。以前的架构我们在每一台服务器上部署了商城的完整应用,这样每一处代码的更新都得需要把应用重新打包部署,现在可以把整个应用,按照功能模块进行拆分,把一个大的应用,拆分成一个个小应用,比如商品、订单、支付等等,拆分出的每一个小应用,我们把它称为微服务,每个微服务都可以独立部署,不仅应用可以拆分,数据库也可以,以前商城所有的数据都在一个库里面,并发高的情况,所有增删改查都要经过这个库,可能同样扛不住,进一步拆分,把商品的数据放到商品数据库、订单数据放到订单数据库里,依次类推。
2025-02-07 22:12:08
979

原创 Spark操作Hive表幂等性探索
旁边的实习生一边敲着键盘一边很不开心的说:做数据开发真麻烦,数据bug排查太繁琐了,我今天数据跑的有问题,等我处理完问题重新跑了代码,发现报表的数据很多重复,准备全部删了重新跑。我:你的数据操作具备幂等性吗?实习生:啥事幂等性?数仓中的表还要考虑幂等性吗?
2023-08-11 15:49:32
1096

原创 SparkSQL性能优化终极篇
随着Spark版本的不断迭代,SparkSQL底层使用了各种优化技术,无论方便性、性能都已经超越了RDD。因此SparkSQL已经是最常用的Spark开发方式,因此,这里把常用的SparkSQL性能优化技术进行汇总。
2023-06-12 13:46:10
2134
2

原创 Spark数据倾斜解决方案六:随机前缀和扩容Join(包含完整案例代码)
该想法的原因:Shuffle的时候把Key的数据可以分到不同的Task里。但是,现在的倾斜的Key非常多,成千上万,所以如果说采样找出倾斜的Key的话,并不是一个非常好的想法。需要考虑当前程序能够使用的Core的数目,扩容的问题是来解决从程序运行不了的问题,从无法运行到能运行的结果。该方案更多的是缓解数据倾斜,而不是彻底避免数据倾斜,而且需要对整个RDD进行扩容,对内存资源要求很高。同时对另外一个正常的RDD进行扩容,将每条数据都扩容成n条数据,扩容出来的每条数据都依次打上一个0~n的前缀。
2023-06-10 13:12:36
1248

原创 Spark数据倾斜解决方案五:对倾斜key采样后单独Join(包含完整案例代码)
对倾斜的Keys采样进行单独的Join操作步骤有点复杂:首先对RDD1进行采样,例如RDD1进行Sample抽样(15%)可以计算出一个结果,其是一个RDD,采样之后进行Map操作,通过reduceBykey操作计数,然后对Key和Value进行置换,通过SortByKey进行排序,再进行Map置换操作,从而找出哪一个Key值倾斜比较严重,对其进行过滤,提取到RDD11中,剩下的提取到RDD12中。避免了占用过多内存。如果倾斜的Key特别多,如50多个倾斜的Key,我们可以一个一个地对Key进行过滤处理。
2023-06-10 12:32:11
1027

原创 带你彻底理解Spark的分区
我:什么是RDD?面试者:RDD是被分区的,由一系列分区组成…我:你怎么理解分区?面试者:…我:Spark中有哪些可以实现分区的方法?分别使用的场景是什么?面试者…我:Spark默认分区数是多少?如何保证一个分区对应一个文件?面试者…Spark分区是将大型数据集划分为较小的数据块,每个数据块称为分区,分区是一个逻辑数据块,对应相应的物理块Block。每个分区都可以在集群中的不同节点上并行处理,这样可以提高Spark的并行性和性能。
2023-05-05 10:53:06
1255

原创 通俗易懂理解RDD看这一篇就够了
今天面试一个大数据开发工程师,spark相关的知识感觉都能懂一点,但是连基础的RDD稍微一问深一点就不知所云,这种情况基本上是无法通过面试的,今天想用通俗的话把RDD说明白。弹性分布式数据集)是Spark中最基本的数据抽象,代表不可变、可分区、可并行计算的集合。RDD允许将计算结构缓存到内存中,这样当后续计算需要这些数据时,就能快速从内存中加载它们,这样不但提高数据的复用性,还提高了数据的计算效率。RDD主要特点包括并行计算自动容错数据本地性调用等。
2023-05-04 18:26:37
2894

原创 repartition和partitionBy的区别
旁边的实习生一脸困惑:我把一个dataset的数据往某个文件夹或hive表中写的时候可以用partitionBy对数据进行分区,可是repartition顾名思义也好像与分区有关,这两个究竟有啥区别?我该如何使用?
2023-05-04 15:26:38
943

原创 Spark需要的资源调优(Yarn Cluster模式)
Spark应用程序是粗粒度的,也就是说在提交的时候就得规划好需要多少资源,设定了不合适的资源也会影响整体性能。yarn.nodemanager.resource.memory-mb 每个nodemanager分配的内存,也就是该节点上YARN可使用的物理内存总量。官方。
2023-04-01 23:43:46
610

原创 Dataset关联性能优化
如果一大一小两个Dataset进行join,每个woker的内存足够存放小的Dataset,此时最好的处理方式就是将小的Dataset进行广播,有关广播的知识可以参考这篇文章。
2023-03-31 23:45:01
256

原创 广播变量对Spark性能产生的影响
先说一下为什么Spark会引入广播变量?我们在driver端定义了一个变量,如果要在executor端使用,spark会为把这个变量以task的形式给每个executor发送,也就是有多少个task,每个executor中就会有多少个变量,如果该变量是个集合,而且比较大,甚至会导致内存溢出。因此,引入了广播变量来解决这种问题。下面会用实际案例进行详细描述。
2023-03-31 17:25:50
376

原创 collect大RDD性能优化
众所周知,collect算子会把所有数据拉到driver端,如果数据量太大,直接会造成内存溢出。但是该算子在很多实际场景中会经常用到,这个时候就需要采取一定地方优化措施了。
2023-03-31 15:14:18
435
2

原创 Scala中如何优雅的处理Null
前言如果在scala代码还在使用ids!=null,可能会被有的人嘲笑,都什么年代了,竟然还有这样的写法,NullPointerException见少了吧?不过,据统计:Spark 源代码使用了 821 次 Option 关键字,但它也直接在像if (ids != null)。Spark 采用混合方式,大部分情况下使用 Option,但个别时候出于性能(这里主要是为了给使用这返回提示信息)原因才使用了null。一个很好的习惯是当有方法返回值可能为null的时候,使用Option来代替。什么是Op
2021-08-28 20:44:08
3890
1

原创 Python 连续数据离散化最通俗的理解与操作
前言一些数据挖掘算法,特别是某些分类算法,如ID3算法、Apriori算法等,要求数据是分类属性形式。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。离散化是干啥连续属性离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。所以,离散化涉及两个子任务:确定分类数以及如何将连续属性值映射到这些分类值。常用的离散化方法常用的离散化方法有等宽法、等频法和(一维)聚类。(1)等宽法将属性的值域分成具有相同宽
2021-01-05 18:26:40
10923
1

原创 python 下采样和上采样
前言由于工作数据量较大,训练模型很少直接单机python,一般都采用SparkML,最近把SparkML的工作使用python简单的写了一下,先写个上下采样,最终目的是为了让正负样本达到均衡(有人问:正负样本必须是1:1吗?1:1效果就一定最好吗?答:不一定)数据准备共20条数据,正样本1共有5条,负样本0共有15条。基础知识准备如何获取dataframe的行数pandas.DataFrame.shape 返回数据帧的形状df.shape[0] 返回行数de.shape[1] 返
2020-10-28 16:23:27
9893
2

原创 Hadoop面向行和面向列格式详解
前言说到HDFS上面存储数据的格式,一般会想到面向行存储的Avro、SequenceFile(现在较少用);面向列存储的Parquet、ORC等,那么在存储的时候如何选择呢?面向行存储格式(以Avro和SequenceFile为例)Avro基本概念Avro是一个独立于编程语言的数据序列化系统。引入的原因:解决Writable类型缺乏语言的可移植性。Avro数据文件主要是面向跨语言使...
2020-01-17 11:10:54
1433

原创 Hive压缩存储(以Parquet为例)
前言前面说了,HDFS上的数据在生产环境中一定是以压缩格式存储的,那么在Hive中如何使勇Parquet格式存储数据呢?测试数据在本地服务器上面vim test.txt1,zs2,ls3,ww4,zl由于我们一般接到的数据都是gzip压缩的文件,这里就将文件压缩为gzipgzip -c test.txt > .test.gz错误的方式创建parquet的hive表...
2020-01-09 10:22:46
2074
2

原创 HDFS文件的压缩
前言新搭建的集群,需要进行各种测试,于是让一个同事导入一些测试数据,大约1.4T左右。我进行了一个简单的hive测试//故意增加shuffleSELECT DISTINCT(COUNT id) FROM test_table;谁知道…就这么一个简单的SQL,半个小时过去后,仍然没有出结果追查原因原来同事从ftp拉取过来的数据是gzip格式的,他直接如到Hive表中…,而gzip格式的...
2020-01-04 18:06:11
8008
1

原创 Pearson相关系数和Spearman相关系数的区别
前言相关系数是用以反映变量之间的相关关系程度的统计指标。其取值范围是[-1,1],当取值为0时表示不相关,取值为[-1,0)表示负相关,取值为(0,-1],表示负相关。目前常用的两种相关性系数为皮尔森相关系数(Pearson)和斯皮尔曼等级相关系数(Spearman)简介皮尔森相关系数评估两个连续变量之间的线性关系。其中:-1 ≤ p ≤ 1p接近0代表无相关性p接近1或-1......
2019-08-29 14:31:55
70861
10

原创 MapReduce过程详解
MapReduce是一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式并行编程模式,主要用于大规模并行程序并行问题。MapReduce的主要思想:自动将一个大的计算(程序)拆分成Map(映射)和Reduce(化简)的方式。流程图如下:数据被分割后通过Map函数将数据映射成不同的区块,分配给计算集群进行处理,以达到分布运算的效果,再通过Reduce函数将结果进行汇...
2018-05-16 11:54:47
3200
原创 MybatisPlus多租户插件实战
TenantLineInnerInterceptor 的关键属性是 tenantLineHandler,它是一个 TenantLineHandler 接口的实例,用于处理租户相关的逻辑。属性名类型描述租户处理器( TenantId 行级 )
2025-03-10 10:46:25
652
原创 大白话实战docker
举个例子,在一台机器用docker启动了些应用:如果app1想要访问app2获取数据,我们想到的方案就算每个容器都会在机器上暴露访问端口,这样别人使用当前机器的ip加上暴露的端口,就能访问到某个应用,那同样的容器访问容器,也可以这么做。curl http://ip地址:99。
2025-03-02 11:52:32
1101
1
原创 MybatisPlus教程-从入门到进阶
首先它是国产的,所以直接用官网的简介。MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。好了,上面的都来自于官网,我们要做的就是把官网中各种零散的教程,整合成一个个通俗易懂的案例。拢共就两步定义Mapper接口并继承BaseMapper快速入门-入门案例需求:基于课前资料提供的项目,实现下列功能:详情参考SpringBootWeb快速入门。创建对应的实体类创建数据库配置文件为了可以在控制台日志
2025-02-21 14:39:37
1110
原创 go语言文件和目录
os.Open()函数能够打开一个文件,返回一个*File 和一个 err。io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入。它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和。os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。perm:文件权限,一个八进制数。name:要打开的文件名 flag:打开文件的模式。为了防止文件忘记关闭,我们通常使用 defer 注册文件关闭语句。
2025-02-08 10:10:05
543
原创 go语言中的反射
反射是指在程序运行期间对程序本身进行访问和修改的能力。正常情况程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Golang 中反射可以实现以下功能:反射可以在程序运行期间动态的获取变量的各种信息,比如变量的类型 类别。
2025-02-07 17:00:57
867
原创 go并发和并行
(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。管道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭管道不是必须的。是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位一个进程可以创建多个线程,同一个进程中的多个线程可以并发执行,一个程序要运行的话至少有一个进程。
2025-02-07 15:17:05
1136
原创 go语言中的接口
现实生活中的接口现实生活中手机、相机、U 盘都可以和电脑的 USB 接口建立连接。我们不需要关注 usb 卡槽大小是否一样,因为所有的 USB 接口都是按照统一的标准来设计的。Golang 中的接口(interface)Golang 中的接口是一种抽象数据类型,Golang 中接口定义了对象的行为规范,只定义规范不实现。接口中定义的规范由具体的对象来实现。通俗的讲接口就一个标准,它是对一个对象的行为和规范进行约定,约定实现接口的对象必须得按照接口的规范。
2025-02-07 13:36:11
703
原创 go包以及包管理工具详解
包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,Go 语言为我们提供了很多内置包,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。Golang 中的包可以分为三种:系统内置包 、自定义包 、第三方包系统内置包: Golang 语言给我们提供的内置包,引入后可以直接使用,如 fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等。
2025-02-07 10:43:33
619
原创 go结构体和json相互转换、序列化和反序列化
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。RESTfull Api 接口中返回的数据都是 json 数据。"title": "笔记本电脑",},"title": "第二个轮播图",},"title": "第三个轮播图",},"title": "教程",
2025-02-07 10:03:05
1236
原创 go结构体详解
Golang 中没有“类”的概念,Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比,Golang 中的结构体具有更高的扩展性和灵活性。Golang 中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型就无法满足需求了,Golang 提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct。也就是我们可以通过 struct 来定义自己的类型了。
2025-02-07 08:55:38
773
原创 go语言中的指针
我们知道变量是用来存储数据的,变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a := 10 ,这个时候可以直接通过 a 这个变量来读取内存中保存的 10 这个值。在计算机底层 a 这个变量其实对应了一个内存地址。指针也是一个变量,但它是一种特殊的变量,它存储的数据不是一个普通的值,而是另一个变量的内存地址。指针地址、指针类型和指针取值&(取地址)(根据地址取值)
2025-02-06 14:29:18
1498
原创 go time 包以及日期函
time.Duration 是 time 包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。要获取时间点 t-d(d 为 Duration),可以使用t.Add(-d)。判断两个时间是否相同,会考虑时区的影响,因此不同时区标准的时间也可以正确比较。时间和日期是我们编程中经常会用到的,在 golang 中 time 包提供了时间的显示和测量用的函数。我们可以通过 time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。如果 t 代表的时间点在 u 之后,返回真;
2025-02-06 13:17:01
850
原创 go函数详解
函数是组织好的、可重复使用的、用于执行指定任务的代码块。Go 语言中支持:函数、匿名函数和闭包。func 函数名(参数)(返回值){函数体函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。函数体:实现指定功能的代码块。
2025-02-06 10:56:02
916
原创 go语言中的map
map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。KeyType:表示键的类型。ValueType:表示键对应的值的类型。map 类型的变量默认初始值为 nil,需要使用 make()函数来分配内存。make: 用于 slice,map,和 channel 的初始化。其中 cap 表示 map 的容量,该参数不是必须的。注意:获取 map 的容量不能使用 cap, cap 返回的是数组切片分配的空间大小, 根本不能用于map。
2025-02-05 17:36:11
350
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人