自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

赞的心路历程

Engineers are versatile minds who create links between science, technology, and society.

  • 博客(223)
  • 资源 (1)
  • 收藏
  • 关注

原创 记录一次kafka百万消息堆积的处理过程

业务背景可以详见上一篇文章:通过kafka,canal进行数据异构同步的一套技术方案_赞的心路历程-CSDN博客2021年10月25日开始,业务大爆发,数据量激增 ,到了28日zabbix监控显示差不多堆积了90万的消息通过skywalking查看消费者的消费吞吐量并没有异常,是业务数据大爆发,造成了日数据增量成倍增加,消费不及时,造成了消息堆积。逐步排查消费瓶颈在何处:将涉及到的服务资源按,kafka,消费者,目标数据库的cpu,内存,硬盘,带宽,逐一排查;首先

2021-11-01 17:15:34 3370

原创 通过kafka,canal进行数据异构同步的一套技术方案

业务背景说明:本公司有一个业务场景是需要从A数据库异构同步至B数据库,在B数据库进行一些逻辑统计查询操作,大致如下图:当时设计的技术架构如下:第一步:通过canal监听A库的binlog日志,将binlog日志信息发送至kafka消息队列第二步:部署由纯java编写的canal-kafka工程,消费kafka消息,异构原始数据,落B库,canal-kafka可以多节点分片部署该方案咋一看可能存在一些问题,如同步性能如何,sql执行顺序问题如何保证,下面一一解答.

2021-11-01 14:46:14 1873 2

原创 代码之外的生存指南

2021-10-19 17:20:07 181

原创 12、DolphinScheduler

打开要设置分组的 Worker 节点上的 worker.properties 配置文件,修改 worker.groups 参 数,worker.groups 参数的值为该 Worker 节点对应的分组名称,默认为 default,如果该 worker。此处可配置 Worker 运行环境(任务运行时所需的环境变量),默认的运行环境由 Worker节点中,dolphinscheduler 安装目录下的 conf/env/dolphinscheduler_env.sh 决定。

2024-01-06 14:02:43 1004

原创 10、采集通道启动、停止脚本

启停脚本:f1.sh ) ---> 投递kafka topic:topic_log --->[hadoop104] Flume(消费kafka日志 kafka_to_hdfs_log.conf;启停脚本:mxw.sh) --->投递kafka topic:topic_db ---> [hadoop104] Flume(消费kafka日志 kafka_to_hdfs_db.conf;启停脚本:f3.sh ) ps:增量表首日全量同步 mysql_to_kafka_inc_init.sh。

2023-07-05 14:27:04 274

原创 9.2、增量表数据同步

此处为了模拟真实环境,对Maxwell源码进行了改动,增加了一个参数mock_date,该参数的作用就是指定Maxwell输出JSON字符串的ts时间戳的日期,接下来进行测试。通常情况下,增量表需要在首日进行一次全量同步,后续每日再进行增量同步,首日全量同步可以使用Maxwell的bootstrap功能,方便起见,下面编写一个增量表首日全量同步脚本。需要注意的是, HDFSSink需要将不同mysql业务表的数据写到不同的路径,并且路径中应当包含一层日期,用于区分每天的数据。

2023-07-05 13:58:42 437

原创 9.1、全量表数据同步

由于DataX同步任务要求目标路径提前存在,故需手动创建路径,当前activity_info表的目标路径应为/origin_data/gmall/db/activity_info_full/2020-06-14。注:由于目标路径包含一层日期,用于对不同天的数据加以区分,故path参数并未写死,需在提交任务时通过参数动态传入,参数名称为targetdir。4)执行gen_import_config.sh脚本,生成配置文件。1)在~/bin目录创建mysql_to_hdfs_full.sh。

2023-07-05 13:49:13 310

原创 9、DataX安装部署

通常情况下,离线数据同步任务需要每日定时重复执行,故HDFS上的目标路径通常会包含一层日期,以对每日同步的数据加以区分,也就是说每日同步数据的目标路径不是固定不变的,因此DataX配置文件中HDFS Writer的path参数的值应该是动态的。为实现这一效果,就需要使用DataX传参的功能。DataX的使用十分简单,用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。

2023-07-05 13:40:32 2644

原创 8、离线数仓同步数据

元数据层面:每个小文件都有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等,这些信息都保存在Namenode内存中。并且对每天产生的用户行为日志进行区分,将不同天的数据发往HDFS不同天的路径。用户行为数据由Flume从Kafka直接同步到HDFS,由于离线数仓采用Hive的分区表按天统计,所以目标路径要包含一层日期。官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount。

2023-07-05 11:45:02 128

原创 7、Maxwell安装部署

但有时只有增量数据是不够的,我们可能需要使用到MySQL数据库中从历史至今的一个完整的数据集。1)第一条type为bootstrap-start和最后一条type为bootstrap-complete的数据,是bootstrap开始和结束的标志,不包含数据,中间的type为bootstrap-insert的数据才包含数据。Maxwell需要在MySQL中存储其运行过程中的所需的一些数据,包括binlog同步的断点位置(Maxwell支持断点续传)等等,故需要在MySQL为Maxwell创建数据库及用户。

2023-07-05 11:28:52 946

原创 6、Flume安装部署

按照规划,需要采集的用户行为日志文件分布在hadoop102,hadoop103两台日志服务器,故需要在hadoop102,hadoop103两台节点配置日志采集Flume。(1)将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/software目录下。修改/opt/module/flume/conf/flume-env.sh文件,配置如下参数(虚拟机环境暂不配置)(2)解压apache-flume-1.9.0-bin.tar.gz到/opt/module/目录下。

2023-07-05 11:10:03 601

原创 5、Kafka安装部署

因为Zookeeper集群当中记录着Kafka集群相关信息,Zookeeper集群一旦先停止,Kafka集群就没有办法再获取停止进程的信息,只能手动杀死Kafka进程了。5)分别在hadoop103和hadoop104上修改配置文件/opt/module/kafka/config/server.properties中的broker.id=1、broker.id=2。(1)在/etc/profile.d/my_env.sh文件中增加kafka环境变量配置。(2)把主题中所有的数据都读取出来(包括历史数据)。

2023-07-05 11:00:35 207

原创 4、Zookeeper分布式安装部署

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。(1)重命名/opt/module/zookeeper/conf这个目录下的zoo_sample.cfg为zoo.cfg。(2)在/opt/module/zookeeper/zkData目录下创建一个myid的文件。(1)在/opt/module/zookeeper/这个目录下创建zkData。

2023-07-04 18:06:18 999

原创 3、Hive安装部署

新版本的Hive启动的时候,默认申请的JVM堆内存大小为256M,JVM堆内存申请的太小,导致后期开启本地模式,执行复杂的SQL时经常会报错:java.lang.OutOfMemoryError: Java heap space,因此最好提前调整一下HADOOP_HEAPSIZE这个参数。(1)修改$HIVE_HOME/conf下的hive-env.sh.template为hive-env.sh。2)解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面。

2023-07-04 18:00:30 313

原创 1、hadoop集群搭建

这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login shell启动时会加载/etc/profile,~/.bash_profile,~/.bashrc。面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%。Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,~/.bashrc,~/.bash_profile等,下面说明上述几个文件之间的关系和区别。

2023-07-04 14:39:03 551

原创 0、技术选型

以128G内存,20核物理CPU,40线程,8THDD和2TSSD硬盘,戴尔品牌单台报价4W出头。(一般大厂使用,技术实力雄厚,有专业的运维人员) (建议使用)(2)每条日志1K左右,每天1亿条:100000000 / 1024 / 1024 = 约100G。(2)CDH:国内使用最多的版本,但CM不开源,今年开始收费,一个节点1万美金/年。(1)每天日活跃用户100万,每人一天平均100条:100万*100条=1亿条。(3)HDP:开源,可以进行二次开发,但是没有CDH稳定,国内使用较少。

2023-07-04 14:28:31 160

原创 Hive SQL题库(中级)

第1章 环境准备1.1 用户信息表1)表结构user_id(用户id)gender(性别)birthday(生日)101男1990-01-01102女1991-02-01103女1992-03-01104男1993-04-01 2)建表语句3)数据装载1.2 商品信息表1)表结构sku_id(商品id)name(商品名称)category_id(分类id)from_date(上架日期)price(商品价格)1xiaomi 1012020-01-0120006洗碗机22020-02-0120009

2023-06-26 18:08:33 480

原创 Hive函数(二)

Lateral View可以将UDTF应用到源表的每行数据,将每行数据转换为一行或多行,并将源表中每行的输出结果与该行连接起来,形成一个虚拟表。绝大多数的聚合函数都可以配合窗口使用,例如max(),min(),sum(),count(),avg()等。窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算,最后将计算结果返回给该行数据。思考:如下基于值的窗口划分方式,是基于哪个字段的值划分的?该查询语句的返回结果是什么?窗口范围的定义分为两种类型,一种是基于行的,一种是基于值的。

2023-06-26 15:28:07 472

原创 Hive SQL题库(初级)

① 先找出有两门以上不及格的学生名单,按照学生分组,过滤组内成绩低于60的并进行count,count>=2。② 接着做出一张表查询学生的平均成绩并和上一个子查询中的学生学号进行连接。(2)将如下4个文件放到/opt/module/data目录下。查询一共参加三门课程且其中一门为语文课程的学生的id和姓名。学生id 语文 数学 英语 有效课程数 有效平均成绩。(1)创建/opt/module/data目录。(2)验证插入数据情况。

2023-06-21 17:12:09 817

原创 Hive函数(一)

语法:get_json_object(string json_string, string path)Hive提供了大量的内置函数,按照其特点可大致分为如下几类:单行函数、聚合函数、炸裂函数、窗口函数。语法:regexp_replace(string A, string B, string C)| array(string))语法:concat(string A, string B, string C, ……语法:replace(string A, string B, string C)

2023-06-21 16:55:08 1011

原创 Linux下安装nginx

链接: https://pan.baidu.com/s/1RYqotdX5ziFbj-KlvB5zeQ 提取码: 6jni 云盘中有相关安装包。找到你安装的源码包(不是/usr/local/nginx)是那个带有版本号的位置。然后将刚刚编译好的nginx覆盖掉原有的nginx (这个时候nginx要停止状态)进入目录 /usr/local/nginx/sbin/nginx 启动服务。3.将pcre-8.37移动到 /usr/local/目录下。4.在/usr/local/pcre-8.37 目录下。

2023-06-15 14:49:01 517

原创 Linux下mysql5.7.28安装

1)/opt/software目录下上传MySQL安装包以及MySQL驱动jar包。1)用刚刚查到的密码进入MySQL(如果报错,给密码加单引号)2)设置复杂密码(由于MySQL密码策略,此密码必须足够复杂)7)修改user表,把Host表内容修改为%3)非必选 更改MySQL密码策略。5)安装mysql-client。6)安装mysql-server。4)非必选 设置简单好记的密码。2)解压MySQL安装包。4)安装MySQL依赖。8)查看MySQL密码。注意:若出现以下错误。5)进入MySQL库。

2023-05-29 17:34:36 781

原创 Hive安装部署

1)把apache-hive-3.1.3-bin.tar.gz上传到Linux的/opt/software目录下。观察HDFS的路径/user/hive/warehouse/stu,体会Hive与Hadoop之间的关系。2)解压apache-hive-3.1.3-bin.tar.gz到/opt/module/目录下面。3)修改apache-hive-3.1.3-bin.tar.gz的名称为hive。4)修改/etc/profile.d/my_env.sh,添加环境变量。1、Hive安装地址。

2023-05-29 15:42:12 701

原创 Linux下安装mysql8.0

1、选择Yum Repository 页面 https://dev.mysql.com/downloads/repo/yum/下载页面:https://dev.mysql.com/downloads/repo/yum/11、创建host(如果有"%"这个host值,则跳过这一步)(1)任意主机以用户root和密码pwd连接到mysql服务器。4、检查MySQL在Yum repository默认版本。2、在 /mydata/mysql 目录下下载rpm文件。7、检查mysql是否启动成功。

2022-11-10 15:17:48 469

原创 Spring 循环依赖与三级缓存源码debug

通常来说,如果问 Spring 容器内部如何解决循环依赖, 一定是指默认的单例 Bean 中,属性互相引用的场景。也就是说,Spring 的循环

2022-06-15 21:06:57 315

原创 14、课程总结与回顾

这基本上接近本课程终点了,O(∩_∩)O 请同学们务必动手学会+跳槽时动嘴可说, 你所谓的懂了可能只是理解了,一动手一动嘴估计可能挂了,请下苦功夫打磨自己 最后的梳理走走...... 1、CompletableFuture2、“锁”事儿 2.1、悲观锁 2.2、乐观锁 2.3、自旋锁 2.4、可重入锁(递归锁) 2.5、写锁(独占锁)/读锁(共享锁) 2.6、公平锁/非公平锁 2.7、死锁

2022-06-10 10:34:13 304

原创 13、ReentrantLock、ReentrantReadWriteLock、StampedLock讲解

无锁→独占锁→读写锁→邮戳锁你知道Java里面有哪些锁?你说你用过读写锁,锁饥饿问题是什么?有没有比读写锁更快的锁?StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制策略你知道吗?读写锁定义为一个资源能够被 多个读线程 访问,或者被 一个写线程 访问,但是不能同时存在读写线程。 『读写锁』意义和特点『 读写锁 ReentrantReadWriteLock 』 并不是 真正意义上的读写分离, 它只允许读读共存,而读写和写写依然是互斥的, 大多实际场景是 “

2022-06-10 10:31:40 537 1

原创 12、AbstractQueuedSynchronizer之AQS

公平锁和非公平锁可重入锁自旋锁LockSupport数据结构之链表设计模式之模板设计模式抽象的队列同步器源代码 AbstractOwnableSynchronizer AbstractQueuedLongSynchronizer AbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS 是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工

2022-06-10 10:21:24 430

原创 11、Synchronized与锁升级

谈谈你对Synchronized的理解Synchronized的锁升级你聊聊Synchronized的性能是不是一定弱于Lock synchronized 锁优化的背景 用锁能够实现数据的 安全性 ,但是会带来 性能下降 。 无锁能够基于线程并行提升程序性能,但是会带来 安全性下降 。 求平衡??? synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略重量级锁,假如锁的竞争比较激烈的话,性能下降Java5之前,用户态和内核态之间的切换 java的线程是

2022-06-10 09:46:19 740

原创 10、Java对象内存布局和对象头

一般而言JDK8按照默认情况下,new一个对象占多少内存空间位置所在:JVM里堆→新生区→伊甸园区构成布局:头体?想想我们的HTML报文周志明老师JVM第3版 对象标记Mark Word它保存什么 在 64 位系统中, Mark Word 占了 8 个字节,类型指针占了 8 个字节,一共是 16 个字节 默认存储对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态

2022-06-09 17:45:25 288

原创 9、聊聊ThreadLocal

ThreadLocal中ThreadLocalMap的数据结构和关系?ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄露问题你知道吗?ThreadLocal中最后为什么要加remove方法?...... 稍微翻译一下: ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法) 都有自己的、独立初始化的变量副本 。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态

2022-06-09 17:35:27 585

原创 8、原子操作类之18罗汉增强

LongAdder为什么这么快

2022-06-09 17:22:56 299

原创 7、CAS

多线程环境不使用原子类保证线程安全(基本数据类型)多线程环境 使用原子类保证线程安全(基本数据类型)CAS compare and swap的缩写,中文翻译成 比较并交换, 实现并发算法时常用到的一种技术。它包含三个操作数—— 内存位置、预期原值及更新值。 执行CAS操作的时候,将内存位置的值与预期原值比较: 如果 相匹配 ,那么处理器会自动将该位置值更新为新值, 如果 不匹配 ,处理器不做任何操作,多个线程同时执行CAS操作 只有一个会成功 。 原理:CAS (CompareAndS

2022-06-09 15:29:44 372

原创 6、volatile与Java内存模型

1、被volatile修改的变量有2大特点1.1、特点可见性有序性 排序要求1.2、volatile的内存语义当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内存语义是直接从主内存中读取。2、内存屏障2.1、先说生活case没有管控,顺序难保设定规则,禁止乱序 :上海南京路步行街武警“人墙”当红灯2.2

2022-06-09 14:59:42 455

原创 5、Java内存模型之JMM

计算机存储结构,从本地磁盘到主存到 CPU 缓存,也就是从硬盘到内存,到 CPU 。一般对应的程序的操作就是从数据库查数据到内存然后到 CPU 进行计算 问题?和推导出我们需要知道JMM因为有这么多级的缓存(cpu和物理主内存的速度不一致的),CPU的运行并 不是直接操作内存而是先把内存里边的数据读到缓存 ,而内存的读和写操作的时候就会造成不一致的问题Java虚拟机规范中试图定义一种Java内存模型(java Memory Model,简称JMM) 来屏蔽掉各种硬件和操作系统的内存访问差异, 以实现让Jav

2022-06-09 14:45:01 261

原创 4、LockSupport与线程中断

如何停止、中断一个运行中的线程?首先一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。中断只是一种协作机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。若要中断一个线程,你需要手动调用该线程的 interrupt 方法,

2022-06-09 10:59:46 299

原创 3、Java“锁”事

认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 synchronized 关键字和 Lock 的实现类都是悲观锁 适合写操作多的场景,先加锁可以保证写操作时数据正确。显式的锁定之后再操作同步资源2.3、乐观锁乐观锁认为自己在使用数据时 不会有别的线程修改数据 ,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。 如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同

2022-06-09 10:43:47 378

原创 2、CompletableFuture

Future接口定义了操作 异步任务执行一些方法 ,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Callable接口中定义了需要有返回的任务需要实现的方法。 比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,过了一会才去获取子任务的执行结果。 ① 应对Future的完成时间,完成了可以告诉我,也就是我们的回调通知② 将两个异步计算合成一个异步计算,这两个异步计算互相独立,同时第二个又依赖第一个的

2022-06-09 10:31:37 830

原创 1、线程基础知识

线程 操作 资源类摩尔定律:它是由英特尔创始人之一Gordon Moore(戈登·摩尔)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。这一定律揭示了信息技术进步的速度。可是从2003年开始CPU主频已经不再翻倍,而是采用多核而不是更快的主频。摩尔定律失效。在主频不再提高且核数在不断增加的情况下,要想让程序更快就要用到 并行或并发编程。高并发系统,异步+回调等生产需求pri

2022-06-09 09:53:41 655 2

原创 17、Redis为什么快?高性能设计之epoll和IO多路复用深度解析

1、Redis单线程如何处理那么多并发客户端连接,为什么单线程,为什么快Redis的多路复用Redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,一次放到文件事件分派器,事件分派器将事件分发给事件处理器。Redis是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以I/O操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现所谓

2022-05-09 21:39:14 372

LongAdder源码解读

通过对代码的流程分析,一步一步拆解,将源码解读变得简单

2022-06-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除