- 博客(61)
- 问答 (1)
- 收藏
- 关注
原创 记一次jar冲突的问题
业务中需要在spark中链接redis作为服务缓存,spark程序中引入redis的jar包后上传spark集群运行是报。根据报错信息发现是jar包冲突造成。
2023-12-17 10:26:23
674
原创 数仓建模理论
事实:描述业务过程的度量,如可以sum/count的交易金额。事实表:通过度量来表达业务过程,事实表紧紧围绕业务过程来设计。事实表结构应包含:数值度量:可加性:可按照任意维度汇总,如支付金额半可加性:可按照部分维度汇总,如一个商品的库存按月汇总起来是没有意义的。不可加性:不能汇总,如将汇率加起来是没有意义的主键、外键:用于关联退化维度:在事实表中冗余常见的维度属性(字段/列)粒度:一行数据所表达的业务细节程度,它确定了事实表的每一行表示什么级别的数据。
2023-09-10 09:51:23
231
原创 MySQL索引&ES索引
最左匹配原则的建立树的方法,假如是a,b,c的联合索引,则先用最左边的a索引建立一个B+树,随后在叶子节点再对a相同的部分按照b的大小做排序,随后再对b相同的部分,按照c的大小去做排序介绍完了MySQL的索引之后,我们来介绍一下ES的索引结构。以及为什么在很多场景中ES的搜索速度是优于MySQL的。定义:Elasticsearch 是一个分布式、可扩展、(近)实时的搜索与数据分析引擎,可以支持高效的全文检索、结构化搜索和分析。
2023-08-19 18:07:19
1309
原创 Flink 火焰图
Flink 作业动态参数里增加配置:“rest.flamegraph.enabled”: “true” 并重启作业。当前该功能没有默认开启,因为这个功能使用时对性能有少量损耗,特别是对于并行度比较大的作业。第五步 在 Flink WebUI JM/TM 的 Log List 页面中找到火焰图文件并下载。第二步: 在 Web UI 上选中想要探查的算子,打开 FlameGraph 面板。第四步:将火焰图文件移动至 Flink 日志目录下。Flink 自己也支持了 Task 粒度的。第一步:配置启用功能。
2023-08-13 17:24:47
1959
原创 Clickhouse-MergeTree表结构
ClickHouse 是一个列式存储的数据库,即数据以列为基本单元。相比较行式存储,列式存储的压缩比更高,查询速度也更快。若干个 part 目录组成一个逻辑分区(Partition)。每次插入数据会生成新的 part 目录,part 文件会在后台合并,以优化存储与读取性能。{col_name}.bin 是列存文件,存有每一列数据内的 block(最小压缩单元)与 granule(最小读取单元)。primary.idx 是索引文件,记录(压缩前)行号与排序索引值的对应关系。
2023-07-22 11:40:37
414
原创 Spark SQL生产优化经验--任务参数配置模版
特殊case说明:当任务存在扫event_log表时需注意,若对event_log表进行了过滤,且过滤比很高,如下图的case,input为74T,但shuffle write仅为3.5G,那么建议提高单partition的读取数据量,将参数set spark.sql.files.maxPartitionBytes=536870912提高10倍至5368709120;目前测试:在不手动添加任何参数、平均时长在90min以内、单个shuffle 量在2T以下的任务可以使用该模版,但实际任务情况还需跟踪观察。
2023-07-02 11:55:48
1766
1
原创 Docker总结笔记
文章目录1.docker概述2.虚拟化技术和容器化技术3.Docker基本组成4.Docker安装5.Docker容器运行流程6.底层原理7.Docker常用命令7.1 基础命令7.2 镜像命令7.3 容器命令7.4 其他命令8.Docker镜像详解8.1 什么是镜像8.2 Docker镜像加载原理8.3 镜像中的分层8.4 提交镜像9.容器数据卷9.1 数据卷使用方式9.2 安装Mysql 挂载数据9.3 具名和匿名挂载9.4 数据卷容器10.DockerFile10.1 Dockerfile构建过程10
2022-04-07 11:26:56
2668
1
原创 Flink 任务提交与执行流程
JobGrap的接受与运行上文我们讲解了客户端将用户代码最终转化为JobGrap之后,通过Dispatcher的网关将JobGrap提交给Dispatcher。之后Dispatcher通过JobManagerRunnerFactory工厂类创建JobManagerRunner实例,最终调用JobManagerRunner实例启动JobManager服务。JobManager服务的底层主要通过JobMaster实现的,负责整个作业的生命周期和Task调度工作。JobGrap提交整体流程flink客户端
2022-01-17 11:17:51
2142
1
原创 Flink状态管理
KeyedState的管理KeyState通过KeyedStateBackend进行创建和管理,Flink提供了基于JVM堆内存和RocksDB实现的KeyedStateBackend。KeyedStateBackend不仅提供了创建KeyedState的功能,也实现SnapshotStrategy接口,对KeyedStateBackend中的状态数据进行快照,实现状态数据的持久化。在Task初始化时,每个Task实例初始化的过程中都会创建一个StateBackend,用于管理状态和Checkpoint
2022-01-12 11:26:06
955
原创 Flink Checkpoint机制剖析(源码剖析)
Checkpoint整体设计Checkpoint执行过程分为:启动、执行以及确认完成三个阶段。CheckpointCoordinator控制Checkpoint执行:JM端的CheckpointCoordinator组件会周期性的向数据源发送执行CK的请求,数据源节点将数据源消费的offset发送给JM,存储到CK的元数据信息中。同时向下广播barrier。中间算子对齐barrier:中间算子在StreamTaskNetworkInput组件中读取数据并对齐各个channel的barrier。bar
2022-01-11 14:44:19
1668
1
原创 java8 CompletableFuture异步编程
概述CompletableFuture是java8引入的新类,该类实现了 Future 接口和 CompletionStage 接口。在许多框架内部的网络通信中被大量使用,因此本文对CompletableFuture进行了归纳总结。CompletableFuture实现了Future 和 CompletionStage 接口,封装了future、forkjoin相关类来执行异步,所以还是可以通过get(阻塞)或轮训获取结果,但是不推荐CompletionStage 接口代表异步计算中的 不同阶段,以
2022-01-10 16:28:35
395
原创 flink的反压机制(源码剖析)
背景在前文我们对flink早期基于TCP的反压和现在基于信任值的反压机制进行了剖析 Flink反压机制剖析,本文主要从源码的角度对flink基于Credit&BackLog的反压机制从源码的角度剖析其具体实现过程。基于TCP反压的问题TaskManager之间会启动一个TCP通道进行数据交互,TaskManager的所有Task通过多路复用使用同一个TCP通道。因此,当下游因一个Task处理能力不足造成反压时,就会导致整个TCP通道阻塞。即使其他Task还有空余的Buffer也无法接受数据
2022-01-07 11:01:01
1262
原创 flink的内存管理
背景之前我们介绍了flink中task的运行机制,以及数据在task线程内部以及不同TaskManager之间的流转过程。其中,网络传输Buffer数据以及task接收Buffer数据都会申请对应的Segment内存段,其中涉及堆内和堆外内存。这里我们从NetworkBuffer资源管理、flink的内存模型和MemorySegment具体分析一下flink中的内存管理机制。NetworkBuffer资源管理之前我们介绍了flink中网络传输数据是通过NetworkBuffer的数据结构作为字节容器,
2022-01-04 17:57:25
2668
原创 flink中的网络数据传输流程
背景本文紧接上文StreamTask数据流,上文我们讲解了每个executor中的task中的数据是如何进行读取转换写出的过程。本文我们将讲解executor之间的数据传输流程,既包括flink的shuffle实现,以及StreamTask中InputChannel和ResultSubPartition的读写数据细节。...
2021-12-28 19:38:37
1771
原创 StreamTask数据流
背景本文紧接上篇,将介绍在Task现场启动之后,数据是如何从网络中读取转换处理的。本文主要从源码角度一步步分析StreamTask中数据流转过程,其中涉及到上下游netty的交互、数据的反压和checkpoint机制会在接下来的篇章详细讲解。StreamTask整体数据流StreamTask有多种实现,本文主要以OneInputStreamTask为例进行介绍。public abstract class StreamTask<OUT, OP extends StreamOperator<
2021-12-22 18:53:28
1048
原创 flink任务执行流程剖析
背景本文主要从源码角度对flink底层是如何将task分配到各个taskExecutor上执行,以及task执行的线程模型进行分析。会涉及到jobmaster如何将task分发到taskExecutor中,以及taskExecutor执行task的详细过程,以及task的mailBox线程模型。JobMaster部署task TM启动Task线程jobmaster主要通过以及分配的slot,获取到slot对应的taskmanager网管,然后提交task。TaskExecutor创建并启动Task线
2021-12-21 19:13:25
1687
原创 flink网络通信剖析(组件rpc通信)并基于akka实现rpc框架
背景最近阅读了flink 1.10版本网络通信部分的相关源码,网络部分主要有两块:组件之间的rpc调用(akka)taskManager之间的数据传输(netty实现)本文主要解析flink底层是如何使用akka封装的rpc,并模仿flink的设计方式,基于akka实现一个简单的rpc通信框架。组件RPC通信架构flink底层的rpc调用主要分为RpcEndPoint、RpcService、RpcServer、GateWay三个模块。RpcEndPoint:每个组件的基本实现,主要包含
2021-12-20 20:28:23
1532
1
原创 动态代理实现AOP
/** * 1、创建代理工厂(通过动态代理的方式实现AOP) * 2、给工厂设置目标对象、前置增强、后置增强 * 3、调用creatProxy()得到代理对象 */public class ProxyFactory { private Object targetObject;//代理对象 private AfterActive afterActive;//后置增强器 private BeforeActive beforeActive;//前置增强器 public
2021-10-11 15:29:26
194
原创 Flink Keyed State & Operator State
Keyed State和Operator StateKeyed State是KeyedStream上的状态。假如输入流按照id为Key进行了keyBy分组,形成一个KeyedStream,数据流中所有id为1的数据共享一个状态,可以访问和更新这个状态,以此类推,每个Key对应一个自己的状态。下图展示了Keyed State,因为一个算子子任务可以处理一到多个Key,算子子任务1处理了两种Key,两种Key分别对应自己的状态。Operator State可以用在所有算子上,每个算子子任务或者说每个算子实例
2021-07-27 08:48:46
524
原创 Clickhouse数据实时去重
ck中去重主要是借助ReplacingMeregeTree引擎,它能够在合并part的时候将主键(既排序键)相同的记录只保留一条,但是使用的过程中存在两个问题:数据是在分区part合并的时候去重的,所以要实现全局去重,必须保证主键相同的记录在一个节点同一个分区上。ReplacingMergeTree引擎的merge是后台线程不定期触发执行的,时机是不可控的,所以并不能保证多久后不会出现重复数据,正对实时实时性高的用户不瞒住需求。目前三种解决方案方案一:ReplacingMergeTree+定时脚
2021-06-24 11:30:04
7778
原创 ClickHouse基于全局字典与物化视图的精确去重方案
clickhouse具有bitmap, 但只支持int, 实测表明groupBitmap()这个agg比直接的count(distinct x)计算要快至少一倍以上, 按之前druid中的测试经验表明, 全局字典编码后的bitmap的查询性能也远远比普通bitmap好。通过物化视图对bitmap构建groupBitmapState的中间存储状态, 通过预计算bitmap的并集能减少查询的开销。 并且物化视图的行数远比原始表行数少, 除了bitmap以外的sum/max/min/avg等计算耗时也呈倍数
2021-06-13 12:18:27
1416
原创 ClickHouse 物化视图
视图与物化视图官网链接普通视图是一种sql的简单转化, 本质上与直接查底层的表一样物化视图可以理解为insert语句的触发器, 是一张独立的表,通过物化视图可以实现cube语法 :CREATE MATERIALIZED VIEW AS SELECT …举例, 预聚合max值和countdistinct值(基于bitmap)CREATE MATERIALIZED VIEW atsplch_rpt.ads_screen_unique_indicator_view_local on cluster c
2021-06-08 15:07:07
983
原创 ClickHouse 实践
一 、多表关联查询适用场景需要数据明细表关联其他表进行查询,如用户订单表关联营销活动-用户表,过滤参加某个活动的用户的订单信息。一般适用于明细表数据较多,1、关联的小表过滤后数据量小于一亿条的场景。注意:单纯的维度表,比如城市维度表,不需要做多表关联,直接明细表写入时写宽表,维度基数不大于一万可以用 LowCardinality 类型。 一般只有和明细表是多对多的关系,才需要使用关联查询。用法1.in子查询如果需求是从小表过滤出某个id列表字段在明细表中做过滤,优先使用in子查询,官方wiki
2021-06-08 14:50:39
499
原创 Flink AsyncIO实现
部分数据库客户端不支持一步IO,通用的方法是通过线程池实现package com.didichuxing.streaming.flink;import org.apache.flink.api.java.tuple.Tuple2;import org.apache.flink.configuration.Configuration;import org.apache.flink.streaming.api.datastream.AsyncDataStream;import org.apache.
2021-06-06 20:34:27
171
1
原创 Flink Mailbox模型
Flink在1.10版本中完成了对StreamTask的运行机制进行了重构,引入了Mailbox机制。本文对这次改动做了哪些修改,以及对比之前的实现有哪些好处进行一些简要的介绍。Flink处理模型Flink将任务代码转换为DAG后,每个节点有各自的并发度p,节点间依靠网络传输消息。每个Task的每个并发都是独立的线程,可以简单的理解为class Task implements Runnable { public void run() { while(true) {
2021-06-05 11:15:56
831
原创 Druid
Druid是什么Druid是是个内存数据库也是一个时序数据库,是一个分布式内存实时分析系统,用于解决如何在大规模数据集下进行快速的、交互式的查询和分析的问题。数据可以实时摄入也可以批量摄入,进入到Druid后立即可查,同时数据是几乎是不可变。优点:列式存储,支持的数据规模大(本地存储+DeepStorage–HDFS),以segment为单位,每个segment内列式存储,并可以对每列建立索引。采用LSM-Tree结构,有极高的写入性能, 同时实现了实时数据在亚秒级的可视化列式存储,
2021-06-02 12:35:01
331
原创 BitMap的原理和应用
BitMap的使用场景bitmap一般用作大数据的去重,过滤,排序,以及用户画像中。BloomFilter使用bitmap进行数据过滤以及近似去重,用户画像中使用bitmap记录一个标签对应的人群(bitmap可以很好的进行与或运算,快速计算出多个标签的人群)。bitmap可以高效的计算与和或运算但是bitmap不能进行非运算,可以通过对一个全量的bitmap进行异或(^)运算实现。####原理实现谷歌开源的EWAHCCompressBitMap实现了优化的bitmap。其对bitmap的空间
2021-05-21 11:49:08
816
原创 网络协议总结
网络分层应用层(http协议)、传输控制层(tcp、udp协议)、网络层(ip 路由器)、数据链路层(arp协议 交换机)、物理层TCP三次握手四次挥手三次握手:两端A-B通过tcp通信,A先向B端发送一个syn请求报文(第一次握手),B端收到后为这次连接分配响应的资源;然后向A端发送一个syn请求报文和一个ack响应报文(第二次握手);A端收到B端的响应后也想B发送一个ack响应报文,并分配响应的资源(第三次握手)。如此通信建立完成。四次挥手:A端要和B端断开连接,A端先向B端发送一个fin报文
2020-12-23 11:03:21
163
原创 python镜像地址
python包下载https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxmlpython镜像库pip install --upgrade tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simplepip install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
2020-12-23 11:02:02
394
原创 线程&线程池
启动线程的三种方式:1.通过实现Thread类的run方法 2.实现runnable接口 3.Executors.newCachedThread 通过线程池线程状态
2020-12-23 10:43:23
140
原创 Flink
flink与spark的差异最显著的区别就是flink是标准的实时处理引擎,基于事件驱动。而spark streaming是微批次的模型。架构上的区别主要如下:1)、架构模型上SparkStreaming在运行时的主要组件包括Master、Worker、Driver、Executor;Flink运行时主要包括:JobManager、TaskManager和Slot。2)、任务调度上SparkStreaming是连续独断的产生微批次,由DAGScheduler划分stage,然后交由TaskSched
2020-12-23 09:08:39
386
1
原创 HBASE
Hase定义分布式的实时查询的数据库。Hbase架构Hbase整体架构由Hmaster、RegionServer、ZooKeeper组成。ZK负责管理Hbase集群的HA以及存储元数据1、HMaster负责为RegionServer分配region,以及RegionServer的负载均衡(Region Split之后两个region开始在同一个regionServer中,之后会有Hmaster重新分配Region),管理用户对table的增删改操作,所以master挂掉之后,依然可以进行数据的增
2020-12-14 21:18:31
316
原创 Redis
redis的value具有类型且有一些本地方法,所以相比memcached可以调用本地方法,移动计算不用移动数据。redis的value有类型且有操作方法,所以可以将redis的数据类型作为集合操作,将java的操作移动到redis,实现java无状态。Redis是单线程的,5.0之后worker线程时单线程的;但是io线程可以多线程的五大数据类型1、String可以存字符串,进行数值计算,还可以存二进制位 bitmap(setbit),进行二进制计算(bitop),统计二进制数(bitcount
2020-12-14 13:58:29
133
原创 NIO&EPOLL&多路复用
非阻塞IO(NIO)socket通信底层流程:server端开启一个对外暴露的端口,并生成对应的文件描述符(fd3),通过系统调用listen(fd3)监听该文件描述符。当client与server端建立socket通信之后,在对应进程文件(/proc/3209)下的fd文件夹中生产对应的文件描述符fd5(通信通过文件描述符进行),该进程生产的子线程在task文件夹。socket连接之后产生对应的文件描述符(fd5),通信建立,之后系统调用recvfrom(fd5)开始监听文件描述符5,如果这时list
2020-12-01 18:43:38
204
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人