![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码
文章平均质量分 54
大数据面壁者
大数据相关知识分享,框架底层原理机制,生产学习中遇到的相关问题分享,共同学习,共同进步。
展开
-
DWS层:商品行为关键词主题宽表
DWS层:商品行为关键词主题宽表从商品主题获得,商品关键词与点击次数、订单次数、添加购物次数的统计表。重构DWSProductStatsApp重构DWSProductStatsApp, 增加最终的数据到Kafka的代码(因为flink没有直接读取clickhousse的方法,借助kafka中转)private void sink2Kafka(SingleOutputStreamOperator<ProductStats> resultStream) { resultStream.原创 2021-03-26 19:58:40 · 533 阅读 · 0 评论 -
拉链表的制作案例
拉链表的制作作用:主要处理缓慢变化维的业务场景。(用户表、订单表)简洁版,比较难理解,节省了两张临时表,适用于维度表,数据量不大的情况。INSERT overwrite table dwd_dim_user_info_his --数据分两批导入到dwd_dim_user_his--第一批: old + 更新需要变化的old的数据SELECT --左表和右边关联后,右表中为NULL的是不需要更新的数据,否则且左表的end_date为9999-99-99,需要将次字段更新 old.id, o原创 2021-03-26 08:48:39 · 543 阅读 · 4 评论 -
Flink自定义函数(自定义分词函数UDTF)
Flink自定义函数概述自定义函数(UDF)是一种扩展开发机制,可以用来在查询语句里调用难以用其他方式表达的频繁使用或自定义的逻辑。函数分类:Scalar functions类似于spark的udfTable functions类似于 spark的udtfAggregate functions类似于spark的udafTable aggregate functionsAsync table functins自定义Table Function实现分词功能一个词条包括多个词语所以分词原创 2021-03-24 21:19:12 · 1395 阅读 · 0 评论 -
DWS层:商品主题宽表处理并写入ClickHouse
DWS层:商品主题宽表处理与访客的dws层的宽表类似,也是把多个事实表的明细数据汇总起来组合成宽表1. 需求分析与思路从Kafka主题中获得数据流把Json字符串数据流转换为统一数据对象的数据流把统一的数据结构流合并为一个流flink多流join使用connect方法,前提是必须是相同类型的数据流,所有需要先封装主题宽表的bean对象,后续进行补充维度信息,分组聚合去重。设定事件时间与水位线分组、开窗、聚合写入ClickHouse2. 功能实现2.1 封装商品统计实体类Pro原创 2021-03-24 21:10:00 · 1987 阅读 · 2 评论 -
使用FlinkSQL将数据写入到ClickHouse
使用FlinkSQL将地区主题数据写入到ClickHouse一、需求分析与思路定义Table流环境把数据源定义为动态表通过SQL查询出结果表把结果表转换为数据流把数据流写入目标数据库如果是Flink官方支持的数据库,也可以直接把目标数据表定义为动态表,用insert into 写入。由于ClickHouse目前官方没有支持的jdbc连接器(目前支持Mysql、 PostgreSQL、Derby)。阿里云有实现好的connector, 我们使用这个connector.参考地址: https原创 2021-03-24 20:53:49 · 9858 阅读 · 15 评论 -
使用flink将数据流写入到Clickhouse的工具类
使用flink将数据流写入到Clickhousepackage com.gmall.realtime.util;import com.gmall.realtime.bean.VisitorStats;import org.apache.flink.connector.jdbc.JdbcConnectionOptions;import org.apache.flink.connector.jdbc.JdbcSink;import org.apache.flink.connector.jdbc.Jd原创 2021-03-23 21:06:16 · 1256 阅读 · 0 评论 -
Flink实时数仓DWM层: 跳出明细
DWM层: 跳出明细1. 需求分析与思路1.1 什么是跳出跳出就是用户成功访问了网站的入口页面(例如首页)后就退出,不再继续访问网站的其它页面。跳出率计算公式:跳出率=访问一个页面后离开网站的次数 / 总访问次数观察关键词的跳出率就可以得知用户对网站内容的认可,或者说你的网站是否对用户有吸引力。而网站的内容是否能够对用户有所帮助留住用户也直接可以在跳出率中看出来,所以跳出率是衡量网站内容质量的重要标准。关注跳出率,可以看出引流过来的访客是否能很快的被吸引,渠道引流过来的用户之间的质量对比,对于原创 2021-03-17 20:15:42 · 777 阅读 · 0 评论 -
Flink数据写入Hbase与Kafka
Flink数据写入Hbase与KafkaSink到Hbase导入Phoenix相关依赖<dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>5.0.0-HBase-2.0</version></dependency><dependen原创 2021-03-16 21:10:31 · 797 阅读 · 0 评论 -
使用Flink SQL CDC读取动态配置表
Flink SQL CDC 介绍CDC 全称是Change Data Capture ,它是一个比较广义的概念,只要能捕获变更的数据,我们都可以称为 CDC 。业界主要有基于查询的 CDC 和基于日志的 CDC ,可以从下面表格对比他们功能和差异点。传统的数据同步场景 :缺点: 采集端组件过多导致维护繁杂改进后的架构:Flink社区开发了 flink-cdc-connectors 组件,这是一个可以直接从 MySQL、PostgreSQL 等数据库直接读取全量数据和增量变更数据的 sourc原创 2021-03-15 20:43:39 · 3224 阅读 · 0 评论 -
实时数仓使用Flink识别新老客户
识别新老客户识别新老客户本身客户端业务有新老用户的标识,但是不够准确,需要用实时计算再次确认(不涉及业务操作,只是单纯的做个状态确认)。数据拆分不同数据写入Kafka不同的Topic中1. 封装kafka工具类public class MyKafkaUtil { static Properties props = new Properties(); static { props.setProperty("bootstrap.servers","hadoop原创 2021-03-15 20:19:57 · 1079 阅读 · 0 评论 -
Flink海量数据实时去重
Flink海量数据实时去重方案1: 借助redis的Set具体实现代码缺点需要频繁连接Redis如果数据量过大, 对redis的内存也是一种压力方案2: 使用Flink的MapState具体实现代码缺点如果数据量过大, 状态后端最好选择 RocksDBStateBackend如果数据量过大, 对存储也有一定压力方案3: 使用布隆过滤器布隆过滤器可以大大减少存储的数据的数据量优点不需要存储数据本身,只用比特表示,因此空间占用相对于传统方式有巨大的优势,并且能够保密数据;原创 2021-03-12 23:52:19 · 3283 阅读 · 1 评论 -
Flink双流join
Flink双流join目录Flink双流join1. Window Join滚动窗口Join滑动窗口Join会话窗口Join2. Interval Join在Flink中, 支持两种方式的流的Join: Window Join和Interval Join1. Window Join窗口join会join具有相同的key并且处于同一个窗口中的两个流的元素.注意:所有的窗口join都是inner join, 意味着a流中的元素如果在b流中没有对应的, 则a流中这个元素就不会处理(就是忽略掉了)原创 2021-03-12 23:46:48 · 909 阅读 · 0 评论 -
使用FlinkSql实现热门商品TOP N
使用FlinkSql实现热门商品TOP N目前仅 Blink 计划器支持 Top-N 。Flink 使用OVER 窗口条件和过滤条件相结合以进行 Top-N 查询。利用 OVER 窗口的 PARTITION BY 子句的功能,Flink 还支持逐组 Top-N 。 例如,每个类别中实时销量最高的前五种产品。批处理表和流处理表都支持基于SQL的 Top-N 查询。流处理模式需注意: TopN 查询的结果会带有更新。 Flink SQL 会根据排序键对输入的流进行排序;若 top N 的记录发生了变化,原创 2021-03-12 23:40:11 · 1262 阅读 · 0 评论 -
Flink CEP模式匹配编程
Flink CEP编程目录Flink CEP编程一、什么是FlinkCEP二、Flink CEP应用场景三、CEP开发基本步骤3.1 导入CEP相关依赖3.2 基本使用四、模式API4.1 单个模式单例模式循环模式条件4.2 组合模式(模式序列)严格连续松散连续非确定的松散连续4.3 模式知识补充循环模式的连续性循环模式的贪婪性模式可选性4.4 模式组4.5 超时数据4.6 匹配后跳过策略一、什么是FlinkCEPFlinkCEP(Complex event processing for Flink原创 2021-03-09 22:25:58 · 1191 阅读 · 0 评论 -
Flink流处理高阶编程实战
Flink流处理高阶编程实战一、基于埋点日志数据的网络流量统计1.1 指定时间范围内网站总浏览量(PV)的统计实现一个网站总浏览量的统计。我们可以设置滚动时间窗口,实时统计每小时内的网站PV。此前我们已经完成了该需求的流数据操作,当前需求是在之前的基础上增加了窗口信息public class P01_PV { public static void main(String[] args) { StreamExecutionEnvironment env = StreamEx原创 2021-03-09 21:30:02 · 305 阅读 · 0 评论 -
Flink流处理(开窗、水印、侧输出流)
Flink流处理高阶编程目录Flink流处理高阶编程一、Flink的window机制1.1 窗口概述1.2 窗口的分类1.2.1 基于时间的窗口1.2.2 基于元素个数的窗口1.3 Window Function二、Keyed vs Non-Keyed Windows三、Flik中的时间语义与WaterMark3.1 Flink中的时间语义3.1.1 处理时间(process time)3.1.2 事件时间(event time)3.2 哪种时间更重要3.3 Flink中的WaterMar原创 2021-03-05 21:28:26 · 3141 阅读 · 0 评论 -
Flink流处理核心编程实战
Flink流处理核心编程实战一、基于埋点日志数据的网络流量统计1.1 网站总浏览量(PV)的统计衡量网站流量一个最简单的指标,就是网站的页面浏览量(Page View,PV)。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一般来说,PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量,如同一个来访者通过不断的刷新页面,也可以制造出非常高的PV。接下来我们就用咱们之前学习的Flink算子来实现PV的统计用于封装数据的JavaBean类import lombok.原创 2021-03-04 14:25:00 · 422 阅读 · 1 评论 -
Flink流处理核心编程
Flink流处理核心编程和其他所有的计算框架一样,Llink也有一些基础的开发步骤以及基础,核心的API,从开发步骤的角度来讲,主要分为四大部分一、EnvironmentFlink Job在提交执行计算时,需要首先建立和Flink框架之间的联系,也就指的是当前的flink运行环境,只有获取了环境信息,才能将task调度到不同的taskManager执行。而这个环境对象的获取方式相对比较简单// 批处理环境ExecutionEnvironment benv = ExecutionEnvironm原创 2021-03-02 21:00:05 · 239 阅读 · 0 评论 -
Flink的有界流和无界流
Flink的两个小Demo一、创建maven项目POM文件中添加需要的依赖:<properties> <flink.version>1.12.0</flink.version> <java.version>1.8</java.version> <scala.binary.version>2.11</scala.binary.version> <slf4j.version>1.原创 2021-03-01 20:49:53 · 581 阅读 · 0 评论 -
尝试使用lambda简化flink代码报错
SingleOutputStreamOperator<String> wordStream = lineStream.flatMap( (value, out) -> { for (String s : value.split(" ")) { out.collect(s); } }) ;Exception in thread "main" org.apache.flink.api.comm.原创 2021-03-01 20:14:21 · 342 阅读 · 0 评论 -
Spark内核Shuffle流程及源码
Spark内核Shuffle流程及源码目录Spark内核Shuffle流程及源码一、Shuffle的原理和执行过程二、HashShuffle解析2.1 未优化的HashShuffle2.2 优化后的HashShuffle三、SortShuffle解析3.1 SortShuffle3.2 bypassShuffle四、Shuffle写磁盘4.1 shuffleWriterProcessor(写处理器)4.2 使用BypassShuffle条件4.3 使用SerializedShuffle条件4.4 使用Ba原创 2021-02-28 12:56:25 · 355 阅读 · 0 评论 -
Spark任务的执行源码
Spark任务的执行目录Spark任务的执行一、概述1.1 任务切分和任务调度原理1.2 本地化调度1.3 失败重试与黑名单机制二、阶段的划分三、任务的切分四、任务的调度4.1 提交任务4.2 FIFO和公平调度器4.3 读取任务4.4 FIFO和公平调度器规则4.5 发送给Executor端执行任务五、任务的执行一、概述1.1 任务切分和任务调度原理1.2 本地化调度任务分配原则:根据每个Task的优先位置,确定Task的Locality(本地化)级别,本地化一共有五种,优先级由高原创 2021-02-26 19:49:25 · 252 阅读 · 0 评论 -
Spark作业提交流程源码
Spark作业提交流程源码目录Spark作业提交流程源码一、环境准备及提交流程二、创建Yarn Client客户端并提交2.1 程序入口2.2 解析输入参数2.3 选择创建哪种类型的客户端2.4 Yarn客户端参数解析2.5 创建Yarn客户端2.6 Yarn客户端创建并启动ApplicationMaster三、ApplicationMaster任务3.1 解析传递过来的参数3.2 创建RMClient并启动Driver3.3 向RM注册AM3.4 获取RM返回可以资源列表3.5 根据可用资源创建NMCl原创 2021-02-26 19:22:20 · 523 阅读 · 0 评论 -
保存到ES的工具类
保存到ES的工具类import java.utilimport java.util.Objectsimport io.searchbox.client.{JestClient, JestClientFactory}import io.searchbox.client.config.HttpClientConfigimport io.searchbox.core.{Bulk, BulkResult, Index}import collection.JavaConversions._objec原创 2021-02-25 16:31:01 · 317 阅读 · 0 评论 -
ES_API操作
ES_API操作新建工程并导入依赖:<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.5</version></dependency><dependency> <groupId>org.原创 2021-02-25 15:43:10 · 536 阅读 · 0 评论 -
MySQL定义函数和存储过程
MySQL定义函数和存储过程-- 默认为off ,等价于 0 -- 开启binlog日志记录时,是否信任 创建函数 -- 默认情况下,为了防止主机和从机中定义的函数不一致,不允许用户自定义函数-- 如果希望自定义函数,必须将 log_bin_trust_function_creators=on(1)SHOW VARIABLES LIKE '%log_bin_trust_function_creators%'set global log_bin_trust_function_creators=1原创 2021-02-19 20:40:01 · 278 阅读 · 0 评论 -
使用canal实时读取mysql变更数据保存到kafka消息队列
使用canal实时读取mysql变更数据保存到kafka消息队列 订阅canal server中的binlog数据,之后解析后,以json格式发送到kafka! ① canal client 每次从canal server获取的数据会封装在一个Message对象中,一个Message对象包含了这次拉取的多条sql语句写操作 的结果! 每个Message中包含了一个 List<Entry> ②每个Entry代表一个sql语句影响的行, 包含了这个sql语句操作的表名,这个Ent原创 2021-02-19 20:04:14 · 832 阅读 · 3 评论 -
使用Spring创建接口发布实时日活数据
这里写自定义目录标题使用Spring创建接口发布实时日活数据一、日活数据查询接口相关要求1.1 访问路径1.2 要求数据格式二、搭建SpringWeb发布工程2.1 创建工程2.2 配置文件2.2.1 pom.xml2.2.2 application.properties三、 代码实现3.1 数据层3.1.1 数据层mapper3.1.2 封装每小时日活的方法类3.1.3 数据层 实现配置3.2 service层3.2.1 service层接口类3.2.2 service层实现类3.3 controller原创 2021-02-04 19:15:09 · 480 阅读 · 0 评论 -
在spring中创建kafak生产者
在spring中创建kafak生产者1. Spring中添加kafka的依赖 <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency>2. 配置文件中添加kafka的连接信息server.p原创 2021-02-02 21:09:26 · 284 阅读 · 0 评论 -
获取kafka和redis连接的工具类
1)PropertiesUtil 获取配置文件的工具类import java.io.InputStreamReaderimport java.util.Propertiesobject PropertiesUtil { def load(propertieName:String): Properties ={ val prop=new Properties() prop.load(new InputStreamReader(Thread.currentThread().g原创 2021-02-02 20:38:38 · 337 阅读 · 0 评论 -
实时日活数据分析
1. 代码思路1)消费Kafka中的数据;2)利用Redis过滤当日已经计入的日活设备;3)把每批次新增的当日日活信息保存到HBase中;4)从HBase中查询出数据,发布成数据接口,通可视化工程调用。2. 配置相关1)config.properties# Kafka配置kafka.broker.list=hadoop102:9092,hadoop103:9092,hadoop104:9092# Redis配置redis.host=hadoop102redis.port=63792原创 2021-02-02 20:35:01 · 1403 阅读 · 0 评论 -
使用SparkStreaming实现的三个实时需求
三个需求需求一:广告黑名单需求二:广告点击量实时统计需求三:最近一小时广告点击量一、构建基础类在基础类中封装三个需求都会用到的方法和属性。使用到的技术点:抽象类SparkStreaming应用上下文StreamingContext抽象控制构建流式应用的DStreamTransFormatpackage com.saprkstreaming.exec.appimport com.saprkstreaming.exec.bean.AdsInfoimport org.apac原创 2021-01-29 23:06:10 · 436 阅读 · 0 评论 -
常用工具类(使用scala编写)
常用工具类(使用scala编写)1.获取配置文件属性package com.saprkstreaming.exec.utilimport java.util.ResourceBundleobject PropertiesUtil { // 绑定配置文件 // ResourceBundle专门用于读取配置文件,所以读取时,不需要增加扩展名 // 国际化 = I18N => Properties val summer: ResourceBundle = Res原创 2021-01-29 22:39:40 · 700 阅读 · 0 评论 -
优雅关闭SparkStreaming程序
优雅关闭SparkStreaming的程序流式任务需要7*24小时执行,但是有时涉及到升级代码需要主动停止程序,但是分布式程序,没办法做到一个个进程去杀死,所有配置优雅的关闭就显得至关重要了。使用外部文件系统来控制内部程序关闭。大致思路如下:新启动一个线程检测hdfs上是否多出了一个目录,检测到后使用优雅的关闭方式,先停止采集数据,然后将已经采集到的数据计算完毕,然后关闭一切连接。 @Test def getclose():Unit={ streamingContext.star原创 2021-01-29 22:30:29 · 348 阅读 · 1 评论 -
SparkStreaming的DStream输出
SparkStreaming的DStream输出输出操作指定了对流数据经转化操作得到的数据所要执行的操作(例如把结果推入外部数据库或输出到屏幕上)。与RDD中的惰性求值类似,如果一个DStream及其派生出的DStream都没有被执行输出操作,那么这些DStream就都不会被求值。如果StreamingContext中没有设定输出操作,整个context就都不会启动。因为sparkstreaming为微批次处理,如果将计算结果输出为文件会产生大量小文件,所以一般会将计算结果保存到数据库。常用的算子只有p原创 2021-01-29 22:25:28 · 524 阅读 · 0 评论 -
SparkStreaming的DStream转换操作
SparkStreaming的DStream转换操作DStream上的操作与RDD的类似,分为Transformations(转换)和Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform()以及各种Window相关的原语。一、状态概述状态: state,指保存数据的对象有状态的操作:当前算子的运算需要依赖于上一次运算的结果 特征:需要保存每一个批次的运算结果!以便下一个批次使用无状态的操作:原创 2021-01-29 22:19:18 · 638 阅读 · 0 评论 -
使用SparkStreaming获取Kafka中的流式数据并指定手动提交offset
概述本篇文章主要有三个示例代码,第一个主要功能是使用sparkstreaming获取kafka中的流式数据,第二个主要解决自动提交偏移量的解决方法:指定检查点,第三个示例是使用手动提交的方式解决自动提交过程中可能出错的问题。还可以指定存储器实现精准一一致性,后续再补上!题外话:sparkstreaming毕竟不是真正的实时计算,底层原理是将数据流离散化为一个一个的微批次,在精准一致消费流式数据上远没有flink方便!!!所以sparkstreamign只建议使用在对实时性要求在秒级查询得场景!!!一、原创 2021-01-28 14:34:23 · 1885 阅读 · 0 评论 -
自定义SparkStreaming的接收器接收不同类型的数据源
自定义SparkStreaming的接收器接收不同类型的数据源步骤:1、自定义一个类,继承Receiverabstract class Receiver[T](val storeLevel: StorageLevel) extends Serializable [T]: Receiver中接收到的数据的类型 StoreLevel:存储级别,Reciver接收的数据怎么存,存哪里2、实现两个抽象方法 onStart(): 必须实现的方法! 会在原创 2021-01-28 11:06:58 · 168 阅读 · 0 评论 -
SparkStreaming编程与Queue测试流
一、StreamingContext如何创建?如何使用? 创建: ①基于SparkConf和Duration ②基于SparkContext和Duration ③基于masterurl,appname,和Duration 使用: ①构造StreamingContext对象 ②根据数据源,构造DStream ③对DStream进行各种转换(运算)原创 2021-01-27 10:04:31 · 311 阅读 · 0 评论 -
使用Java连接Redis进行操作
使用Java连接Redis进行操作一、pom依赖<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependency><dependency> <groupId>org.apache.comm原创 2021-01-26 20:37:09 · 271 阅读 · 0 评论