自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 页面单跳转换率统计案例分析

接下来统计每个页面的被查看的次数,也就是分母,actionDateRDD里面封装的是一个个UserVisitAction对象,运用filter转换算子过滤出List所包含的页面,再用map转换算子将一个UserVisitAction对象转换成(action.page_id, 1L),便于后续的reduceByKey作统计,而toMap方法是将RDD中的数据转换为一个Map对象,需要将所有的数据收集到Driver端,并在Driver端构建Map对象。

2024-02-05 22:58:58 1058

原创 RDD 依赖关系

宽依赖表示同一个父(上游)RDD的Partition被多个子(下游)RDD的Partition依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生。窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用, 窄依赖我们形象的比喻为独生子女。RDD不会保存数据的,RDD为了提供容错性,需要将RDD间的关系保存下来,一旦出现错误,可以根据血缘关采将数据源重新读取进行计算。这里所谓的依赖关系,其实就是两个相邻 RDD 之间的关系。

2024-02-02 17:40:14 424

原创 转换算子小案例

1) 数据准备 agent.log:时间戳,省份,城市,用户,广告,中间字段使用空格分隔。2) 需求描述 统计出每一个省份每个广告被点击数量排行的 Top33) 需求分析4) 功能实现。

2024-02-01 12:33:37 410

原创 Spark 运行架构

Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master, 负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。

2024-01-06 15:36:13 1360

原创 电商数仓项目----笔记七(数仓DIM层)

所谓的维度层其实就是分析数据的角度,维度层保存的表其实是分析数据的角度,比如:--性别,年龄,品牌,品类这层的表主要用于统计分析,因此DIM层的数据存储格式为orc列式存储+snappy压缩(时间短)

2023-12-24 17:30:47 1100

原创 电商数仓项目----笔记六(数仓ODS层)

ODS层的设计要点如下:(1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。(2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比较高的,(3)ODS层表名的命名规范为:ods_表名_单分区增量全量标识(inc/full)。同样的,需要将用户行为数据表和业务数据表放到ODS层。

2023-12-22 22:24:24 1007

原创 电商数仓项目----笔记五(数仓架构和建模)

ODS:数据源 DWD:加工数据 DWS:统计数据 ADS:分析数据DIM: 维度层(大家都有可能用得上的部分)数据仓库之父Bill Inmon提出的建模方法是从全企业的高度,用实体关系(Entity Relationship,ER)模型来描述企业业务,并用规范化的方式表示出来,在范式理论上符合3NF。实体关系模型将复杂的数据抽象为两个概念——实体和关系。

2023-12-21 17:51:38 410

原创 Hive执行计划

先看第一部分 stage dependencies ,包含两个 stage,Stage-1 是根stage,说明这是开始的stage,Stage-0 依赖 Stage-1,Stage-1执行完成后执行Stage-0。以上仅列举了4个我们生产中既熟悉又有点迷糊的例子,explain 还有很多其他的用途,如查看stage的依赖情况、hive 调优等,小伙伴们可以自行尝试。Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等。Statistics:表统计信息,包含表中数据条数,数据大小等。

2023-12-21 14:55:47 1482

原创 生产经验——分区的分配以及再平衡

1 号消费者:消费到 0、2、4、6 号分区数据 2 号消费者:消费到 1、3、5 号分区数据 说明:消费者 0 已经被踢出消费者组,所以重新按照 RoundRobin 方式分配。发现1处理:2,5,3发现2处理:1,4,0,6。此时做一个破坏性实验,把消费者1干掉,我们发现,前45s, 消费者2和消费者3正常接收数据,而45s后,认为消费者1退出消费者组,因此消费者1的数据会给整体给别人接受。如果此时再发送一波数据,那么消费者2消费0,1,2,3分区的数据,消费者3消费4,5,6分区的数据。

2023-12-21 12:20:30 372

原创 Kafka消费者组

左侧为Kafka集群,右侧为消费者组,消费者创建网络连接客户端,消费者组调用sendFetches,抓取数据,同时还会准备两个参数,Fetch.min.bytes:每批次最小抓取大小,默认1字节,fetch.max.wait.ms一批数据最小值未达到的超时时间,默认500ms,任一条件满足,都会拉取数据;7、每个消费者都会和coordinator保持心跳(默认3s),一旦超时 (session.timeout.ms=45s),该消费者会被移除,并触发再平衡;5、把消费方案发给coordinator;

2023-12-20 17:29:58 1253

原创 Kafka为什么能高效读写数据

当读操作发生时,先从PageCache中查找,如果找不到,再去磁盘中读取。Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端, 为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。Kafka Broker应用层不关心存储的数据,所以就不用 走应用层,传输效率高。1)Kafka 本身是分布式集群,可以采用分区技术,并行度高(生产消费方并行度高);

2023-12-19 20:56:55 656

原创 kafka文件存储机制

Topic分为好几个partition分区,每个分区对应于一个log文件,log文件其实是虚的,Kafka采取了分片和索引机制, 将每个partition分为多个segment(大小为1G)。每个segment包括:“.index”文件、“.log”文件和.timeindex等文件。这些文件位于一个文件夹下,该 文件夹的命名规则为:topic名称+分区序号,例如:first-0。index和log文件以当前 segment的第一条消息的offset命名。

2023-12-19 20:44:33 465

原创 HQL的其他优化

CBO是指Cost based Optimizer,即基于计算成本的优化。在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。,例如多表join的join顺序。

2023-12-19 14:43:57 413

原创 Kafka Broker总体工作流程

例如 ar[1,0,2], isr [1,0,2],那么leader 就会按照1,0,2的顺序轮询;7)集群应答,假设Leader挂了,Controller就能够监控到节点变化,从Zookeeper获取ISR,重新选举,选举规则一致,选举新的Leader之后,更新Zookeeper中的信息(Leader及ISR)。4) 假设现在选举出来Broker1为Leader,Controller将节点信息上传到ZK进行备份,告诉它我选了Broker1为Leader, isr 为[1,0,2],(图中的5);

2023-12-18 16:16:33 515

原创 Kafka 数据乱序

原因说明:因为在kafka1.x以后,启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据, 故无论如何,都可以保证最近5个request的数据都是有序的。按照幂等性的规则:<pid(求 producer id),Partition,SeqNumber>,前面发送1和2的时候,SeqNumber都匹配,发过来我就落盘,结果下一个是4,那么请求4这个数据就得在内存里面放着,不能进行落盘,继续收后面的请求,是5,继续放在内存,直到等到3,就会对这三个数据重新排序,再落盘。

2023-12-18 15:35:07 550

原创 Kafka中Ack应答级别和数据去重

Kafka 的事务一共有如下 5 个 API。

2023-12-18 15:18:10 616

原创 Kafka发送流程

首先我们要将外部数据导入到集群,首先在main线程中创建producer 对象,调用send方法发送数据,拦截器为可选项,通过序列化器对数据序列化,因为需要跨节点通讯,分区器会对每个数据进行分区,发送到指定分区;所谓的分区其实是一个缓存队列(双端队列),队列大小为32m,Batchsize为16k,Batchsize装满之后,或者lingerms时间到了,sender线程就来主动拉取数据;若应答成功,清理请求,清理分区(双端队列)里的数据,若没有成功,再不断地重试发送,直到成功。

2023-12-18 14:08:01 446

原创 Kafka 基础架构

所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者;Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;Follower:每个分区多个副本中的“从”副本,实时从Leader 中同步数据,保持和 Leader 数据的同步。Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数 据的对象都是 Leader;

2023-12-18 13:07:39 436

原创 HQL优化之数据倾斜

Map端负责读取join操作所需表的数据,并按照关联字段进行分区,通过Shuffle,将其发送到Reduce端,相同key的数据在Reduce端完成最终的Join操作。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。Skew-GroupBy的原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。

2023-12-16 15:22:37 442

原创 HiveSql语法优化四 :Bucket Map Join和Sort Merge Bucket Map Join优化

之前的map join适用场景是大表join小表的情况,但是两张表都相对较大,若采用普通的Map Join算法,则Map端需要较多的内存来缓存数据,当然可以选择为Map段分配更多的内存,来保证任务运行成功。但是,Map端的内存不可能无上限的分配,所以当参与Join的表数据量均过大时,就可以考虑采用Bucket Map Join算法。需要注意的是,Bucket Map Join的执行计划的基本信息和普通的Map Join无异,若想看到差异,可执行如下语句,查看执行计划的详细信息。

2023-12-16 14:37:56 862

原创 HiveSql语法优化三 :join优化

前面提到过:Hive拥有多种join算法,包括Common Join,Map Join,Bucket Map Join,Sort Merge Buckt Map Join等;每种join算法都有对应的优化方案。

2023-12-16 14:12:21 1224 1

原创 HiveSql语法优化一 :分组聚合优化

第二个参数reduction是指在聚合前判断该表是否适合map端聚合,它会先对若干条数据进行map-side聚合,若聚合后的条数和聚合前的条数比值小于该值,则认为该表适合进行map-side聚合;,利用其完成部分的聚合,然后将部分聚合的结果,按照分组字段分区,发送至reduce端,完成最终的聚合。第四个参数是map-side聚合所用的hash table,占用map task堆内存的最大比例,若超出该值,则会对hash table进行一次flush。所谓map-side聚合,Map端负责读取数据,并。

2023-12-14 20:06:42 555 1

原创 HiveSql语法优化二 :join算法

SMB Map Join同Bucket Map Join一样,同样是利用两表各分桶之间的关联关系,在分桶之间进行join操作,不同的是,分桶之间的join操作的实现原理。SMB Map Join要求,参与join的表均为分桶表,且需保证分桶内的数据是有序的,且分桶字段、排序字段和关联字段为相同字段,且其中一张表的分桶数量是另外一张表分桶数量的整数倍。Bucket Map Join是对Map Join算法的改进,其打破了Map Join只适用于大表join小表的限制,可用于大表join大表的场景。

2023-12-13 20:14:44 1466 1

原创 YARN工作机制

yarnrunner提交三样东西,job.xml,job.split,jar包程序代码。MrAppMaster看到计算完成,再次跟ResourceManager申请开启reduceTask, 同样的,NodeManager领走任务之后先创建Container容器,在Container内部运行reduceTask。同样的,NodeManager领走任务之后先创建Container容器,把cpu,ram,jar包拷贝过来,之后由MrAppMaster启动Maptask,开始运行。

2023-12-11 18:02:34 314 1

原创 Hadoop中Join案例

这种方式中,join合并的操作是在Reduce阶段完成,这么多订单表汇总到Reduce端,Reduce端的处理压力太大,Map节点的运算负载则很低,默认情况下切片大小为128m,一个maptask只处理128m的数据,资源利用率不高,且在Reduce阶段极易产生数据倾斜。总结:MapJoinMapper方法中先读取先文件加载进缓存,建立映射关系,随后map方法中读取一行一行的数据,直接封装text,其中需要join的pid列从缓存中获取对应的pname ,直接输出,省去了reducejoin。

2023-12-06 17:06:00 945 1

原创 B+树索引(二)

由于我们只查询key1列和id值,所以在使用idx_key1索引来扫描('a','c')区间中的二级索引记录时,可以直接从获取到的二级索引记录中读取到key1列和id值,无需回表操作。索引列的数据类型越小,索引占用的存储空间就越小,在一个数据页就可以存放更多的记录,磁盘I/O带来的性能损耗就越小,读写效率就越高。如果某个列中不重复值的个数占用比例太低,如果为该列创建索引,那么在通过二级索引+回表的方式,就有可能执行太多次回表操作。第一个语句不执行索引,第二个语句执行索引。

2023-12-05 11:29:20 390

原创 B+树索引(一)

InnoDB存储引擎会自动为主键建立聚簇索引,聚簇索引的叶子节点包含完整的用户记录;还有对应的索引称为二级索引,若想要通过二级索引查找完整的用户记录,则需要进行回表操作。通过索引查找记录时,都是自上而下查找的,每个页面中的记录都被划分为很多组,每个组中索引列值最大的记录在页内的偏移量会被当作槽记录在页目录中。因此可以在页目录中使用二分法快速定位到索引列等于某个值的记录。聚簇索引图:二级索引图:图中叶子节点之间我画了单向链表,但是实际上是双向链表。

2023-12-04 16:29:21 938

原创 MapReduce 工作流程

对待处理的文件进行切片分析,0-128一片,128-200第二片,客户端还会准备三样东西:job的切片信息,jar包以及xml配置文件。客户端向yarn提交,yarn会开启MrappMaster,MrappMaster会读取这三个信息。yarn会根据你的切片个数,对应地开启maptask的个数。maptask开始工作,开启Inputformat,Inputformat用recordreader方法按行读取里面的内容,读完之后直接给mapper,mapper里面是用户自己写的业务逻辑。

2023-11-30 15:45:23 320

原创 Shuffle机制

标记好分区之后进入环形缓冲区,默尔大小100m,环形缓冲区左侧存索引,右侧存数据。在溢写之前,他还要对数据进行排序,排序的手段是快排,对key的索引排,按照字典顺序排。reduce端来拉取自己指定分区的数据,拉过来之后会先放到内存上,内存不够再放到磁盘上。不管是内存中的数据还是磁盘上的数据,最终都需要进行一次归并排序,然后按照相同的 key分组,key相同的进入到同一个reduce的方法。溢写的时候会产生两个文件,一个是一个是溢写的index索引文件,一个是溢写的真正的文件。然后再对数据进行归并排序。

2023-11-30 13:07:39 355

原创 电商数仓项目----笔记四(业务数据同步)

业务数据是数据仓库的重要数据来源,我们需要每日定时从业务数据库中抽取数据,传输到数据仓库中,之后再对数据进行分析统计。为保证统计结果的正确性,需要保证数据仓库中的数据与业务数据库是同步的,离线数仓的计算周期通常为天,所以数据同步周期也通常为天,即每天同步一次即可。业务数据的同步稍微麻烦,因为业务数据要分为全量同步和增量同步。全量同步,就是每天都将业务数据库中的全部数据同步一份到数据仓库,这是保证两侧数据同步的最简单的方式。增量同步,就是每天只将业务数据中的新增及变化数据同步到数据仓库。

2023-11-29 17:09:51 893 1

原创 电商数仓项目----笔记三(用户行为数据同步)

在前面的笔记一和笔记二中,我们已经分别将用户行为数据和业务数据采集到kafka中了:在实时数仓中,由于Flink会从kafka中读取数据,也无需我们再同步数据了,因此同步数据是我们离线数仓的事。

2023-11-27 16:45:41 893

原创 select, where, on, group by...到底哪个先执行?

【代码】select, where, on, group by...到底哪个先执行?

2023-11-27 15:37:15 427

原创 电商数仓项目----笔记二(业务数据的采集)

Maxwell的工作原理是实时读取MySQL数据库的二进制日志(Binlog),从中获取变更数据,再将变更数据以JSON格式发送至Kafka等流处理平台。本项目共包含34张业务数据表,以订单表、用户表、SKU商品表、活动表和优惠券表为中心,延伸出了优惠券领用表、支付流水表、活动订单表、订单详情表、订单状态表、商品评论表、编码字典表退单表、SPU商品表等。(3)Slave从库读取并回放中继日志中的事件,将改变的数据同步到自己的数据库。活动商品是多对多的关系,一个商品对应多个活动,一个活动也包含多个商品。

2023-11-26 11:08:44 826 1

原创 电商数仓项目----笔记一(用户数据的采集)

数据仓库( Data Warehouse ),是为企业制定决策,提供数据支持的。可以帮助企业,改进业务流程、提高产品质量等。和等;比如用户在电商网站中登录、下单、支付等过程中,需要和网站后台数据库进行增删改查交互,产生的数据就是业务数据通常存储在MySQL、Oracle等数据库中。:用户在使用产品过程中,通过埋点收集与客户端产品交互过程中产生的数据,并发往日志服务器进行保存。用户行为数据通常存储在日志文件中。

2023-11-25 12:06:25 998

原创 NameNode和SecondaryNameNode

但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。

2023-11-19 18:42:10 28

原创 HDFS读写数据流程

HDFS写数据流程客户端准备把ss.avi传入集群上,客户端首先自己创建一个HDFS客户端,类型为Distributed FileSystem客户端,然后对nameNode进行请求传送到指定路径; NameNode检查权限,检查目录是否存在; NameNode返回是否可以上传; HDFS客户端请求上传第一个block,让NameNode给它返回一个DataNode; NameNode给它返回3个节点:dn1、dn2、dn3; 客户端通过FSDataOutputStream模块请求dn1上传

2023-11-19 16:17:45 33

原创 InnoDB数据页结构

InnoDB数据页存储空间划分为7个部分,有些占用字节数确定,有些不确定。当我们插入记录的时候,记录主要是插入在User Records部分。更具体地说,是每当插入一条记录时,都会从Free Space中申请一个记录大小的空间,将这个空间划分到User Records中,如果Free Space用完了,也就意味着这个大小16KB的页也就用完了。

2023-11-18 16:13:42 41

原创 多线程飞机大战

本项目飞行物主要有BgObj(背景类),BulletObj(我方子弹类),Enemy1Obj(敌方小飞机类),Enemy2Obj(敌方大飞机类),Enemy2BulletObj(敌方大飞机子弹类)这几个类,还包括ExplodeObj(爆炸效果类)。当自身getRect()和子弹产生交集的时候,就会实例化爆炸对象explodeobj,位置定位为敌方大飞机的位置,再分别加入ExplodeObjList和RemoveList集合中去,到时候从集合中取出所有元素时便能产生爆炸效果。

2023-08-05 12:03:26 91 1

原创 多线程和锁

然后,将实现了Runnable接口的对象作为参数传递给Thread类的构造函数,并通过调用start方法来启动线程。同步与锁:那么在多线程编程中,多个线程可能会同时访问共享的数据或资源,这可能导致竞态条件和线程安全问题。为了避免这种情况,可以使用同步机制,如synchronized关键字或Lock接口,来保护共享资源,确保线程之间的安全访问。然后,通过调用start方法来启动线程,使其执行run方法中的任务。多线程是指在一个程序中同时运行多个线程,每个线程独立执行不同的任务,从而实现并行处理。

2023-07-26 17:09:26 40 1

原创 Java美颜相机

String[] name = {"马赛克","灰度图","原图","左转90度","右转90度","二值化","哈哈镜"," 卷积","打开摄像头","摄像头哈哈镜","摄像头灰度","摄像头二值"};String[] name = {"马赛克","灰度图","原图","左转90度","右转90度","二值化","哈哈镜","卷积","打开摄像头","摄像头哈哈镜",首先我们要画出一个基本的UI界面,创建一个继承JPanel的PixelUI类,在写具体方法接口时,我们现在主函数new出对象,防止忘记;

2023-07-23 11:59:42 102 2

空空如也

空空如也

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

TA关注的人

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